Миграция баз данных PostgreSQL в облачные базы данных
Вы можете перенести данные из своей базы данных PostgreSQL в облачные базы данных Selectel с помощью логической репликации или с помощью логического дампа.
Логическая репликация
В логической репликации используется модель публикаций и подписок с одним или несколькими подписчиками. Они подписываются на одну или несколько публикаций на публикующем узле. На внешнем исходном кластере PostgreSQL создается публикация, на которую подписывается принимающий кластер облачных баз данных.
- Подготовьте исходный кластер.
- Перенесите схему базы данных.
- Создайте публикацию на исходном кластере.
- Создайте подписку на принимающем кластере.
Подготовить исходный кластер
-
Добавьте пользователю с доступом к реплицируемым данным привилегию replication:
ALTER ROLE <user_name> WITH REPLICATION;
Укажите
<user_name>
— имя пользователя. -
В файле postgresql.conf установите для уровня логирования (Write Ahead Log) значение logical:
wal_level = logical
-
В файле pg_hba.conf настройте аутентификацию:
host all all <host> md5 host replication all <host> md5
Укажите
<host>
— IP-адрес или DNS-имя мастер-хоста принимающего кластера. -
Перезапустите PostgreSQL для применения изменений:
systemctl restart postgresql
Перенести схему базы данных
На исходном и принимающем кластере должна быть одинаковая схема базы данных.
-
Создайте дамп схемы на исходном кластере с помощью утилиты pg_dump:
pg_dump \ -h <host> \ -p <port> \ -d <database_name> \ -U <user_name> \ --schema-only \ --no-privileges \ --no-subscriptions \ --no-publications \ -Fd -f <dump_directory>
Укажите:
<host>
— IP-адрес или DNS-имя мастер-хоста исходного кластера;<port>
— порт;<database_name>
— имя базы данных;<user_name>
— имя пользователя базы данных;<dump_directory>
— путь до дампа.
-
Восстановите схему из дампа на принимающем кластере с помощью утилиты pg_restore:
pg_restore \ -Fd -v \ --single-transaction -s \ --no-privileges \ -O \ -h <host> \ -U <user_name> \ -p 6432 \ -d <database_name> \ <dump_directory>
Укажите:
<host>
— IP-адрес или DNS-имя хоста принимающего кластера;<user_name>
— имя пользователя базы данных;<database_name>
— имя базы данных;<dump_directory>
— путь до дампа.
Создать публикацию на исходном кластере
Для создания публикации сразу для всех таблиц нужны права суперпользователя.
Создайте публикацию для таблиц, которые вы хотите перенести:
CREATE PUBLICATION <publication_name> FOR ALL TABLES;
Укажите <publication_name>
— имя публикации.
Создать подписку на принимающем кластере
В принимающем кластере облачных баз данных подписки может использовать только пользователь с ролью dbaas_admin.
-
Создайте подписку от имени пользователя с ролью dbaas_admin:
CREATE SUBSCRIPTION <subscription_name> CONNECTION \ 'host=<host> \ port=<port> \ dbname=<database_name> \ user=<user_name> \ password=<password> \ sslmode=verify-ca' \ PUBLICATION <publication_name>;
Укажите:
<subscription_name>
— имя подписки;<host>
— IP-адрес или DNS-имя мастер-хоста исходного кластера;<port>
— порт;<user_name>
— имя пользователя базы данных;<password>
— пароль пользователя;<database_name>
— имя базы данных;<publication_name>
— имя публикации.
-
Вы можете следить за статусом репликации с помощью каталога pg_subscription_rel:
SELECT * FROM pg_subscription_rel;
Общее состояние репликации вы можете увидеть в представлениях pg_stat_subscription и pg_stat_replication для подписок и публикаций соответственно.
-
Последовательности (sequences) не реплицируются, поэтому перед переносом нагрузки на принимающий кластер восстановите на нем дамп с sequences, если они используются. Также перед переносом нагрузки удалите подписку в принимающем кластере:
DROP SUBSCRIPTION <subscription_name>;
Укажите
<subscription_name>
— имя подписки.
Логический дамп
Создайте дамп (файл с командами для восстановления) базы данных в исходном кластере и восстановите дамп в принимающем кластере.
Вы можете создать SQL-дамп всех баз данных (сохранятся имя, таблицы, индексы и внешние ключи) или дамп в кастомном формате (например, можно восстановить только схему или данные специфичной таблицы).
SQL-дамп
-
Создайте дамп базы данных в исходном кластере с помощью утилиты pg_dump:
pg_dump \ -h <host> \ -U <user_name> \ -d <database_name> \ -f dump.sql
Укажите:
<host>
— IP-адрес или DNS-имя мастер-хоста исходного кластера;<user_name>
— имя пользователя;<database_name>
— имя базы данных.
-
Восстановите дамп в принимающем кластере с помощью утилиты psql:
psql \ -f dump.sql \ -h <host> \ -p 6432 \ -U <user_name> \ -d <database_name>
Укажите:
<host>
— IP-адрес или DNS-имя мастер-хоста принимающего кластера;<user_name>
— имя пользователя базы данных;<database_name>
— имя базы данных.
Кастомный дамп
Копия базы данных в кастомном формате по умолчанию сжимается.
-
Создайте дамп базы данных в исходном кластере с помощью утилиты pg_dump:
pg_dump \ -Fc -v \ -h <host> \ -U <user_name> \ <database_name> > archive.dump
Укажите:
<host>
— IP-адрес или DNS-имя мастер-хоста исходного кластера;<user_name>
— имя пользователя базы данных;<database_name>
— имя базы данных.
-
Восстановите дамп в принимающем кластере с помощью утилиты pg_restore:
pg_restore \ -v -h <host> \ -U <user_name> -d <database_name> archive.dump
Укажите:
<host>
— IP-адрес или DNS-имя мастер-хоста принимающего кластера;<user_name>
— имя пользователя базы данных;<database_name>
— имя базы данных.