17.8.1 Настройка запуска InnoDB
Первые решения по настройке InnoDB включают конфигурацию файлов данных, файлов логов, размера страницы и буферов памяти, которые необходимо настроить перед инициализацией InnoDB. Изменение конфигурации после инициализации InnoDB может потребовать непростых процедур.
Этот раздел предоставляет информацию о задании параметров InnoDB в файле конфигурации, просмотре информации об инициализации InnoDB и важных аспектах хранения данных.
Указание параметров в файле конфигурации MySQL
Поскольку MySQL использует настройки файлов данных, файлов логов и размера страницы для инициализации InnoDB, рекомендуется определить эти настройки в файле конфигурации, который MySQL читает при запуске, до инициализации InnoDB. Обычно InnoDB инициализируется при первом запуске сервера MySQL.
Вы можете разместить параметры InnoDB в группе [mysqld] любого файла конфигурации, который считывает ваш сервер при запуске. Местоположение файлов конфигурации MySQL описано в Разделе 6.2.2.2, “Использование файлов конфигурации”.
Чтобы убедиться, что mysqld читает параметры только из определенного файла (и mysqld-auto.cnf), используйте параметр --defaults-file в качестве первого параметра в командной строке при запуске сервера:
mysqld --defaults-file=path_to_option_file
Просмотр информации об инициализации InnoDB
Для просмотра информации об инициализации InnoDB во время запуска, запустите mysqld из командной строки, которая выведет информацию об инициализации в консоль.
Например, в Windows, если mysqld находится в C:\Program Files\MySQL\MySQL Server
8.4\bin, запустите сервер MySQL так:
C:\> "C:\Program Files\MySQL\MySQL Server 8.4\bin\mysqld" --console
На Unix-подобных системах mysqld находится в каталоге bin вашей установки MySQL:
$> bin/mysqld --user=mysql &
Если вывод сервера не направляется в консоль, проверьте файл журнала ошибок после запуска, чтобы увидеть информацию об инициализации InnoDB, выведенную во время процесса запуска.
Для получения информации о запуске MySQL другими способами см. Раздел 2.9.5, “Автоматический запуск и остановка MySQL”.
InnoDB не открывает все пользовательские таблицы и связанные файлы данных при запуске. Однако, InnoDB проверяет наличие файлов табличного пространства, указанных в словаре данных. Если файл табличного пространства не найден, InnoDB записывает ошибку и продолжает процесс запуска. Файлы табличного пространства, указанные в журнале переопределения, могут быть открыты во время восстановления после сбоя для применения переопределения.
Важные соображения по хранению данных
Прежде чем приступать к настройке запуска, ознакомьтесь со следующими соображениями, связанными с хранением.
В некоторых случаях производительность базы данных можно улучшить, разместив файлы данных и журналов на разных физических дисках. Вы также можете использовать сырые разделы диска (сырые устройства) для
InnoDBфайлов данных, что может ускорить ввод-вывод. См. Использование сырых разделов диска для системного табличного пространства.-
InnoDB— это безопасный с точки зрения транзакций (соответствующий ACID) движок хранения данных с возможностями фиксации, отката и восстановления после сбоя для защиты данных пользователя. Однако он не может сделать этого, если основная операционная система или аппаратное обеспечение работают не так, как задумано. Многие операционные системы или подсистемы дисков могут задерживать или переупорядочивать операции записи для повышения производительности. В некоторых операционных системах сама система вызововfsync(), которая должна ожидать, пока все несохраненные данные файла не будут выведены, может фактически вернуть результат до того, как данные будут выведены в стабильное хранилище. Из-за этого сбой операционной системы или отключение питания могут привести к уничтожению недавно зафиксированных данных или, в худшем случае, даже к повреждению базы данных, поскольку операции записи были переупорядочены. Если целостность данных для вас важна, выполните тесты «выключения питания» перед использованием в рабочей среде. В macOSInnoDBиспользует специальный метод сброса файлаfcntl(). В Linux рекомендуется отключить кэш обратной записи.На дисках ATA/SATA команда, такая как
hdparm -W0 /dev/hda, может быть использована для отключения кэша обратной записи. Обратите внимание, что некоторые диски или контроллеры дисков могут не поддерживать отключение кэша обратной записи. В отношении возможностей восстановления
InnoDB, которые защищают данные пользователя,InnoDBиспользует технику вывода файлов, включающую структуру, называемую , которая включена по умолчанию (innodb_doublewrite=ON). Буфер двойной записи добавляет безопасность при восстановлении после неожиданного завершения работы или отключения питания и повышает производительность на большинстве разновидностей Unix, уменьшая потребность вfsync()операциях. Рекомендуется, чтобы параметрinnodb_doublewriteоставался включенным, если вы обеспокоены целостностью данных или возможными отказами. Для получения информации о буфере двойной записи см. Раздел 17.11.1, “Ввод-вывод на диск InnoDB”.Перед использованием NFS с
InnoDB, ознакомьтесь с возможными проблемами, описанными в Разделе Использование NFS с MySQL.
Конфигурация файла данных системной табличной области InnoDB
Параметр innodb_data_file_path определяет имя, размер и атрибуты файлов данных системной табличной области InnoDB. Если этот параметр не настроен до инициализации сервера MySQL, по умолчанию создаётся один автоматически расширяющийся файл данных, немного больший 12 МБ, с именем ibdata1:
mysql> SHOW VARIABLES LIKE 'innodb_data_file_path';
+-----------------------+------------------------+
| Variable_name | Value |
+-----------------------+------------------------+
| innodb_data_file_path | ibdata1:12M:autoextend |
+-----------------------+------------------------+
Полный синтаксис спецификации файла данных включает имя файла, размер файла, атрибут autoextend и атрибут max:
file_name:file_size[:autoextend[:max:max_file_size]]
Размеры файлов указываются в килобайтах, мегабайтах или гигабайтах путём добавления K, M или G к значению размера. Если размер файла данных указывается в килобайтах, он должен быть кратен 1024. В противном случае значения в килобайтах округляются до ближайшего значения мегабайта (МБ). Сумма размеров файлов должна быть как минимум немного больше 12 МБ.
Можно указать более одного файла данных, используя список, разделённый точкой с запятой. Например:
[mysqld]
innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend
Атрибуты autoextend и max могут быть использованы только для файла данных, указанного последним.
Когда указан атрибут autoextend, размер файла данных автоматически увеличивается на 64 МБ при необходимости. Размер приращения управляется переменной innodb_autoextend_increment.
Чтобы указать максимальный размер автоматически расширяющегося файла данных, используйте атрибут max после атрибута autoextend. Используйте атрибут max только в тех случаях, когда ограничение использования диска имеет критическое значение. Следующая конфигурация позволяет файлу ibdata1 расти до предела в 500 МБ:
[mysqld]
innodb_data_file_path=ibdata1:12M:autoextend:max:500M
Для первого файла данных системной табличной области используется минимальный размер файла, чтобы гарантировать достаточное пространство для страниц буфера doublewrite. В следующей таблице показаны минимальные размеры файлов для каждого размера страницы InnoDB. По умолчанию размер страницы InnoDB составляет 16384 (16 КБ).
| Размер страницы (innodb_page_size) | Минимальный размер файла |
|---|---|
| 16384 (16 КБ) или меньше | 3 МБ |
| 32768 (32 КБ) | 6 МБ |
| 65536 (64 КБ) | 12 МБ |
Если диск заполнен, можно добавить файл данных на другой диск. Инструкции см. в разделе Изменение размера системной табличной области.
Предел размера отдельных файлов определяется операционной системой. На операционных системах, поддерживающих большие файлы, размер файла можно установить более 4 ГБ. Также можно использовать разделы жёстких дисков в качестве файлов данных. См. Использование разделов жёстких дисков для системной табличной области.
InnoDB не осведомлён о максимальном размере файла в файловой системе, поэтому будьте осторожны на файловых системах, где максимальный размер файла является небольшим значением, таким как 2 ГБ.
Файлы системной табличной области создаются в каталоге данных по умолчанию (datadir). Для указания альтернативного расположения используйте параметр innodb_data_home_dir. Например, чтобы создать файл данных системной табличной области в каталоге с именем myibdata, используйте следующую конфигурацию:
[mysqld]
innodb_data_home_dir = /myibdata/
innodb_data_file_path=ibdata1:50M:autoextend
При указании значения для innodb_data_home_dir требуется косой слэш в конце. InnoDB не создаёт каталоги, поэтому убедитесь, что указанный каталог существует до запуска сервера. Также убедитесь, что сервер MySQL имеет соответствующие права доступа для создания файлов в каталоге.
InnoDB формирует путь к каждому файлу данных путём текстового конкатенации значения innodb_data_home_dir с именем файла данных. Если innodb_data_home_dir не определён, значение по умолчанию — “./”, то есть каталог данных. (Сервер MySQL меняет свой текущий рабочий каталог на каталог данных при запуске.)
В качестве альтернативы можно указать абсолютный путь для файлов данных системной табличной области. Следующая конфигурация эквивалентна предыдущей:
[mysqld]
innodb_data_file_path=/myibdata/ibdata1:50M:autoextend
При указании абсолютного пути для innodb_data_file_path значение не конкатенируется со значением innodb_data_home_dir. Файлы системной табличной области создаются в указанном абсолютном пути. Указанный каталог должен существовать до запуска сервера.
Конфигурация файла буфера InnoDB Doublewrite
Область хранения буфера doublewrite InnoDB расположена в файлах doublewrite, что обеспечивает гибкость в отношении места хранения страниц doublewrite. В предыдущих версиях область хранения буфера doublewrite находилась в системной табличной области. Переменная innodb_doublewrite_dir определяет каталог, где InnoDB создаёт файлы doublewrite при запуске. Если каталог не указан, файлы doublewrite создаются в каталоге innodb_data_home_dir, который по умолчанию совпадает с каталогом данных, если не указано иначе.
Чтобы создать файлы doublewrite в месте, отличном от каталога innodb_data_home_dir, настройте переменную innodb_doublewrite_dir. Например:
innodb_doublewrite_dir=/path/to/doublewrite_directory
Другие переменные буфера doublewrite позволяют определить количество файлов doublewrite, количество страниц на поток и размер пакета doublewrite. Дополнительную информацию о конфигурации буфера doublewrite см. в разделе Раздел 17.6.4, «Буфер doublewrite».
Настройка файла журнала переигрывания
Объем дискового пространства, занимаемого файлами журнала переигрывания, контролируется переменной innodb_redo_log_capacity, которую можно задать при запуске или в процессе работы; например, чтобы установить значение переменной в 8 Гбайт в файле параметров, добавьте следующую запись:
[mysqld]
innodb_redo_log_capacity = 8589934592
Сведения о конфигурации емкости журнала переигрывания во время работы см. в разделе Настройка емкости журнала переигрывания.
Переменная innodb_redo_log_capacity имеет приоритет над переменными innodb_log_file_size и innodb_log_files_in_group, которые устарели. Когда установлено значение innodb_redo_log_capacity, значения innodb_log_file_size и innodb_log_files_in_group игнорируются; в противном случае, если одно или оба из этих устаревших параметров определены, они используются для вычисления значения Innodb_redo_log_capacity_resized как (innodb_log_files_in_group * innodb_log_file_size). Если ни одна из этих переменных не установлена, используется значение по умолчанию innodb_redo_log_capacity.
InnoDB пытается поддерживать 32 файла журнала переигрывания, каждый из которых равен 1/32 * innodb_redo_log_capacity. Файлы журнала переигрывания находятся в каталоге #innodb_redo в каталоге данных, если не был указан другой каталог переменной innodb_log_group_home_dir. Если innodb_log_group_home_dir задано, файлы журнала переигрывания находятся в каталоге #innodb_redo в этом каталоге. Более подробную информацию см. в разделе Раздел 17.6.5, «Журнал переигрывания».
При инициализации экземпляра MySQL Server вы можете определить другое количество файлов журнала переигрывания и другой размер файлов журнала переигрывания, настроив переменные innodb_log_files_in_group и innodb_log_file_size.
innodb_log_files_in_group определяет количество файлов в группе журналов. Значение по умолчанию и рекомендуемое значение равно 2.
innodb_log_file_size определяет размер каждого файла журнала в группе журналов в байтах. Общий размер файлов журналов (innodb_log_file_size * innodb_log_files_in_group) не может превышать максимального значения, которое немного меньше 512 Гбайт. Например, пара файлов журналов по 255 Гбайт приближается к пределу, но не превышает его. Размер файла журнала по умолчанию составляет 48 Мбайт. Как правило, общий размер файлов журнала должен быть достаточно большим, чтобы сервер мог сглаживать пики и спады в активности рабочей нагрузки, что часто означает, что существует достаточно места в журнале переигрывания, чтобы обработать более чем часовой объем записей. Более крупный размер файла журнала означает меньшую активность сброса контрольных точек в кэше буфера, что снижает дисковые операции ввода-вывода. Дополнительную информацию см. в разделе Раздел 10.5.4, «Оптимизация регистрации переигрывания InnoDB».
innodb_log_group_home_dir определяет путь к каталогу, в котором хранятся файлы журнала InnoDB. Вы можете использовать этот параметр, чтобы разместить файлы журнала переигрывания InnoDB в другом физическом хранилище, отличном от файлов данных InnoDB, чтобы избежать потенциальных конфликтов ресурсов ввода-вывода; например:
[mysqld]
innodb_log_group_home_dir = /dr3/iblogs
InnoDB не создает каталоги, поэтому убедитесь, что каталог журнала существует до запуска сервера. Используйте команду Unix или DOS mkdir для создания необходимых каталогов.
Убедитесь, что у сервера MySQL есть соответствующие права доступа для создания файлов в каталоге журнала. В более общем плане сервер должен иметь права доступа во всех каталогах, где ему необходимо создавать файлы.
Настройка табличного пространства отмены
Журналы отмены по умолчанию находятся в двух табличных пространствах отмены, созданных при инициализации экземпляра MySQL.
Переменная innodb_undo_directory определяет путь, где InnoDB создает табличные пространства отмены по умолчанию. Если эта переменная не определена, табличные пространства отмены по умолчанию создаются в каталоге данных. Переменная innodb_undo_directory не является динамической. Ее конфигурация требует перезапуска сервера.
Паттерны ввода-вывода для журналов отмены делают табличные пространства отмены хорошими кандидатами для хранения.
Сведения о настройке дополнительных табличных пространств отмены см. в разделе Раздел 17.6.3.4, «Табличные пространства отмены».
Настройка глобального табличного пространства временных таблиц
Глобальное табличное пространство временных таблиц хранит сегменты отката для изменений, внесенных в созданные пользователем временные таблицы.
Один автоматически расширяемый файл данных глобального табличного пространства временных таблиц с именем ibtmp1 в каталоге innodb_data_home_dir по умолчанию. Начальный размер файла немного больше 12 Мбайт.
Параметр innodb_temp_data_file_path указывает путь, имя файла и размер файла для данных глобального табличного пространства временных таблиц. Размер файла указывается в КБ, МБ или ГБ путем добавления K, M или G к значению размера. Размер файла или общий размер файлов должны быть немного больше 12 Мбайт.
Чтобы указать альтернативное расположение файлов данных глобального табличного пространства временных таблиц, настройте параметр innodb_temp_data_file_path при запуске.
Настройка табличного пространства временных таблиц сеанса
В MySQL 8.4 InnoDB всегда используется в качестве движка хранения на диске для внутренних временных таблиц.
Переменная innodb_temp_tablespaces_dir определяет расположение, где InnoDB создает табличные пространства временных таблиц сеанса. По умолчанию расположение — это каталог #innodb_temp в каталоге данных.
Чтобы указать альтернативное расположение для табличных пространств временных таблиц сеанса, настройте переменную innodb_temp_tablespaces_dir при запуске. Разрешается использовать полный путь или путь относительно каталога данных.
Настройка размера страницы
Параметр innodb_page_size задает размер страницы для всех InnoDB табличных пространств в экземпляре MySQL. Это значение устанавливается при создании экземпляра и остается неизменным после этого. Допустимые значения — 64 КБ, 32 КБ, 16 КБ (по умолчанию), 8 КБ и 4 КБ. Кроме того, можно указать размер страницы в байтах (65536, 32768, 16384, 8192, 4096).
Размер страницы по умолчанию 16 КБ подходит для широкого спектра рабочих нагрузок, особенно для запросов, включающих сканирование таблиц и операций DML, включающих массовые обновления. Меньшие размеры страниц могут быть эффективнее для рабочих нагрузок OLTP, включающих много мелких записей, где конфликт может быть проблемой, когда одна страница содержит много строк. Меньшие страницы также могут быть эффективнее для устройств хранения SSD, которые обычно используют небольшие размеры блоков. Поддержание размера страницы InnoDB близким к размеру блока устройства хранения минимизирует количество неизмененных данных, перезаписываемых на диск.
innodb_page_size можно задать только при инициализации каталога данных. См. описание этой переменной для получения дополнительной информации.
Настройка памяти
MySQL выделяет память для различных кэшей и буферов, чтобы улучшить производительность операций с базой данных. При выделении памяти для InnoDB всегда учитывайте память, необходимую операционной системе, память, выделенную другим приложениям, и память, выделенную для других буферов и кэшей MySQL. Например, если вы используете MyISAM таблицы, учитывайте объем памяти, выделенной для буфера ключей (key_buffer_size). Обзор буферов и кэшей MySQL см. в разделе 10.12.3.1, «Как MySQL использует память».
Буферы, специфичные для InnoDB, настраиваются с помощью следующих параметров:
-
innodb_buffer_pool_sizeопределяет размер буфера пула, который является областью памяти, хранящей кэшированные данные дляInnoDBтаблиц, индексов и других вспомогательных буферов. Размер буфера пула важен для производительности системы, и обычно рекомендуется, чтобыinnodb_buffer_pool_sizeбыл настроен на 50–75 процентов от оперативной памяти. По умолчанию размер буфера пула составляет 128 МБ. Дополнительные рекомендации см. в разделе 10.12.3.1, «Как MySQL использует память». Сведения о настройке размера буфера пулаInnoDBсм. в разделе 17.8.3.1, «Настройка размера буфера пула InnoDB». Размер буфера пула можно настроить при запуске или динамически.В системах с большим объемом оперативной памяти можно повысить конкурентность, разделив буфер пула на несколько экземпляров буфера пула. Количество экземпляров буфера пула контролируется параметром
innodb_buffer_pool_instances. По умолчаниюInnoDBсоздает один экземпляр буфера пула. Количество экземпляров буфера пула можно настроить при запуске. Дополнительные сведения см. в разделе 17.8.3.2, «Настройка нескольких экземпляров буфера пула». innodb_log_buffer_sizeопределяет размер буфера, которыйInnoDBиспользует для записи в файлы журнала на диске. По умолчанию размер составляет 64 МБ. Большой буфер журнала позволяет выполнять большие транзакции без записи журнала на диск до завершения транзакций. Если у вас есть транзакции, которые обновляют, вставляют или удаляют много строк, вы можете увеличить размер буфера журнала, чтобы сэкономить ввод-вывод на диск.innodb_log_buffer_sizeможно настроить при запуске. Дополнительная информация см. в разделе 10.5.4, «Оптимизация журналирования InnoDB».
В 32-разрядных системах GNU/Linux x86, если использование памяти установлено слишком высоким, glibc может разрешить процессу кучи вырасти за пределы стеков потоков, что приведет к сбоям сервера. Это риск, если выделенная процессу mysqld память для глобальных и потоковых буферов и кэшей близка к 2 ГБ или превышает его.
Для оценки использования памяти MySQL можно использовать формулу, аналогичную следующей, которая вычисляет выделение глобальной и потоковой памяти MySQL. Возможно, вам потребуется изменить формулу, чтобы учесть буферы и кэши в вашей версии и конфигурации MySQL. Обзор буферов и кэшей MySQL см. в разделе 10.12.3.1, «Как MySQL использует память».
innodb_buffer_pool_size
+ key_buffer_size
+ max_connections*(sort_buffer_size+read_buffer_size+binlog_cache_size)
+ max_connections*2MB
Каждый поток использует стек (часто 2 МБ, но только 256 КБ в двоичных файлах MySQL, предоставляемых корпорацией Oracle.) и в худшем случае также использует sort_buffer_size +
read_buffer_size дополнительной памяти.
В Linux, если ядро включено для поддержки больших страниц, InnoDB может использовать большие страницы для выделения памяти для своего буфера пула. См. раздел 10.12.3.3, «Включение поддержки больших страниц».
© 2025 Oracle
Licensed under the GPLv2 License.