Проверка неиспользуемых записей в БД 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 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));