Работая с Zabbix, со временем появляется проблема связанная с отсутствием свободного места на сервере. Это связано с хранением большого объема данных. Начав изучать систему, мы нашли, что файл ibdata1 очень сильно разросся. Погуглив и почитав различные форумы, мы нашли пару решений.
1) Сократить период хранения данных в базе и использовать Housekeeper
2) Разбить файл ibdata1 на несколько файлов.
Как говорится начнем с конца, а именно с файла ibdata1.
Файл ibdata1 является частью InnoDB, и хранит в себе данные таблиц, их индексы и другую служебную информацию. Со временем – этот файл может увеличиться до совсем неприличных размеров. Что бы упростить работу с этим файлов – можно разделить его, создав отдельный файл для каждой базы данных и таблицы, с помощью опции innodb_file_per_table.
Перейдем к настройке:
Как и раньше наш Zabbix крутится на ОС Ubuntu 14.10
Узнаем какая у нас версия MySQL
sudo mysql --version
На выводе получаем
mysql Ver 14.14 Distrib 5.5.41, for debian-linux-gnu (x86_64) using readline 6.3
Начиная с версии 5.6 опция innodb_file_per_table включена по умолчанию, но т.к. у нас версия MySQL 5.5, то придется сделать некоторые манипуляции.
Создадим директорию куда будут сохранятся бэкапы:
sudo mkdir -p /data/mysql/backup
Даем временные права на папку
sudo chmod 777 /data/mysql/backup
cd /data/mysql/backup
Останавливаем сервис Zabbix
sudo service zabbix-server stop
Далее создадим резервную копию всех имеющихся баз данных.
mysqldump -uroot -p -ERA --flush-privileges > backupmysql.sql
Проверяем созданный файл.
ls -la
-rw-rw-r-- 1 zabbix zabbix 2971988984 июля 20 12:16 backupmysql.sql
Смотрим какие базы данных у нас есть.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| zabbix |
+--------------------+
4 rows in set (0.01 sec)
Далее удаляем все базы данных, кроме mysql и information_schema.
mysql -uroot -p -e "show databases" | grep -v Database | grep -v mysql| grep -v information_schema | gawk '{print "drop database " $1 "; select sleep(0.1);"}' | mysql -uroot -p
Проверяем базы:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
+--------------------+
2 rows in set (0.00 sec)
Все удалилось.
Тормозим сервис MySQL.
sudo service mysqld stop
Далее удаляем старые файлы.
sudo rm /var/lib/mysql/ibdata1
sudo rm /var/lib/mysql/ib_logfile0
sudo rm /var/lib/mysql/ib_logfile1
Далее редактируем файл /etc/mysql/my.cnf
sudo nano /etc/mysql/my.cnf
В блоке [mysqld] добавляем строку:
innodb_file_per_table = 1
innodb_data_file_path=ibdata1:10M:autoextend:max:15G
Тут указывается, что InnoDB должен создавать отдельные файлы .ibd и .frm для хранения информации и индексов для каждой таблица, вместо того, что бы хранить их все в одном файле
Второй параметр – задаёт размещение файла ibdata1 (т.к. путь не указан – будет использоваться “хранилище” MySQL – /var/lib/mysql), с начальным размером в 10МБ, и автоматическим увеличением при необходимости до максимум 15ГБ
Можно указать отдельный путь хранения файлов, например на новом дисковом пространстве:
innodb_data_file_path=/data/ibdata1:2000M;/data/ibdata2:2000M /data/ibdata3:100M:autoextend:max:2000M
Указанная команда создаст 3 файла ibdata1, ibdata2 по 2Гб каждый и файл ibdata3 размером 100Мб. Если этого будет мало, файл ibdata3 будет рости до 2Гб.
Запускаем сервис MySQL.
sudo service mysql start
Восстанавливаем базы данных.
sudo mysql -uroot -p < /data/mysql/backup/backupmysql.sql
Запускаем утилитку MySQL_Upgrade, для генерации новой базы performance_schema.
mysql_upgrade -uroot -p --force
Теперь у нас каждая база хранится в отдельном файле, при этом мы освободили место.
Теперь рассмотрим, как сократить период хранения данных в Zabbix.
В GUI Zabbix переходим в каталог Administration->General->Housekeeping.
Все значения переводим в 15, т.е. наши данные будут хранится в БД 15 дней, т.е. сама база будет очень медленно расти.
Необходимо, чтобы стояли все галки Enable internal housekeeping, таким образом сам Zabbix будет чистить базу MySQL от старых данных.