Чтобы использовать таблицы 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 используется следующий синтаксис:
Если последний файл данных указан с параметром автоматического увеличения, то в случае нехватки места для табличной области InnoDB будет увеличивать последний файл данных; приращение файла каждый раз составляет 8 Мб. Например, синтаксис:
указывает InnoDB создать один файл данных с начальным размером 100 Мб, который будет увеличиваться на 8 Мб каждый раз, когда не будет хватать места. Если текущий диск окажется заполненным, можно, к примеру, добавить еще один файл данных на другой диск. При задании размера автоматически увеличивающегося файла ibdata1 следует округлить его текущий размер до ближайшего числа, кратного 1024 * 1024 байтам (= 1 Мб), и явно указать округленный размер ibdata1 в innodb_data_file_path. После этой записи можно добавить еще один файл данных:
Следует соблюдать осторожность при работе в файловых системах, в которых установлено ограничение на размер файла в 2 Гб! Максимальный для данной операционной системы размер файла InnoDB не известен. В таком случае желательно указать максимальный размер файла данных:
Простой пример файла 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эatasync
#set-variable = innodb_thread_concurrency=5
Обратите внимание на то, что два файла данных размещены на разных дисках. InnoDB будет заполнять табличное пространство, образованное файлами данных, снизу вверх. В некоторых случаях это позволяет увеличить производительность баз данных, если не все данные размещены на одном физическом диске. Размещение файлов журнала на другом диске очень часто позволяет повысить производительность. Для файлов данных можно также использовать разделы реального диска (реальные устройства): в некоторых версиях Unix это ускоряет операции ввода/вывода. Информацию по указанию параметров в my.cnf вы найдете в разделе руководства по управлению пространством файлов InnoDB.
Предупреждение: в Linux x86 необходимо соблюдать осторожность, чтобы не установить слишком высокое значение использования памяти. glibc может дать процессу разрастись и превысить стеки потоков, что приведет к сбою сервера. Степень риска значительно повышается, если значение
приближается к значению 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.