Заметка по вопросу уменьшения занимаемого места БД Mysql или MariaDB.
У меня есть несколько Zabbix серверов. На одном Mysql, на другом MariaDB. Всё ниже описанное относится к MariaDB (версия 10.3.23).
Надо выполнить вход в СУБД и выбрать нужную базу данных:
mysql -u root -p
use zabbix;
В моём случае это база данных zabbix.
Чтобы посмотреть информацию по таблицам и увидеть сколько места они занимают, необходимо выполнить запрос в базе:
SELECT table_name, table_rows, data_length, index_length, round(((data_length + index_length) / 1024 / 1024 / 1024),2) "Size in GB" FROM information_schema.tables WHERE table_schema = "zabbix" ORDER BY round(((data_length + index_length) / 1024 / 1024 / 1024),2) DESC LIMIT 8;
Вот пример моего вывода:
Здесь можно увидеть сколько реально занимает места таблица.
А если выполнить вот такой запрос:
select table_name, round(data_length/1024/1024) as data_length_mb,
round(data_free/1024/1024) as data_free_mb from
information_schema.tables where round(data_free/1024/1024) > 50 order
by data_free_mb;
то можно получить сводку, сколько места можно освободить на диске, если сделать оптимизацию по указанный в выводе таблицам.
Если запрос выполнить без части подсвеченной синим цветом (не забывает точку с запятой в конце запроса), то выдаст данные по всем таблицам.
В моё случае history имеет самый большой потенциал к уменьшение занимаемого места на диске.
Для начала можно удалить старые данные из базы вручную, используя вот такой скрипт:
-- intervals in days SET @history_interval = 7; SET @trends_interval = 90; DELETE FROM alerts WHERE (UNIX_TIMESTAMP(NOW()) - clock) > (@history_interval * 24 * 60 * 60); DELETE FROM acknowledges WHERE (UNIX_TIMESTAMP(NOW()) - clock) > (@history_interval * 24 * 60 * 60); DELETE FROM events WHERE (UNIX_TIMESTAMP(NOW()) - clock) > (@history_interval * 24 * 60 * 60); DELETE FROM history WHERE (UNIX_TIMESTAMP(NOW()) - clock) > (@history_interval * 24 * 60 * 60); DELETE FROM history_uint WHERE (UNIX_TIMESTAMP(NOW()) - clock) > (@history_interval * 24 * 60 * 60); DELETE FROM history_str WHERE (UNIX_TIMESTAMP(NOW()) - clock) > (@history_interval * 24 * 60 * 60); DELETE FROM history_text WHERE (UNIX_TIMESTAMP(NOW()) - clock) > (@history_interval * 24 * 60 * 60); DELETE FROM history_log WHERE (UNIX_TIMESTAMP(NOW()) - clock) > (@history_interval * 24 * 60 * 60); DELETE FROM trends WHERE (UNIX_TIMESTAMP(NOW()) - clock) > (@trends_interval * 24 * 60 * 60); DELETE FROM trends_uint WHERE (UNIX_TIMESTAMP(NOW()) - clock) > (@trends_interval * 24 * 60 * 60);
В начале скрипта задаются временные интервалы в днях, дальше которых данные не актуальны. Скрипт общий для всех таблиц (относительно zabbix).
Выполняю
OPTIMIZE TABLE history;
без предварительной очистки.
После выполнения данной процедуры я перелогинился в Zabbix, т.к. до этого он почему-то перестал отображать адекватно информацию.
Результат занимаемого места средствами мониторинга Zabbix:
Было 2.58GB, стало 2.36GB.
В процессе выполнения операции, как видно из графика, занимаемое место вначале расчёт. Это стоит учитывать при выполнении данной операции, т.к. для манёвров нужно свободное пространство на диске.
Я оптимизировал базу history_uint размером 13ГБ и на это время мониторинг Zabbix не отображал мне собираемую информацию. Делалось это на обычных дисках (не ssd и не nvme, но серверных), времени ушло - 1ч. 33м.). На время манёвров потребовалось +6ГБ на диске. База с 13,04 -> 7,16ГБ. Уменьшилась почти в два раза.
Можно оптимизировать/очистить сразу все возможные базы:
mysqlcheck -o --all-databases -u root -p
В моё случае это снизило занимаемое место базы с 2.36GB (после результата выше) до 2.29GB.
В процессе выполнения выше описанных процедур по освобождению места сам Zabbix сервер работал, проблем с этим не было, данные собирались. Разве что подтормаживал веб-интерфейс.
#Проблемка
При выполнение команды optimize table history_uint; получают ошибку:
Index for table 'history_uint' is corrupt; try to repair it
Пока не разобрался с этой ошибкой.
Пробовал
mysqlcheck -r --databases mysql --use-frm
Команда repair table zabbix.history_uint; выдаёт:
The storage engine for the table doesn’t support repair
Использованный материал.
ip-calculator.ru/blog/ask/szhatie-defragmentatsiya-i-optimizatsiya-bazy-dannyh-mariadb-mysql/
https://dotclear.placeoweb.com/post/%5BERROR%5D-mysqld.exe-Index-for-table-mysqldb-is-corrupt-try-to-repair-it-Couldn-t-repair-table-mysql.db
https://github.com/burner1024/zabbix-sql/blob/master/check-old-data.my.sql