Миграция базы данных из Managed Service for PostgreSQL
Кластер Managed Service for PostgreSQL поддерживает логическую репликацию
Примечание
Если вы используете кластеры более старых версий, то можно мигрировать базу, создав дамп
Этот сценарий использования описывает, как перенести базу данных из сервиса Managed Service for PostgreSQL в другой кластер PostgreSQL с помощью логической репликации.
Чтобы мигрировать базу данных из кластера-источника Managed Service for PostgreSQL в кластер-приемник PostgreSQL:
- Перенесите схему базы данных.
- Настройте пользователя для управления репликацией на кластере-источнике.
- Создайте публикацию на кластере-источнике.
- Создайте подписку на кластере-приемнике.
- Отслеживайте процесс миграции до его завершения.
- Закончите миграцию.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
-
Убедитесь, что все хосты кластера-источника доступны по публичному IP-адресу, чтобы кластер-приемник мог подключаться к источнику. Подробнее см. в разделе Создание кластера.
-
Установите на хосты кластера-приемника клиентские SSL-сертификаты Managed Service for PostgreSQL. Они требуются для успешного подключения к публично доступному кластеру-источнику.
-
При необходимости настройте межсетевой экран (firewall) и группы безопасности, чтобы можно было подключаться из кластера-приемника к кластеру-источнику, а также к каждому кластеру в отдельности (например, с помощью утилиты psql
). -
Убедитесь, что с хостов кластера-приемника можно подключиться к хостам кластера-источника.
-
Убедитесь, что можно подключиться к кластеру-источнику с помощью SSL и к кластеру-приемнику.
-
Убедитесь, что на кластере-приемнике создана пустая база данных, в которую будет проведена миграция.
-
Убедитесь, что в кластере-приемнике существует пользователь с полными правами на доступ к этой базе.
Перенесите схему базы данных
Для успешной работы логической репликации необходимо, чтобы и на источнике, и на приемнике была одинаковая схема базы данных. Чтобы перенести схему базы данных:
-
Сделайте дамп схемы базы данных кластера-источника с помощью утилиты pg_dump
:pg_dump "host=<FQDN_хоста_кластера-источника> port=6432 sslmode=verify-full dbname=<имя_БД> user=<имя_пользователя-владельца_БД>" --schema-only --no-privileges --no-subscriptions --no-publications -Fd -f <директория_для_дампа>
FQDN хоста можно получить со списком хостов в кластере.
-
При необходимости создайте пользователей с нужными правами на доступ к объектам базы данных на кластере-приемнике.
-
Восстановите схему базы данных из дампа на кластере-приемнике с помощью утилиты pg_restore
:pg_restore -Fd -v --single-transaction -s --no-privileges -h <FQDN_хоста-мастера_кластера-приемника> -U <имя_пользователя-владельца_БД> -p 5432 -d <имя_БД> <директория_с_дампом>
Настройте пользователя для управления репликацией на кластере-источнике
PostgreSQL использует модель «публикация-подписка» при выполнении логической репликации: кластер-приемник подписывается на публикацию кластера-источника, чтобы перенести данные. Чтобы успешно подписаться на публикацию, к кластеру-источнику Managed Service for PostgreSQL нужно обращаться от имени пользователя, которому назначена роль для управления логической репликацией. Чтобы настроить такого пользователя:
- Создайте пользователя.
- Назначьте роль
mdb_replication
этому пользователю. - Подключитесь к базе данных, которую нужно мигрировать, от имени владельца базы.
- Выдайте созданному пользователю привилегию на выполнение операции
SELECT
над всеми таблицами базы данных.
После создания подписки подключение к кластеру-источнику со стороны приемника будет осуществляться от имени этого пользователя.
Создайте публикацию на кластере-источнике
-
Подключитесь к хосту-мастеру и к базе данных, которую нужно мигрировать, от имени владельца базы.
-
Создайте публикацию, на которую будет подписываться кластер-приемник:
CREATE PUBLICATION <имя_публикации>;
-
Включите в созданную публикацию все таблицы базы данных:
ALTER PUBLICATION <имя_публикации> ADD TABLE <имя_таблицы_1>; ... ALTER PUBLICATION <имя_публикации> ADD TABLE <имя_таблицы_N>;
Примечание
В кластере Managed Service for PostgreSQL запрещено создание публикации сразу для всех таблиц
CREATE PUBLICATION ... FOR ALL TABLES;
, т.к. это требует привилегий суперпользователя.
Создайте подписку на кластере-приемнике
-
Подключитесь к хосту-мастеру и базе данных, в которую нужно выполнить миграцию, от имени суперпользователя (например,
postgres
). -
Создайте подписку на публикацию кластера-источника:
CREATE SUBSCRIPTION <имя_подписки> CONNECTION 'host=<FQDN_хоста_кластера-источника> port=6432 sslmode=verify-full dbname=<имя_БД_которую_нужно_мигрировать> user=<имя_пользователя_для_управления_репликацией> password=<пароль_пользователя>' PUBLICATION <имя_публикации>;
Начнется процесс миграции данных из базы кластера-источника в базу кластера-приемника.
Отслеживание процесса миграции
Следите за миграцией с помощью каталога pg_subscription_rel
SELECT * FROM pg_subscription_rel;
srsubid | srrelid | srsubstate | srsublsn
---------+---------+------------+----------
...
Рекомендуется следить за статусом репликации по полю srsubstate
этого каталога на кластере-приемнике.
Общий статус репликации на кластере-приемнике можно получить с помощью представления (view) pg_stat_subscription
Закончите миграцию
После завершения процесса репликации:
-
Запретите запись в смигрированную базу данных на кластере-источнике.
-
Перенесите последовательности (sequences), если они есть, из кластера-источника на кластер-приемник с помощью утилит pg_dump и psql:
pg_dump "host=<FQDN_хоста-мастера_кластера-источника> port=6432 sslmode=verify-full dbname=<имя_БД> user=<имя_пользователя-владельца_БД>" --data-only -t '*.*_seq' > <имя_файла_с_sequences>
psql -h <FQDN_хоста-мастера_кластера-приемника> -U <имя_пользователя-владельца_БД> -p 5432 -d <имя_БД> < <имя_файла_с_sequences>
-
Удалите подписку на кластере-приемнике:
DROP SUBSCRIPTION <имя_подписки>;
-
Удалите публикацию на кластере-источнике:
DROP PUBLICATION <имя_публикации>;
-
Удалите пользователя для управления репликацией на кластере-источнике.
Удалите созданные ресурсы
Удалите ресурсы, которые вы больше не будете использовать, чтобы за них не списывалась плата:
- Удалите виртуальную машину.
- Если вы зарезервировали для виртуальной машины публичный статический IP-адрес, удалите его.
- Удалите кластер Yandex Managed Service for PostgreSQL.