InnoDB — основной движок для MySQL, который с версии 5.5 стал дефолтным. Поддерживает транзакции, репликацию, построчную блокировку. В отличие от таблиц MyISAM, где для каждой таблицы создается один файл данных, данные InnoDB в настройках по умолчанию хранятся в больших совместно используемых файлах. То есть данные для всех таблиц и всех баз данных хранятся в одном файле.
Разделение файла ibdata1 в MySQL с использованием InnoDB на несколько файлов может привести к улучшению производительности и упрощению управления данными. Вот несколько ключевых преимуществ разделения ibdata1 на несколько файлов:
Обычно первая команда, которую нам нужно запустить при возникновении проблемы с MySQL:
MariaDB [(NONE)]> SHOW ENGINE INNODB STATUS;
InnoDB Startup Configuration: для разделения ibdata1 на несколько файлов, в конфигурации InnoDB можно использовать параметры innodb_file_per_table или innodb_data_file_path. Включение innodb_file_per_table заставляет InnoDB создавать отдельный файл для каждой таблицы, что также помогает в управлении пространством и производительности.
MySQL по умолчанию все таблички innodb хранит в одном файле - когда их накапливается приличное количество - файл значительно разрастается. Плюс не забывайте, что при удалении данных в innodb - размер файла не уменьшается - он растет только в большую сторону. Так что если данных в базе у вас много или идет активное удаление - рано или поздно вы задумаетесь о том, чтобы выполнить подобное разделение.
mysql -e "SHOW VARIABLES LIKE '%'\G;" | grep innodb_file_per_table -B 1 -A 1 Variable_name: innodb_file_per_table VALUE: ON
Что нужно сделать:
mysqldump --all-databases -p > mysqldump-all.sql
innodb_data_file_path=ibdata1:10M:autoextend innodb_file_per_table=1
/var/lib/ibdata1 /var/lib/ib_logfile0 /var/lib/ib_logfile1
Все!
Скрипт для оптимизации файлов InnoDB конкретной базы данных. Команда OPTIMIZE TABLE уменьшит размер базы данных за счет: если таблица имеет удаленные или порванные строки, ремонтирует таблицу; если индексные страницы не отсортированы, сортирует их. Если статистика не современна (и ремонт не может быть выполнен с сортировкой индекса), модифицирует ее. Команда OPTIMIZE TABLE должна использоваться после удаления большей части таблицы или если в таблице было внесено много изменений в строки переменной длины (таблицы, в которых есть столбцы VARCHAR, BLOB или TEXT). Удаленные записи поддерживаются при помощи связного списка, и последующие операции INSERT повторно используют позиции старых записей. Чтобы перераспределить неиспользуемое пространство и дефрагментировать файл данных.
#!/bin/bash # Author of the script DOR DB_NAME="battery_hp" TABLES=$(mysql -N -B -e "SHOW TABLES FROM $DB_NAME") for TABLE1 in $TABLES do mysql -e "OPTIMIZE TABLE $TABLE1" $DB_NAME done
Второй вариант оптимизации заключается в пересоздании базы данных. Чтобы уменьшить размер своей базы данных с движком InnoDB, необходимо воспользоваться mysqldump, чтобы сделать дамп всех своих таблиц, создать новую базу данных и импортировать таблицы в новую базу данных.
Когда файл ibdata1 растет в MySQL слишком быстро, это обычно вызвано длительной транзакцией, о которой мы забыли. Постарайтесь решить проблему как можно быстрее (зафиксировав или завершив транзакцию), поскольку вы не сможете восстановить потраченное впустую дисковое пространство без мучительно медленного процесса mysqldump.
Также рекомендуется осуществлять мониторинг базы данных, чтобы избежать подобных проблем со слишком старой выполняющейся транзакцией.