Весь описанный далее процесс производился на виртуальной машине с боевой Asterisk 16.30.0 / FreePBX 15.0.37.4
Все данные АТС хранит в базе данных MariaDB в таблицах формата InnoDB. К сожалению, по-умолчанию все таблицы хранятся в одном файле: /var/lib/mysql/ibdata1 Этот файл достаточно быстро разрастается (в основном за счет таблиц cdrdb), а способов уменьшить размер InnoDB файла не существует. Кроме того, попытка решить проблему в лоб (OPTIMIZE TABLE) приведет к еще большему разрастанию файла, т.к. сначала создастся новая, оптимизированная таблица, что и приведет к увеличению файла ibdata1, а потом старая таблица уничтожится. Это приведет к освобождению места внутри файла, но сам файл данных при этом не уменьшится. Для того чтобы решить эту проблему необходимо указать в настройках базы данных, что необходимо создавать индивидуальные файлы данных для каждой таблицы. Делается это добавлением параметра innodb_file_per_table в файл настроек /etc/my.cnf в секцию mysqld.
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock # * Fine Tuning innodb_file_per_table = 1
Алгоритм перевода общего файла данных на индивидуальные, такой:
- Делаем дамп баз asterisk и asteriskcdrdb
mysqldump -h localhost -u root asterisk > asterisk.sql mysqldump -h localhost -u root asteriskcdrdb > asteriskcdrdb.sql
- Удаляем базы asterisk и asteriskcdrdb
mysqladmin -h localhost -u root drop asteriskcdrdb mysqladmin -h localhost -u root drop asterisk
- Останавливаем MariaDB
service mariadb stop
- На случай, если что-то пойдет не так, перемещаем (т.е. копируем и удаляем исходные) к дампам файлы ibdata1, ib_logfile0 и ib_logfile1
- Добавляем параметр, который включает индивидуальные файлы данных для таблиц, в файл настроек /etc/my.cnf
- Запускаем MariaDB. При этом в /var/lib/mysql создаются ранее удаленные ib_logfile0 и ib_logfile1
service mariadb start
- Создаем базы данных asterisk и asteriskcdrdb
mysqladmin -h localhost -u root create asterisk mysqladmin -h localhost -u root create asteriskcdrdb
- Восстанавливаем базы из созданных ранее дампов. При этом в каталоге базы создаются файлы с именем таблицы и расширениями .frm и .ibd (.frm содержит описание структуры таблицы, а .ibd как раз и является тем самым индивидуальным файлом данных в формате хранения InnoDB)
mysql -h localhost -u root asterisk < asterisk.sql mysql -h localhost -u root asteriskcdrdb < asteriskcdrdb.sql
- Перезапускаем АТС
reboot
Теперь при удалении старых/ненужных записей из таблицы, например, asteriskdcrdb/cel можно сделать оптимизацию этой таблицы, которая приведет к пересозданию файла cel.ibd и фактическому уменьшению занимаемого базой места на диске.
Привет. Почему когда я делаю аплоад баз обратно у меня не создаются файлы .idb, а создаются только .frm файлы и файл ibdata1 и файл ibdata1 увеличивается до размеров исходных баз?
Добрый день!
Скорее всего не указали в файле конфигурации параметр innodb_file_per_table = 1, или указали его не там. Он должен быть строго в секции [mysqld]. Описываемое Вами поведение говорит, что параметр не применился.
Спасибо! Ваша инструкция — лучшая из тех, что я находил. Проделал процедуру и избавился от гигансткого ibdata, который был просто неприлично большим.
Спасибо за положительный отзыв! Рад, что статья Вам помогла.