===== Миграция Zabbix с MySQL на PostgreSQL ===== Предыстория: Zabbix сервер начал что-то периодически нагружать процессор под 30-40%. Вывод **htop** на сервере показал, что виновник MySQL. Он давал периодами нагрузку под 100%. Было решено перейти на PostgreSQL, ну и заодно пощупать TimescaleDB. Сервер у нас трудится под **Ubuntu Server 24.04**, **Zabbix 7.0.8**. Приступим. ==== Установка PostgreSQL ==== Сначала подключаем репозиторий PostgreSQL sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' Далее добавляем ключ wget --quiet -O - https://wwww.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - Если получаем сообщение Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)). То должно помочь apt-key export ACCC4CF8 | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/postgresql.gpg Мне не помогло:) Выкрутился так: sudo wget http://apt.postgresql.org/pub/repos/apt/ACCC4CF8.asc А затем: sudo apt-key add ACCC4CF8.asc Ну и ставим сам PostgreSQL sudo apt -y install postgresql Далее ставим утилиту **pgloader** для миграции данных. Собирать будем её из исходников. Ставим зависимости: sudo apt install sbcl unzip libsqlite3-dev gawk curl make freetds-dev libzip-dev Качаем актуальную версию. На текущий момент **3.6.9** wget https://github.com/dimitri/pgloader/archive/refs/tags/v3.6.9.tar.gz Распаковываем tar xvf v3.6.9.tar.gz Переходим в распакованный каталог cd pgloader-3.6.9 И спобираем make pgloader Ну и для приличия перемещаем sudo mv ./build/bin/pgloader /usr/local/bin/ ==== Подготовка к миграции ==== Создаем временный каталог для исходников нашей версии Zabbix mkdir /tmp/zabbix-db-migration/ && cd $_ Скачиваем архив с нашей версией Zabbix с официального сайта wget https://cdn.zabbix.com/zabbix/sources/stable/7.0/zabbix-7.0.8.tar.gz Распаковываем tar -zxvf zabbix-7.0.8.tar.gz Переходим в распакованный каталог, где у нас лежит схема для PostgreSQL cd /tmp/zabbix-db-migration/zabbix-7.0.8/database/postgresql/ Выбираем из схемы только операции создания таблиц и триггеров и сохраняем их в отдельный файл в корне папки для миграции grep -v 'ALTER TABLE ONLY' schema.sql | grep -v INSERT | grep -v 'CREATE INDEX' | grep -v 'CREATE UNIQUE INDEX' > /tmp/zabbix-db-migration/create_tables.sql Удаляем из него строки, отвечающие за создания триггеров sed -i '/create\ or\ replace\ function/,$d' /tmp/zabbix-db-migration/create_tables.sql Из оригинального файла схемы забираем относящееся к триггерам awk '/INSERT INTO dbversion/{p=1;next} /ALTER TABLE/{p=0} p' schema.sql > /tmp/zabbix-db-migration/triggers.sql Теперь все относящееся к индексам grep -E 'CREATE INDEX|CREATE UNIQUE INDEX' schema.sql > /tmp/zabbix-db-migration/create_index.sql И еще ALTER grep 'ALTER TABLE ONLY' schema.sql > /tmp/zabbix-db-migration/alter_table.sql ==== Настраиваем PostgreSQL ==== Создаем пользователя базы Zabbix. Я создавал с таким же именем и паролем, как в MySQL. sudo -u postgres createuser --pwprompt zabbixrd Далее создаем базу. Тоже с названием не заморачивался и брал такое же, как в MySQL. sudo -u postgres createdb -O zabbixrd zabbixrddb Применяем схему sudo -u postgres psql --host=127.0.0.1 --dbname=zabbixrddb --username=zabbixrd -f /tmp/zabbix-db-migration/create_tables.sql Для работы с **pgloader** временно ставим шифрование md5 sudo -u postgres psql -c "SET password_encryption='md5';" Задаем пароль пользователя введенный выше sudo -u postgres psql -c "ALTER ROLE zabbixrd WITH PASSWORD 'password';" ==== Настраиваем MySQL ==== Для начала поправим файл **/etc/mysql/mysql.comf.d/mysqld.cnf**. Добавим в него: [mysqld] ... default-authentication-plugin=mysql_native_password Перезапускаем службу MySQL systemctl restart mysql Меняем метод входа пользователя Zabbix. Не забываем поставить правильный пароль. mysql -e "ALTER USER 'zabbixrd'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';" Далее создаем файл **/tmp/zabbix-db-migration/pgloader.conf** с таким содержанием LOAD DATABASE FROM mysql://zabbixrd:password@127.0.0.1/zabbixrddb INTO postgresql://zabbixrd:password@127.0.0.1/zabbixrddb WITH include no drop, truncate, create no tables, create no indexes, no foreign keys, reset sequences, data only, prefetch rows = 1000, batch rows = 1000, batch concurrency = 1 ALTER SCHEMA 'zabbixrddb' RENAME TO 'public'; ==== Миграция ==== Останавливаем Zabbix и Apache: sudo systemctl stop zabbix-server apache2 Создаем каталог для данных из MySQL mkdir /tmp/zabbix-db-migration/data Далее запускаем pgloader с конфигурацией, которую создавали выше: pgloader --root-dir=/tmp/zabbix-db-migration/data /tmp/zabbix-db-migration/pgloader.conf Все предупреждающие сообщения игнорируем. Миграция займет некоторое время, в зависимости от размера и т.п. После завершения, возвращаем шифрование. sudo -u postgres psql -c "SET password_encryption='SCRAM-SHA-256';" Снова задаем пользователя sudo -u postgres psql -c "ALTER ROLE zabbixrd WITH PASSWORD 'password';" Создаем схемы: sudo -u postgres psql --host=127.0.0.1 --dbname=zabbixrddb --username=zabbixrd -f /tmp/zabbix-db-migration/create_index.sql sudo -u postgres psql --host=127.0.0.1 --dbname=zabbixrddb --username=zabbixrd -f /tmp/zabbix-db-migration/alter_table.sql sudo -u postgres psql --host=127.0.0.1 --dbname=zabbixrddb --username=zabbixrd -f /tmp/zabbix-db-migration/triggers.sql Ну и рекомендуется сделать VACUUM sudo -u postgres vacuumdb --dbname=zabbixrddb --analyze --username=postgres --jobs=$(grep -c processor /proc/cpuinfo) ==== Тестирование ==== Удаляем поддержку mysql sudo apt remove zabbix-server-mysql На всякий случай сохраняем конфиг **zabbix_server.conf** . Ставим необходимые пакеты sudo apt install zabbix-server-pgsql php8.3-pgsql zabbix-apache-conf Удаляем конфиг mysql для Zabbix sudo rm /etc/zabbix/web/zabbix.conf.php Стартуем Zabbix и Apache sudo systemctl start zabbix-server apache2 Подключаемся к нашему Zabbix через браузер и выполняем его настройку на СУБД PostgreSQL. После этого все должно заработать. Удаляем MysQL и все, что с ним связано. service mysql stop sudo apt purge mysql-server mysql-common mysql-server-core-* mysql-client-core-* sudo rm -Rf /var/lib/mysql/ sudo rm -Rf /etc/mysql/ sudo rm -Rf /var/log/mysql/ sudo deluser --remove-home mysql ==== Установка TimescaleDB ==== А теперь еще одна плюшка. Ставим TimescaleDB для улучшения работы с Zabbix. Подключаем репозиторий echo "deb https://packagecloud.io/timescale/timescaledb/ubuntu/ $(lsb_release -c -s) main" | sudo tee /etc/apt/sources.list.d/timescaledb.list Про ключ не забываем wget --quiet -O - https://packagecloud.io/timescale/timescaledb/gpgkey | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/timescaledb.gpg Обновим список sudo apt update Ставим необходимое sudo apt install timescaledb-2-postgresql-17 timescaledb-2-loader-postgresql-17 Выполняем настройку. Проще всего на все ответить "да". sudo timescaledb-tune Останавливаем сервер Zabbix sudo systemctl stop zabbix-server Перезапустим postgresql sudo systemctl restart postgresql Подключаем расширение к Zabbix echo "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;" | sudo -u postgres psql --dbname=zabbixrddb И выполняем скрипт для конвертации данных. Занимает некоторое время. sudo -u postgres psql --host=127.0.0.1 --dbname=zabbixrddb --username=zabbixrd -f /usr/share/zabbix-sql-scripts/postgresql/timescaledb/schema.sql Запускаем Zabbix sudo systemctl start zabbix-server Помогли в написании источники: https://www.initmax.com/wiki/zabbix-migration-from-mysql-to-postgresql/ https://interface31.ru/tech_it/2024/07/ustanovka-zabbix-7-c-nginx-postgresql-timescaledb-na-ubuntu-server.html https://rutube.ru/video/f393860f271726b94d9a1467a871c1da/