Это старая версия документа!
Миграция Zabbix с MySQL на PostgreSQL
Предыстория:
Zabbix сервер начал что-то периодически нагружать процессор под 30-40%. Вывод htop на сервере показал, что виновник MySQL. Он давал периодами нагрузку под 100%. Было решено перейти на PostgreSQL, ну и заодно пощупать TimescaleDB.
Приступим.
Установка 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
Все предупреждающие сообщения игнорируем. Миграция займет некоторое время, в зависимости от размера и т.п.