Ручной housekeeper в zabbix
При работе с Zabbix часто возникает проблема разрастания базы данных — ibdata1, поэтому может стать необходимость в её уменьшении.
Приведу ниже запросы в MySQL:
Узнать размера всех баз
SELECT table_schema "DB Name", Round(Sum(data_length + index_length) / 1024 / 1024, 1) "DB Size in MB" FROM information_schema.tables GROUP BY table_schema;
Узнать размер всех таблиц в конкретной базе
SELECT table_name AS `Table`, round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB` FROM information_schema.TABLES WHERE table_schema = "zabbix";
Узнать размер всех таблиц во всех базах
SELECT table_schema as `Database`, table_name AS `Table`, round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB` FROM information_schema.TABLES ORDER BY (data_length + index_length) DESC;
Так же можно узнать количество строк в таблице, исходя из нужного интервала (в днях):
-- intervals in days SET @history_interval = 7; SET @trends_interval = 90; SELECT count(alertid) AS alerts FROM alerts WHERE (UNIX_TIMESTAMP(NOW()) - clock) > (@history_interval * 24 * 60 * 60); SELECT count(acknowledgeid) AS acknowledges FROM acknowledges WHERE (UNIX_TIMESTAMP(NOW()) - clock) > (@history_interval * 24 * 60 * 60); SELECT count(eventid) AS events FROM events WHERE (UNIX_TIMESTAMP(NOW()) - clock) > (@history_interval * 24 * 60 * 60); SELECT count(itemid) AS history FROM history WHERE (UNIX_TIMESTAMP(NOW()) - clock) > (@history_interval * 24 * 60 * 60); SELECT count(itemid) AS history_uint FROM history_uint WHERE (UNIX_TIMESTAMP(NOW()) - clock) > (@history_interval * 24 * 60 * 60); SELECT count(itemid) AS history_str FROM history_str WHERE (UNIX_TIMESTAMP(NOW()) - clock) > (@history_interval * 24 * 60 * 60); SELECT count(itemid) AS history_text FROM history_text WHERE (UNIX_TIMESTAMP(NOW()) - clock) > (@history_interval * 24 * 60 * 60); SELECT count(itemid) AS history_log FROM history_log WHERE (UNIX_TIMESTAMP(NOW()) - clock) > (@history_interval * 24 * 60 * 60); SELECT count(itemid) AS trends FROM trends WHERE (UNIX_TIMESTAMP(NOW()) - clock) > (@trends_interval * 24 * 60 * 60); SELECT count(itemid) AS trends_uint FROM trends_uint WHERE (UNIX_TIMESTAMP(NOW()) - clock) > (@trends_interval * 24 * 60 * 60);
После того как определились какую таблицу необходимо почистить, необходимо выполнить (пример ниже очистит все таблицы), исходя из нужного интервала (в днях):
Сначала остановим zabbix
service zabbix-server stop
-- intervals in days SET @history_interval = 3; SET @trends_interval = 10; 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);
Если по каким-то причинам запрос на выборочную очистку не выполнился, то можно удалить всё содержимое необходимой таблицы, например:
TRUNCATE TABLE history_uint;
Запросы в базу были взяты с https://github.com/burner1024/zabbix-sql
Если конечной целью являлось не уменьшение базы, а уменьшение занятого дискового пространства, то необходимо сделать экспорт всех баз, удалить базу и сделать импорт.
Экспорт всех баз:
mysqldump -u root -p --all-databases > /root/all_database.sql
Так же можно сразу сжимать базу:
mysqldump -u root -p --all-databases | gzip > /root/all_database.sql.gz
После экспорта выполнить остановку mysql:
Для Mysql:
service mysqld stop
Для MariaDB:
servce mariadb stop
Удалить файлы базы (при необходимости, можно перенести или переименовать):
rm /var/lib/mysql/ibdata1 rm /var/lib/mysql/ib_logfile0 rm /var/lib/mysql/ib_logfile1
После чего можно запустить mysql сервер:
Для Mysql:
service mysqld start
Для MariaDB:
servce mariadb start
Импорт всех баз:
mysql -u root -p < /root/all_database.sql
Импорт сжатой базы:
gunzip < /root/all_database.sql.gz | mysql -u root -pPASSWORD
или
zcat /root/all_database.sql.gz | mysql -u root -pPASSWORD
После успешного импорта, запускаем zabbix:
service zabbix-server start
Добавить комментарий