Миграция базы данных из Managed Service for PostgreSQL
Кластер Managed Service for PostgreSQL поддерживает логическую репликацию. Это позволяет мигрировать базы данных встроенными средствами PostgreSQL между разными кластерами PostgreSQL версий 10 и выше. В том числе поддерживается миграция между разными версиями: например, можно перенести базы из PostgreSQL версии 11 в версию 13.
Примечание
Если вы используете кластеры более старых версий, то можно мигрировать базу, создав дамп и затем восстановившись из него.
Этот сценарий использования описывает, как перенести базу данных из сервиса Managed Service for PostgreSQL в другой кластер PostgreSQL с помощью логической репликации.
Чтобы мигрировать базу данных из кластера-источника Managed Service for PostgreSQL в кластер-приемник PostgreSQL:
- Перенесите схему базы данных.
- Настройте пользователя для управления репликацией на кластере-источнике.
- Создайте публикацию на кластере-источнике.
- Создайте подписку на кластере-приемнике.
- Отслеживайте процесс миграции до его завершения.
- Закончите миграцию.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
-
Убедитесь, что все хосты кластера-источника доступны по публичному IP-адресу, чтобы кластер-приемник мог подключаться к источнику. Подробнее см. в разделе Создание PostgreSQL-кластера.
-
Установите на хосты кластера-приемника клиентские SSL-сертификаты Managed Service for PostgreSQL. Они требуются для успешного подключения к публично доступному кластеру-источнику.
-
При необходимости настройте межсетевой экран (firewall) и группы безопасности, чтобы можно было подключаться из кластера-приемника к кластеру-источнику, а также к каждому кластеру в отдельности (например, с помощью утилиты psql). Группы безопасности находятся на стадии Preview.
-
Убедитесь, что с хостов кластера-приемника можно подключиться к хостам кластера-источника.
-
Убедитесь, что можно подключиться к кластеру-источнику с помощью 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, на источнике — с помощью представления pg_stat_replication.
Закончите миграцию
После завершения процесса репликации:
-
Запретите запись в смигрированную базу данных на кластере-источнике.
-
Перенесите последовательности (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.