Чтобы использовать таблицы InnoDB в MySQL-Max-3.23, НЕОБХОДИМО задать
параметры конфигурации в разделе [mysqld]
файла конфигурации my.cnf
или
в файле параметров Windows my.ini
.
В версии 3.23 как минимум необходимо указать имя и размер файлов данных в
innodb_data_file_path
. Если вы не указали innodb_data_home_dir
в
my.cnf
по умолчанию эти файлы создаются в директории данных MySQL. Если
вы указали innodb_data_home_dir
как пустую строку, то вы должны указать
полный путь к вашим файлам данным в innodb_data_file_path
. В MySQL 4.0
не требуется задавать даже innodb_data_file_path
: по умолчанию для него
создается автоматически увеличивающийся файл размером в 10 Мб с именем
ibdata1
в каталоге datadir
MySQL. (в MySQL-4.0.0 и 4.0.1 размер
файла данных составляет 64 Мб и он не является автоматически увеличивающимся).
Если вы не хотите использовать InnoDB
таблицы, вы можете добавить опцию
skip-innodb
в конфигурационный файл MySQL.
Однако для того, чтобы получить высокую производительность, НЕОБХОДИМО явно задать параметры InnoDB, перечисленные в следующих примерах.
Начиная с версий 3.23.50 и 4.0.2 для InnoDB имеется возможность задавать
последний файл данных в innodb_data_file_path
как автоматически
увеличивающийся. В этом случае для innodb_data_file_path
используется
следующий синтаксис:
pathtodatafile:sizespecification;pathtodatafile:sizespecification;... ... ;pathtodatafile:sizespecification[:autoextend[:max:sizespecification]]
Если последний файл данных указан с параметром автоматического увеличения, то в случае нехватки места для табличной области InnoDB будет увеличивать последний файл данных; приращение файла каждый раз составляет 8 Мб. Например, синтаксис:
innodb_data_home_dir = innodb_data_file_path = /ibdata/ibdata1:100M:autoextend
указывает InnoDB создать один файл данных с начальным размером 100 Мб,
который будет увеличиваться на 8 Мб каждый раз, когда не будет хватать
места. Если текущий диск окажется заполненным, можно, к примеру, добавить
еще один файл данных на другой диск. При задании размера автоматически
увеличивающегося файла ibdata1
следует округлить его текущий размер до
ближайшего числа, кратного 1024 * 1024 байтам (= 1 Мб), и явно указать
округленный размер ibdata1
в innodb_data_file_path
. После этой записи
можно добавить еще один файл данных:
innodb_data_home_dir = innodb_data_file_path = /ibdata/ibdata1:988M;/disk2/ibdata2:50M:autoextend
Следует соблюдать осторожность при работе в файловых системах, в которых установлено ограничение на размер файла в 2 Гб! Максимальный для данной операционной системы размер файла InnoDB не известен. В таком случае желательно указать максимальный размер файла данных:
innodb_data_home_dir = innodb_data_file_path = /ibdata/ibdata1:100M:autoextend:max:2000M
Простой пример файла my.cnf
. Предположим, что у вас есть
компьютер с 128 Мб ОЗУ и одним жестким диском. Ниже приведены примеры возможных
параметров конфигурации в my.cnf
или my.ini
для InnoDB. Мы
предполагаем что у вас запущен MySQL-Max-3.23.50 и выше или MySQL-4.0.2 и выше.
Этот пример подходит для большинства пользователей работающих под Unix и
Windows, которые не хотят располагать файлы данных и журнальные файлы на
различных дисках. В этом примере создается автоматически увеличивающийся файл
ibdata1
и два журнальных файла ib_logfile0
и ib_logfile1
в
в директории данных MySQL (обычно /mysql/data
). Небольшой архивный
журнальный файл InnoDB ib_arch_log_0000000000
также располагается в каталоге
datadir
:
[mysqld] # Сюда можно добавить другие опции MySQL # ... # # Файлы данных должны иметь достаточно # места для сохранения ваших данных и # индексов. Убедитесь что у вас достаточно # свободного места на диске. innodb_data_file_path = ibdata1:10M:autoextend # Размер буферного пула следует задавать # как 50 - 80% памяти компьютера set-variable = innodb_buffer_pool_size=70M set-variable = innodb_additional_mem_pool_size=10M # Размер файла журналов должен составлять # около 25% от размера буферного пула set-variable = innodb_log_file_size=20M set-variable = innodb_log_buffer_size=8M # Если допустима потеря некоторых # последних транзакций, установите # flush_log_в_trx_commit в 0 innodb_flush_log_at_trx_commit=1
Убедитесь, что MySQL server имеет права создавать файлы в datadir
.
Не забывайте, что в некоторых файловых системах существует ограничение в 2 Гб на размер файла данных! Общий размер файлов журналов должен быть меньше 4 Гб, а общий размер файлов данных - больше или равен 10Мб.
При первом создании базы данных InnoDB лучше всего запустить сервер MySQL
из командной строки. Тогда на экран будет выводиться информация о создании базы
данных и вы сможете увидеть, что происходит. Смотрите следующий раздел, в
котором описано, на что должна быть похожа выводимая информация. Например, в
Windows можно запустить mysqld-max.exe
с параметрами:
your-path-to-mysqld>mysqld-max --console
Где поместить файл my.cnf
или my.ini
в Windows? Для Windows существуют
следующие правила:
Должен быть создан только один файл
my.cnf
илиmy.ini
.Файл
my.cnf
должен находиться в корневом каталоге дискаC:
.Файл
my.ini
должен находиться в каталогеWINDIR
, например вC:\WINDOWS
илиC:\WINNT
. Чтобы вывести значениеWINDIR
, можно воспользоваться командойSET
операционной системы MS-DOS.Если на вашем компьютере применяется загрузчик операционной системы, в котором диск
C:
не является загрузочным, то необходимо использовать файлmy.ini
.
Где указываются параметры в Unix?
В Unix mysqld
считывает параметры из
следующих файлов, если они существуют, в таком порядке:
/etc/my.cnf
- общие параметры.COMPILATION_DATADIR/my.cnf
-- параметры для сервера.defaults-extra-file
-- файл, указанный при помощи--defaults-extra-file=...
.~/.my.cnf
- параметры для пользователя.
COMPILATION_DATADIR
представляет собой каталог данных MySQL, который был
указан как параметр ./configure
при компиляции mysqld
(обычно
/usr/local/mysql/data
для установки исполняемых файлов или /usr/local/var
для установки исходного кода).
Если точно не известно, откуда mysqld
считывает свои файлы my.cnf
или
my.ini
, можно задать путь как первый параметр командной строки для
сервера: mysqld --defaults-file=your_path_to_my_cnf
.
InnoDB формирует полный путь к файлу данных путем соединения
innodb_data_home_dir
и имени файла данных или пути в
innodb_data_file_path
, добавляя при необходимости косую черту. Если
ключевое слово innodb_data_home_dir
не упоминается в my.cnf
совсем, по умолчанию используется директория данных MySQL.
Пример расширенного файла my.cnf
Предположим, что у вас есть
компьютер Linux с 2 Гб ОЗУ и тремя жесткими дисками по 60 Гб (с путями
каталогов `/'
, `/dr2'
and `/dr3'
). Ниже приведен пример
возможных параметров конфигурации в my.cnf
для InnoDB:
Учтите, что InnoDB не создает директории: вы должны создать их самостоятельно. Используйте комманду Unix или MS-DOS mkdir
для создания
домашней директории для InnoDB и домашней директории для группы журнальных
файлов.
[mysqld] # Здесь вы можете задать другие опции сервера MySQL # ... # innodb_data_home_dir = # Файлы данных должны иметь достаточно # места для сохранения ваших данных и # индексов innodb_data_file_path = /ibdata/ibdata1:2000M;/dr2/ibdata/ibdata2:2000M:autoextend # Размер буферного пула следует задавать # как 50 - 80% памяти компьютера, но # для Linux x86 следует убедиться, что # общий расход памяти не превышает 2 Гб set-variable = innodb_buffer_pool_size=1G set-variable = innodb_additional_mem_pool_size=20M innodb_log_group_home_dir = /dr3/iblogs # .._log_arch_dir должен быть такой # же, как _log_group_home_dir innodb_log_arch_dir = /dr3/iblogs set-variable = innodb_log_files_in_group=3 # Размер файла журналов должен составлять # около 15 % от размера буферного пула set-variable = innodb_log_file_size=150M set-variable = innodb_log_buffer_size=8M # Если допустима потеря некоторых # последних транзакций, установите # flush_log_в_trx_commit в 0 innodb_flush_log_at_trx_commit=1 set-variable = innodb_lock_wait_timeout=50 #innodb_flush_method=fdatasync #set-variable = innodb_thread_concurrency=5
Обратите внимание на то, что два файла данных размещены на разных дисках.
InnoDB будет заполнять табличное пространство, образованное файлами
данных, снизу вверх. В некоторых случаях это позволяет увеличить
производительность баз данных, если не все данные размещены на одном
физическом диске. Размещение файлов журнала на другом диске очень часто
позволяет повысить производительность. Для файлов данных можно также
использовать разделы реального диска (реальные устройства): в некоторых
версиях Unix это ускоряет операции ввода/вывода. Информацию по указанию
параметров в my.cnf
вы найдете в разделе руководства по управлению
пространством файлов InnoDB.
Предупреждение: в Linux x86 необходимо соблюдать осторожность, чтобы не
установить слишком высокое значение использования памяти. glibc
может дать
процессу разрастись и превысить стеки потоков, что приведет к сбою
сервера. Степень риска значительно повышается, если значение
innodb_buffer_pool_size + key_buffer + max_connections * (sort_buffer + read_buffer_size) + max_connections * 2 MB
приближается к значению 2 Гб или превышает его. Каждый поток будет
использовать стек (обычно 2 Мб, но в бинарной поставке MySQL AB только 256
Кб) и в худшем случае также дополнительную память sort_buffer + read_buffer_size
.
Как настроить другие параметры сервера mysqld? Для большинства пользователей подходят следующие стандартные значения:
skip-locking set-variable = max_connections=200 set-variable = read_buffer_size=1M set-variable = sort_buffer=1M # Размер key_buffer следует задавать как # 5%-50% от вашего ОЗУ, в зависимости # от того, как часто у вас используются # таблицы MyISAM, но key_buffer + # размер буферного пула InnoDB не должен # превышать 80% вашего ОЗУ set-variable = key_buffer=...
Обратите внимание на то, что некоторые параметры представлены при помощи
формата числового параметра my.cnf
: set-variable = innodb... = 123
, а
остальные (строчные и логические параметры) - при помощи другого формата:
innodb_... = ...
.
Параметры настройки имеют следующие значения:
Параметр | Описание |
innodb_data_home_dir |
Общая часть пути к каталогу всех файлов
данных InnoDB. Если вы не указали этот параметр в my.cnf , то по
умолчанию для этого параметра принято значение datadir MySQL. Если
вы указали как пустою строку, то в этом случае вы можете использовать полный
путь в innodb_data_file_path .
|
innodb_data_file_path |
Пути к отдельным файлам данных и их размеры.
Полный путь к каталогу каждого файла данных
получается путем объединения
innodb_data_home_dir с путем, который задается
данным параметром. Размеры файлов указаны в
мегабайтах. InnoDB также ``понимает'' сокращение 'G', 1 G означает 1024 М. Начиная с
версии 3.23.44 в операционных системах, где
поддерживаются большие файлы, можно задавать
размер файла, превышающий 4 Гб. В некоторых
операционных системах файлы должны быть < 2
Гб. Общий объем файлов должен быть как минимум
10 Мб.
|
innodb_mirrored_log_groups |
Количество идентичных копий групп журналов, которые хранятся для базы данных. На данный момент этому параметру должно быть присвоено значение 1. |
innodb_log_group_home_dir |
Путь к каталогу файлов журналов InnoDB. |
innodb_log_files_in_group |
Количество файлов журналов в группе журналов. InnoDB производит запись в файлы по круговому способу. Для этого параметра рекомендуется установить значение "3". |
innodb_log_file_size |
Размер каждого файла журнала в группе журналов (указывается в мегабайтах). Разумный диапазон значений составляет от 1М до 1/N от размера буферного пула, приведенного ниже, где N - количество файлов журналов в группе. Чем больше это значение, тем меньше требуется сбросов на диск информации из буферного пула, что сокращает количество дисковых операций ввода/вывода. Однако в случае сбоя восстановление при больших размерах файлов журналов займет больше времени. Общий размер файлов журналов на 32-разрядных компьютерах должен быть < 4 Гб. |
innodb_log_buffer_size |
Размер буфера, который в InnoDB используется для записи информации файлов журналов на диск. Разумный диапазон значений составляет от 1М до 8М. Большой буфер журналов позволяет осуществлять объемные транзакции без записи журнала на диск до завершения транзакции. Поэтому если ваши транзакции отличаются значительными объемами, увеличение буфера журналов сократит количество операций ввода/вывода диска. |
innodb_flush_log_at_trx_commit |
Обычно этому параметру присваивается значение 1; при этом значении после завершения транзакции информация журнала записывается на диск и фиксируются изменения, внесенные транзакцией, благодаря чему данные сохраняются в случае сбоя базы данных. Если у вас выполняется большое количество маленьких транзакций и вы готовы пожертвовать такой возможностью, можно установить значение этого параметра в 0, чтобы снизить количество обращений к диску. |
innodb_log_arch_dir |
Каталог, в котором будут храниться заполненные
файлы журналов, если включено архивирование журналов. Значение этого параметра на
настоящий момент должно задаваться таким же, как и для innodb_log_group_home_dir .
|
innodb_log_archive |
На данный момент значение этого параметра должно устанавливаться в 0. Поскольку восстановление из резервной копии MySQL осуществляет при помощи своих собственных файлов журналов, архивировать файлы журналов InnoDB нет необходимости. |
innodb_buffer_pool_size |
Размер буфера памяти, который InnoDB использует для кэширования данных и индексов своих таблиц. Чем больше это значение, тем меньше обращений к диску осуществляется при получении доступа к данным таблиц. На специально выделенном сервере баз данных этот параметр можно установить в значение до 80% физической памяти компьютера. Однако для этого параметра не следует задавать слишком большое значение, так как при недостатке физической памяти операционная система будет вынуждена сбрасывать часть информации на диск. |
innodb_additional_mem_pool_size |
Размер пула памяти, который InnoDB использует для хранения информации словаря данных и других внутренних структур данных. Разумным значением для этого параметра может быть 2М, но чем больше таблиц в вашем приложении, тем больше информации нужно будет разместить в этом пуле. Если памяти в этом пуле будет недостаточно для InnoDB, то будет выделятся память операционной системы, а в файл журнала MySQL будут записываться предупреждающие сообщения. |
innodb_file_io_threads |
Количество потоков ввода/вывода файлов в InnoDB. Обычно этому параметру присваивается значение 4, но в Windows при помощи увеличения данного значения можно сократить количество обращений к диску. |
innodb_lock_wait_timeout |
Время простоя (в секундах), на протяжении
которого транзакция InnoDB может ожидать
блокировки прежде, чем будет произведен откат.
InnoDB автоматически обнаруживает зависшие
транзакции в своей таблице блокировок и
производит откат транзакций. Если в той же самой транзакции используется команда LOCK TABLES , или другие обработчики таблиц с
безопасными транзакциями, отличными от InnoDB,
то может возникнуть зависание, которое не
будет обнаружено InnoDB. В таких ситуациях
параметр времени простоя помогает устранить
проблему.
|
innodb_flush_method (Доступен, начиная с версий 3.23.40 и выше). По умолчанию для этого параметра принято
значение fdatasync . Другой возможный вариант - O_DSYNC .
|