Миграция Zabbix из MySQL в PostgreSQL

Основано на статье http://vladimir-stupin.blogspot.com/2015/07/zabbix-mysql-postgresql.html автору которой я весьма признателен, другие варианты миграции были гораздо хуже. Операция будет производится на Debian 9 Stretch. Прочие исходные данные:

  • zabbix-server — 3.4.10
  • mariadb — 10.1.26
  • объем БД zabbix — 6GB

Для миграции понадобится сервер с PostgreSQL и утилита pgloader, свежие версии и того и другого доступны в оффициальном репозитории PostgreSQL, инструкция по настройке репозитория. Считаем что репозиторий подключен, ставим PostgreSQL и pgloader. В момент когда я проворачивал операцию (2018.09.25), pgloader (версии 3.5.2) не работал корректно с PostgreSQL 10 см. issue #810 поэтому будем использовать PG 9.6

apt-get install postgresql-9.6 pgloader

Создадим каталог в котором будем выполнять всю работу

mkdir ~/zabbix-mysql2pgsql
cd ~/zabbix-mysql2pgsql

Далее нам понадобится файл с SQL схемой Postgres из дистрибутива Zabbix. Получить его можно примерно так: скачать deb пакет и распаковать его.

apt-get download zabbix-server-pgsql
dpkg -x zabbix-server-pgsql_* ./zabbix-server-pgsql

Распаковываем сжатый sql дамп и разделяем его на 2 части, одна будет содержать команды CREATE для создания таблиц и вторая ALTER для установки связей между таблицами. Обратите внимание что команды ниже (кроме распаковки) основаны на допущении, что все CREATE идут с начала файла и до INSERT INTO dbversion… возможно в вашем случае это не так и потребуется разделить файл иными методами.

gzip -dc ./zabbix-server-pgsql/usr/share/doc/zabbix-server-pgsql/create.sql.gz > schema.sql
sed -n '/CREATE.*/,/INSERT.*$/p' schema.sql | head -n-1 > create.sql
grep ALTER schema.sql > alter.sql

Создаем пользователя и БД в PostgreSQL, пароль будет запрошен на первом шаге. Официальная инструкция здесь.

su -u postgres createuser --pwprompt zabbix
su -u postgres createdb -O zabbix zabbix

Все параметры pgloader записываем в файл, обратите внимание на ALTER SCHEMA 'zabbix' RENAME TO 'public' здесь zabbix это имя вашей БД в MySQL см. здесь 4931604

cat > zabbix.load << EOF
LOAD DATABASE
  FROM mysql://zabbix:zabbix_password@localhost/zabbix
  INTO postgresql://zabbix:zabbix_password@localhost/zabbix
WITH include no drop,
     truncate,
     create no tables,
     create no indexes,
     no foreign keys,
     reset sequences,
     data only
SET maintenance_work_mem TO '128MB', work_mem to '12MB'
ALTER SCHEMA 'zabbix' RENAME TO 'public'
BEFORE LOAD EXECUTE createonly.sql
AFTER LOAD EXECUTE alter.sql;
EOF

Останавливаем Zabbix сервер, запускаем pgloader и ждем результата. В процессе вероятно будут предупреждения, это нормально т.к. типы данных отличаются в MySQL и PostgreSQL.

systemctl stop zabbix-server
pgloader zabbix.load

Стоит заметить что в PostgreSQL база увеличилась в размерах 6GB в MySQL превратились в 7.2GB в PostgreSQL, так что вам необходимо иметь свободное дисковое пространство, равное примерно 120-130% от того, что занимает ваша БД MySQL. Зато avg iowait уменьшился — 5% с MySQL и 1% с PostgreSQL.

Осталось следующее, удалить Zabbix сервер с поддержкой, MySQL, установить версию с поддержкой PostgreSQL, установить пакет PHP для поддержки Postgres, сменить тип БД в конфиге Zabbix Frontend. Предполагаем что пароль для новой БД был задан такой же как и для старой и его менять не надо. Если пароль другой, меняем его в конфигах Zabbix server и frontend.

apt-get remove zabbix-server-mysql
apt-get install zabbix-server-pgsql php7.0-pgsql
sed -i'' 's/MYSQL/POSTGRESQL/g' /etc/zabbix/web/zabbix.conf.php
sed -i'' 's/DBSocket=.*//g' /etc/zabbix/zabbix_server.conf
systemctl stop mysql
systemctl restart php7.0-fpm
systemctl start zabbix-server
Похожие публикации
  1. Спасибо!

    Очень помогло!

Оставить комментарий


Примечание - Вы можете использовать эти HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>