Автор: Сергей
Zabbix + Housekeeper + PostgreSQL + Vacuum
Столкнулся с проблемой при удалении устаревших данных в базе zabbiх через housekeeper. Autovacuum Postgresql не справлялся. База zabbix продолжала расти и начинала подтормаживать. Исторически так сложилось что не кто не обращал особо внимание на эти проблемы до момента пока все не стало жутко тормозить. Когда спохватились то места уже не хватало на машине чтоб сделать VACUUM FULL для таблицы history_uint. Только после этого началось шевеление в сторону решения проблемы, на тот момент база разраслась до размера больше чем 120GB.
Первым делом отключил autovacuum в файле:
- cat /var/lib/pgsql/data/postgresql.conf
было:
- #autovacuum = on
стало:
- autovacuum = off
Теперь когда PostgreSQL не осуществляет более автоматическую разметку высвобожденного пространства и оптимизацию таблиц, настроил через сron ночью раз в неделю:
- crontab -u postgres -e
После чего добавил строку:
- 5 3 * * 1 vacuumdb --quiet --analyze --dbname=zabbix
Команда выше выше делала только разметку высвабодившегося пространства. Это позволило стабилизировать размер базы, она перестала расти.
Но для высвобождения диского пространства этого было не достаточно. Нужно было запускать
олее глубокое \"вакуумирование\", которое буквально высвободит занятое пустыми блоками дисковое пространство; но для этого потребуется блокировка базы от клиентских обращений. Это можно было сделать командой:
- vacuumdb -U postgres --verbose --analyze --full --dbname=zabbix
Но для этого не было места на диске и его нужно было либо разширять либо сделать то что сделал я)).
1. Слить таблицу которая занимала кучу места. С архивацией таблица сжалась почти в 20 раз.
- pg_dump --host localhost --port 5432 --username zabbix --table history_uint -d zabbix | gzip -9 > /home/history_uint.sql.gz
2. Удалить таблицу в базе или очистить от данных не удаляя саму таблицу.
3. Востановить данные из слитой таблицы в базу zabbix
- zcat /home/history_uint.sql.gz | psql --host localhost --username zabbix zabbix
После чего я б еще раз в месяц добавил cron полную очистку которая освободит пространство:
- vacuumdb -U postgres --verbose --analyze --full --dbname=zabbix