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