Тюнинг MySQL-сервера: включение опции innodb_file_per_table
Jul 13, 2015 22:22 · 334 words · 2 minute read
По умолчанию, при использовании движка базы данных InnoDB, все таблицы и индексы хранятся в системном табличном пространстве (по сути в одном файле /var/lib/mysql/ibdata
). Когда данных накапливается много, файл значительно разрастается, и с этим могут возникать различные проблемы и неудобства.
В качестве альтернативы можно хранить каждую таблицу InnoDB и связанные индексы в отдельных файлах — за эту функцию отвечает опция innodb_file_per_table. Давайте разберемся как получить массу преимуществ, используя параметр innodb_file_per_table, например:
- можно хранить разные таблицы одной базы данных на разных физических устройствах;
- операция
TRUNCATE [TABLE] tbl_name
выполняется гораздо быстрее; - можно выполнять операцию
OPTIMIZE TABLE tbl_name
(в случае использования движка базы данных InnoDB — то же самое, что иALTER TABLE tbl_name ENGINE=InnoDB
); - таблицы, созданные с параметром innodb_file_per_table могут использовать innodb_file_format=Barracuda, а этот формат в свою очередь дает возможность работать с
ROW_FORMAT=COMPRESSED
иROW_FORMAT=DYNAMIC
; - в очень больших базах данных этот параметр и вовсе незаменим — согласно официальной документации, системное табличное пространство ограничено объемом в 64TB, а включение опции innodb_file_per_table устанавливает лимит 64TB для каждой таблицы (есть куда расти).
Алгоритм включения опции innodb_file_per_table следующий:
- останавливаем сервисы, использующие базу данных (apache, zabbix, sphinxsearch и т. д.);
- делаем резервную копию (дамп) базы данных;
- удаляем базу данных;
- останавливаем MySQL-сервер;
- в конфиге
/etc/mysql/my.cnf
удаляем параметр innodb_data_file_path и добавляем параметр innodb_file_per_table; - удаляем файлы
/var/lib/mysql/ibdata
,/var/lib/mysql/ib_logfile0
,/var/lib/mysql/ib_logfile1
и т. д.; - запускаем MySQL-сервер;
- создаем базу данных;
- восстанавливаем данные из резервной копии;
- проверяем наличие файлов с расширением
*.ibd
для каждой таблицы; - запускаем остановленные в первом пункте сервисы.
Например, так можно проделать вышеописанную процедуру с базой данных zabbix:
- останавливаем сервисы работающие с базой (zabbix-server):
/etc/init.d/zabbix-server stop
- делаем резервную копию (дамп) данных:
/usr/bin/mysqldump --user=USER --password=PASSWORD zabbix | gzip > /tmp/zabbix.sql.gz
- удаляем базу данных zabbix:
mysql -uUSER -pPASSWORD
drop database zabbix;
- останавливаем MySQL-сервер:
/etc/init.d/mysql stop
- вносим правки в конфиг
/etc/mysql/my.cnf
;
nano /etc/mysql/my.cnf
- удаляем файлы в директории
/var/lib/mysql
; - запускаем MySQL-сервер:
/etc/init.d/mysql start
- создаем базу данных zabbix:
mysql -uUSER -pPASSWORD
create database zabbix;
- восстанавливаем данные из резервной копии:
zcat zabbix.sql.gz | mysql -uUSER -pPASSWORD zabbix
- проверяем файлы с расширением
*.ibd
для каждой таблицы:
ls -la /var/lib/mysql/zabbix
- запускаем zabbix-server:
/etc/init.d/zabbix-server start