Проверка неиспользуемых записей в БД zabbix

Выявление больших таблиц

БД на момент исследования занимала на диске 95G. Смотрим какой размер занимают таблицы СУБД zabbix, хранящие статистику.

SELECT table_name AS `Table`, round(((data_length + index_length) / 1024 / 1024 / 1024 ), 2) `Size in GB` FROM information_schema.TABLES WHERE table_schema = "zabbix" and table_name like "%history%";

Смотрим кол-во записей в таблице history_uint, не имеющих активных записей в таблице контролируемых ресурсов.

SELECT count(itemid) AS history_uint FROM history_uint WHERE itemid NOT IN (SELECT itemid FROM items WHERE status='0');

Удаляем их:

DELETE FROM history_uint WHERE itemid NOT IN (SELECT itemid FROM items WHERE status='0');

Смотрим, с какого времени в нашей БД есть стат.информация

SELECT FROM_UNIXTIME(MIN(clock)) FROM history_uint;

Удаление всех записей в истории метрик, для которых нет соответствия в активной таблице метрик:

delete FROM history_uint WHERE itemid NOT IN (SELECT distinct itemid FROM items);
delete FROM history WHERE itemid NOT IN (SELECT distinct itemid FROM items);

Удаление устаревшей информации в zabbix

Для примера удаляем записи старше 180 дней.

В большинстве случаев достаточно этого:

DELETE FROM history_uint WHERE clock < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 180 DAY));
DELETE FROM history WHERE clock < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 180 DAY));

Для большей корректности можно почистить еще эти таблицы, но выигрыша по месту на диске это не даст:

DELETE FROM trends_uint WHERE clock < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 180 DAY));
DELETE FROM trends WHERE clock < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 180 DAY));
DELETE FROM events WHERE clock < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 180 DAY));
DELETE FROM alerts WHERE clock < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 180 DAY));