Ручной 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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *