Основано на статье 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
Спасибо!
Очень помогло!