7.5.2 Параметры запуска InnoDB
Чтобы использовать таблицы InnoDB в MySQL-Max-3.23, НЕОБХОДИМО задать
параметры конфигурации в разделе [mysqld]
файла конфигурации `my.cnf' или
в файле параметров Windows `my.ini'.
В версии 3.23 как минимум необходимо указать innodb_data_file_path
. В
MySQL-4.0 не требуется задавать даже innodb_data_file_path
: по умолчанию
для него создается автоматически увеличивающийся файл размером в 16 Мб с
именем `ibdata1' в каталоге `datadir' MySQL. (в MySQL-4.0.0 и 4.0.1 размер
файла данных составляет 64 Мб и он не является автоматически
увеличивающимся).
Однако для того, чтобы получить высокую производительность, НЕОБХОДИМО
явно задать параметры 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_file_path = /ibdata/ibdata1:100M:autoextend
указывает InnoDB создать один файл данных с начальным размером 100 Мб,
который будет увеличиваться на 8 Мб каждый раз, когда не будет хватать
места. Если текущий диск окажется заполненным, можно, к примеру, добавить
еще один файл данных на другой диск. При задании размера автоматически
увеличивающегося файла `ibdata1' следует округлить его текущий размер до
ближайшего числа, кратного 1024 * 1024 байтам (= 1 Мб), и явно указать
округленный размер `ibdata1' в innodb_data_file_path
. После этой записи
можно добавить еще один файл данных:
innodb_data_file_path = /ibdata/ibdata1:988M;/disk2/ibdata2:50M:autoextend
Следует соблюдать осторожность при работе в файловых системах, в которых
установлено ограничение на размер файла в 2 Гб! Максимальный для данной
операционной системы размер файла InnoDB не известен. В таком случае
желательно указать максимальный размер файла данных:
innodb_data_file_path = /ibdata/ibdata1:100M:autoextend:max:2000M
Предположим, что у вас есть компьютер Windows NT с 128 Мб ОЗУ и одним
жестким диском на 10 Гб. Ниже приведен пример возможных параметров
конфигурации в `my.cnf' или `my.ini' для InnoDB:
[mysqld]
# Сюда можно добавить другие опции MySQL
# ...
#
innodb_data_home_dir = c:\ibdata
# Файлы данных должны иметь достаточно
# места для сохранения ваших данных и
# индексов
innodb_data_file_path = ibdata1:2000M;ibdata2:2000M
# Размер буферного пула следует задавать
# как 50 - 80% памяти компьютера
set-variable = innodb_buffer_pool_size=70M
set-variable = innodb_additional_mem_pool_size=10M
innodb_log_group_home_dir = c:\iblogs
# .._log_arch_dir должен быть таким
# же, как _log_group_home_dir
innodb_log_arch_dir = c:\iblogs
innodb_log_archive=0
set-variable = innodb_log_files_in_group=3
# Размер файла журналов должен составлять
# около 15% от размера буферного пула
set-variable = innodb_log_file_size=10M
set-variable = innodb_log_buffer_size=8M
# Если допустима потеря нескольких
# последних транзакций, установите
# flush_log_в_trx_commit в 0
innodb_flush_log_at_trx_commit=1
set-variable = innodb_file_io_threads=4
set-variable = innodb_lock_wait_timeout=50
Обратите внимание на то, что InnoDB
не создает каталогов: это нужно
делать самостоятельно. Чтобы создать каталоги для данных и журналов,
воспользуйтесь командой Unix или MS-DOS `mkdir'. Кроме того, следует
удостовериться, что у сервера MySQL есть права на создание файлов в
указанных каталогах.
Не забывайте, что в некоторых файловых системах существует ограничение в 2
Гб на размер файла данных! Общий размер файлов данных должен быть больше
или равен 10 Мб, а общий размер файлов журналов - меньше 4 Гб.
Если не указать innodb_data_home_dir
, то InnoDB по умолчанию создает свои
файлы данных в каталоге `datadir' MySQL. После задания innodb_data_home_dir
нельзя использовать абсолютные пути к файлам в innodb_data_file_path
.
При первом создании базы данных InnoDB лучше всего запустить сервер MySQL
из командной строки. Тогда на экран будет выводиться информация о создании
базы данных и вы сможете увидеть, что происходит. Например, в Windows
можно запустить `mysqld-max.exe' с параметрами:
your-path-to-mysqld>mysqld-max --standalone --console
Чтобы узнать, какой вид должна иметь выводящаяся информация, обратитесь к
разделу Creating InnoDB Tablespace.
Где поместить файл `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
.
Предположим, что у вас есть компьютер Linux с 512 Мб ОЗУ и тремя жесткими
дисками по 20 Гб (с путями каталогов ``/'', ``/dr2'' and ``/dr3''). Ниже
приведен пример возможных параметров конфигурации в `my.cnf' для InnoDB:
[mysqld]
# Здесь вы можете задать другие опции сервера MySQL
# ...
#
innodb_data_home_dir = /
# Файлы данных должны иметь достаточно
# места для сохранения ваших данных и
# индексов
innodb_data_file_path = ibdata/ibdata1:2000M;dr2/ibdata/ibdata2:2000M
# Размер буферного пула следует задавать
# как 50 - 80% памяти компьютера, но
# для Linux x86 следует убедиться, что
# общий расход памяти не превышает 2 Гб
set-variable = innodb_buffer_pool_size=350M
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
innodb_log_archive=0
set-variable = innodb_log_files_in_group=3
# Размер файла журналов должен составлять
# около 15% от размера буферного пула
set-variable = innodb_log_file_size=50M
set-variable = innodb_log_buffer_size=8M
# Если допустима потеря нескольких
# последних транзакций, установите
# flush_log_в_trx_commit в 0
innodb_flush_log_at_trx_commit=1
set-variable = innodb_file_io_threads=4
set-variable = innodb_lock_wait_timeout=50
#innodb_flush_method=fdatasync
#innodb_fast_shutdown=1
#set-variable = innodb_thread_concurrency=5
Обратите внимание на то, что два файла данных размещены на разных дисках.
Параметр innodb_data_file_path
предназначен для указания путей к файлам
данных, а содержимое параметра innodb_data_home_dir
добавляется
непосредственно перед путями к файлам данных через косую или обратную
косую черту. InnoDB заполняет табличное пространство, образованное файлами
данных, снизу вверх. В некоторых случаях это позволяет увеличить
производительность баз данных, если не все данные размещены на одном
физическом диске. Размещение файлов журнала на другом диске очень часто
позволяет повысить производительность. Для файлов данных можно также
использовать разделы реального диска (реальные устройства): в некоторых
версиях Unix это ускоряет операции ввода/вывода. Информацию по указанию
параметров в `my.cnf' вы найдете в разделе руководства по управлению
пространством файлов InnoDB.
Предупреждение: в Linux x86 необходимо соблюдать осторожность, чтобы не
установить слишком высокое значение использования памяти. glibc
может дать
процессу разрастись и превысить стеки потоков, что приведет к сбою
сервера. Степень риска значительно повышается, если значение
innodb_buffer_pool_size + key_buffer +
max_connections * (sort_buffer + record_buffer) + max_connections * 2 MB
приближается к значению 2 Гб или превышает его. Каждый поток будет
использовать стек (обычно 2 Мб, но в бинарной поставке MySQL AB только 256
Кб) и в худшем случае также дополнительную память sort_buffer +
record_buffer
.
Как настроить другие параметры сервера mysqld?
Для большинства
пользователей подходят следующие стандартные значения:
set-variable = max_connections=200
set-variable = record_buffer=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. По умолчанию для этого параметра
принято значение datadir MySQL.
|
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М до
половины общего размера файлов журналов. Большой буфер журналов позволяет осуществлять
объемные транзакции без записи журнала на диск
до завершения транзакции. Поэтому если ваши
транзакции отличаются значительными объемами,
увеличение буфера журналов сократит количество
операций ввода/вывода диска.
|
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 .
|