Создание логической реплики Аmazon RDS для PostgreSQL в Managed Service for PostgreSQL
Если вы используете сервис Аmazon RDS для PostgreSQL, вы можете создать копию ваших данных в Managed Service for PostgreSQL.
Настройка на стороне Аmazon RDS для PostgreSQL
Доступно для Аmazon RDS для PostgreSQL версии 10.4 и выше.
Важно
Экземпляр БД должен иметь публичный доступ — Public accessibility = yes
.
-
Настройте логическую репликацию.
-
Установите параметр в
parameter group
вашего экземпляра БД:rds.logical_replication = 1
-
Перезапустите кластер для применения изменений.
-
-
Создайте отдельного пользователя с ролью
rds_replication
. Для этого выполните от имени пользователя с рольюrds_superuser
:CREATE ROLE <user> WITH LOGIN PASSWORD <password>; GRANT rds_replication TO <user>;
-
Предоставьте привилегию
SELECT
на все таблицы, участвующие в репликации:GRANT SELECT ON <table>, <table2> TO <user>;
-
Создайте публикацию:
CREATE PUBLICATION pub FOR TABLE <table>, <table2>;
Примечание
Не рекомендуется использовать публикации
FOR ALL TABLES
из-за невозможности отредактировать список таблиц в будущем. -
Добавьте
inbound
правило в VPC security groups.
Например:protocol: tcp, port: 5432, source: 84.201.175.90/32
Где
84.201.175.90
- публичный IP-адрес.
Настройка на стороне Managed Service for PostgreSQL
Важно
Хосты должны иметь публичный доступ.
-
Для создания
subscription
назначьте пользователю рольmdb_admin
:yc managed-postgresql user update {user_name} --grants mdb_admin --cluster-id {cluster_id}
-
На хосте кластера Managed Service for PostgreSQL создайте подписку со строкой подключения к Аmazon RDS:
CREATE SUBSCRIPTION s_data_migration CONNECTION 'host=<адрес сервера Аmazon RDS> port=<порт> user=<имя пользователя> sslmode=prefer dbname=<имя базы данных>' PUBLICATION pub;
Подробнее о создании подписок смотрите в документации PostgreSQL.
Особенности использования логической репликации
-
Изменения схемы базы данных и DDL не реплицируются.
В первую очередь применяйте новые изменения схемы на стороне подписчика, а потом — на стороне публикации.
-
Последовательности не реплицируются.
В составе таблицы реплицируются данные в столбцах
serial
или столбцах идентификации, которые генерируются последовательностями. Но сама последовательность на подписчике будет сохранять стартовое значение.В случае переключения на базу подписчика, необходимо обновить последовательность до последнего значения:
ALTER SEQUENCE serial RESTART WITH <new value>;
-
По умолчанию при создании подписки происходит полное копирование данных из исходных таблиц.
Для ускорения копирования создавайте только
primary key
, а после его завершения создайте все остальные индексы. -
Если на таблице отсутсвует
primary key
, вы будете получать ошибки:ERROR: 55000: cannot update table "t2" because it does not have a replica identity and publishes updates HINT: To enable updating the table, set REPLICA IDENTITY using ALTER TABLE.
Для работы репликации
UPDATE
,DELETE
на таблицах безprimary key
необходимо изменитьREPLICA IDENTITY
:alter table t2 replica identity full;
-
В PostgreSQL версии 10 команда
TRUNCATE
не реплицируется.Вместо этого можно использовать
DELETE
. -
Внешние таблицы не реплицируются.
-
Ошибки, связанные с работой логической репликации смотрите в логах Managed Service for PostgreSQL.
-
Если потребуется пересоздать подписку, то для предотвращения ошибок ограничения
primary key
, очистите таблицы на стороне подписчика.