№ 11067 В разделе "Sysadmin"
от July 10th, 2020,
В подшивках: Linux, PostgreSQL, Zabbix
Чтобы полностью понять принцип работы логической репликации нужно прочитать документацию. Если кратко, то логическая репликация передает не бинарные данные, а запросы INSERT, UPDATE, DELETE или их сочетание, что позволяет тонко управлять реплицируемыми данными, а также делать это между разными мажорными версиями СУБД. В моем случае я буду мигрировать с 10й версии на 12ю с маленьким даунтаймом. Вся концепция репликации строится на публикациях изменений и подписках, причем подписчик сам может публиковать данные уже для своих подписчиков.
На реплицируемой базе данных необходимо создать публикатор:
postgres=# \c zabbix You are now connected to database "zabbix" as user "postgres". zabbix=# CREATE PUBLICATION zbx FOR ALL TABLES; CREATE PUBLICATION
Не забываем в postgresql.conf поставить параметр wal_level = logical
. Теперь можно сдампить текущую схему БД в файл, который позже будет залит в целевую БД.
postgres@boroda:/tmp$ pg_dump -h 127.0.0.1 -p 5432 -s zabbix > zabbix_schema.sql
Для уверенности можно проверить состояние публикатора
zabbix=# \dRp List of publications Name | Owner | All tables | Inserts | Updates | Deletes | Truncates ------+----------+------------+---------+---------+---------+----------- zbx | postgres | t | t | t | t | t (1 row)
А теперь на целевом сервере создадим новую базу, зальем схему и подпишемся на источник данных:
postgres=# create database zabbix; CREATE DATABASE postgres=# create role zabbix; CREATE ROLE
А вот теперь можно и залить схему в новую БД:
postgres@boroda:/tmp$ cat /tmp/zabbix_schema.sql | psql -p 5434 zabbix
Ну вот и пришло время заливаться
postgres=# \c zabbix You are now connected to database "zabbix" as user "postgres". zabbix=# CREATE SUBSCRIPTION zbx CONNECTION 'postgresql://postgres:postgres@127.0.0.1:5432/zabbix' PUBLICATION zbx WITH (slot_name=zbx_slot); NOTICE: created replication slot "zbx_slot" on publisher CREATE SUBSCRIPTION
По умолчанию данные будут автоматически скопированы, но с помощью WITH можно изменить поведение подписки. Обратите внимание, что под репликацию лучше создать отдельного пользователя и ограничить ему доступ по IP в pg_hba.conf, но т.к. оба моих сервера находятся в безопасной среде мне на это пофигу и я копирую данные прямо суперюзером.
Проверим состояние подписки:
zabbix=# \dRs List of subscriptions Name | Owner | Enabled | Publication ------+----------+---------+------------- zbx | postgres | t | {zbx} (1 row)
Проверим начали ли данные передаваться:
zabbix=# select count(*) from hosts; count ------- 53 (1 row)
Все выглядит просто ништяк, данные перекачались в новое место, теперь можно переключать Zabbix со старой базы данных на новую, а потом просто дропнуть подписку.
Не забудьте перестроить индексы мигрировавшей базы данных:
zabbix=# reindex database CONCURRENTLY zabbix;
Fortune cookie: Today's spam: Dermal Patch Technology!
Leave a Reply