您可以通过一键建仓功能将RDS PostgreSQL实例中的数据同步至AnalyticDB PostgreSQL版中。

功能介绍

AnalyticDB PostgreSQL版提供了一键建仓功能,支持将RDS PostgreSQL实例中的数据同步到AnalyticDB PostgreSQL版中。您只需要在RDS PostgreSQL侧创建发布(PUBLICATION),在AnalyticDB PostgreSQL版侧创建一键建仓任务订阅该发布即可将数据从RDS PostgreSQL实例实时同步到AnalyticDB PostgreSQL版

注意事项

  • AnalyticDB PostgreSQL版存储弹性模式实例且内核版本为V6.3.8.0及以上,才支持一键建仓功能。
  • 一键建仓仅支持数据库类型为PostgreSQL 10.0以上版本的RDS PostgreSQL实例。
  • RDS PostgreSQL实例与AnalyticDB PostgreSQL版实例需要属于同一VPC。
  • 同步对象为数据表。
  • 仅支持同步INSERT、UPDATE、DELETE、TRUNCATE四种语法,不支持同步表结构变更。
  • 目标表与待同步的源表的表结构必须完全一致。
  • RDS PostgreSQL中待同步的源表必须具备主键。
  • 仅支持同步以下数据类型:

    数值类型、字符类型、布尔类型、时间日期类型、枚举类型、GEO类型、INTERNET类型、RANGE类型、JSON类型、BYTEA类型、BIT类型以及以上类型的数组类型。

    说明 其他数据类型可能会导致一键建仓任务中断。
  • RDS PostgreSQL实例中的源表如果使用类似UPDATE/DELETE WHERE CTID = ******的语句更新了数据,将不会同步至AnalyticDB PostgreSQL版的目标表中。

准备工作

  • AnalyticDB PostgreSQL版
    • 已创建AnalyticDB PostgreSQL版实例,创建方法,请参见创建实例
    • 已创建初始账号或高权限账号,创建账号,请参见创建数据库账号
  • RDS PostgreSQL
    • 已创建RDS PostgreSQL实例,创建方法,请参见创建RDS PostgreSQL实例
    • 已创建高权限账号,创建账号,请参见创建账号
    • 已将配置参数wal_level设置为logical,修改配置参数,请参见设置实例参数
      说明 该参数修改后需重启实例才能生效,建议您在业务低谷期进行重启操作。
    • 已将AnalyticDB PostgreSQL版实例的内网地址加入RDS PostgreSQL实例的白名单。

SQL语法

以下内容将为您介绍创建、修改、删除一键建仓任务的SQL语法。

创建一键建仓任务

语法

CREATE SUBSCRIPTION subscription_name
    CONNECTION 'conninfo'
    PUBLICATION publication_name [, ...]
    [ WITH ( subscription_parameter [= value] [, ... ] ) ]

参数说明如下:

参数 说明
subscription_name 一键建仓任务的名称。
conninof RDS PostgreSQL实例的连接信息,由连接地址、端口号、数据库名称、账号和密码组成。连接信息的获取方法如下:
  • 连接地址和端口:RDS PostgreSQL实例的连接地址和端口。获取方法请参见查看或修改连接地址和端口
  • 数据库名称:待同步的源表所在的数据库的名称。
  • 账号和密码:拥有以上数据库读写权限的账号和密码。

示例如下:host=pgm-bp*******************.pg.rds.aliyuncs.com port=5432 dbname=*** user=*** password=***

publication_name RDS PostgreSQL实例上发布的名称。
subscription_parameter 一键建仓任务的可选参数,当前仅支持copy_data (boolean)参数。

copy_data (boolean):一键建仓任务建立时,是否将源表中已有的数据同步到目标表中。取值如下:

  • true:同步源表中已有数据。
  • false:不同步源表中已有数据。

修改一键建仓任务

  • 刷新一键建仓任务的同步对象

    当RDS PostgreSQL实例往发布中添加了新的源表时,必须执行REFRESH操作才能让目标表订阅到新增源表的数据。

    语法

    ALTER SUBSCRIPTION subscription_name REFRESH PUBLICATION [ WITH ( refresh_option [= value] [, ... ] ) ]

    参数说明如下:

    参数 说明
    subscription_name 一键建仓任务的名称。
    refresh_option 一键建仓任务的可选参数,当前仅支持copy_data (boolean)参数。

    copy_data (boolean):一键建仓任务建立时,是否将源表中已有的数据同步到目标表中。取值如下:

    • true:同步源表中已有数据。
    • false:不同步源表中已有数据。
  • 启动已停止的一键建仓任务

    语法

    ALTER SUBSCRIPTION subscription_name ENABLE

    参数说明如下:

    参数 说明
    subscription_name 一键建仓任务的名称。
  • 停止当前一键建仓任务

    语法

    ALTER SUBSCRIPTION subscription_name DISABLE

    参数说明如下:

    参数 说明
    subscription_name 一键建仓任务的名称。
  • 修改一键建仓任务所属的用户

    语法

    ALTER SUBSCRIPTION subscription_name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }

    参数说明如下:

    参数 说明
    subscription_name 一键建仓任务的名称。
    new_owner 一键建仓任务的所属的新用户。
  • 修改一键建仓任务的名称

    语法

    ALTER SUBSCRIPTION subscription_name RENAME TO new_name

    参数说明如下:

    参数 说明
    subscription_name 一键建仓任务的名称。
    new_name 一键建仓任务的新名称。

删除一键建仓任务

语法

DROP SUBSCRIPTION [ IF EXISTS ] subscription_name

参数说明如下:

参数 说明
subscription_name 需要删除的一键建仓任务名称。

更多语法的使用说明,请参见PostgreSQL官方文档

开始数据同步

RDS PostgreSQL实例上的表logical_tb1需要同步到AnalyticDB PostgreSQL版实例。

  1. 在RDS PostgreSQL实例上创建测试表logical_tb1。
    CREATE TABLE logical_tb1(a int primary key, b varchar(20));
  2. 在RDS PostgreSQL实例上创建发布pub1,并将表logical_tb1加入发布pub1。
    CREATE PUBLICATION pub1 FOR TABLE logical_tb1;
  3. AnalyticDB PostgreSQL版实例上创建与RDS PostgreSQL实例源表结构相同的目标表。
    CREATE TABLE logical_tb1(a int primary key, b varchar(20));
  4. AnalyticDB PostgreSQL版实例上创建一键建仓任务。
    • 同步源表中已有数据和新增数据,语句如下:
      CREATE SUBSCRIPTION sub1 CONNECTION 'host=****** port=5432 user=*** dbname=*** password=***' PUBLICATION pub1;
    • 不同步源表中已有数据,仅同步新增数据,语句如下:
      CREATE SUBSCRIPTION sub1 CONNECTION 'host=****** port=5432 user=*** dbname=*** password=***' PUBLICATION pub1 WITH(copy_data = false);

修改同步表

AnalyticDB PostgreSQL版实例已创建一键建仓任务sub1来同步RDS PostgreSQL实例发布pub1中的表logical_tb1,现在需要同步另一张表logical_tb2到AnalyticDB PostgreSQL版实例。

  1. 在RDS PostgreSQL实例上创建测试表logical_tb2。
    CREATE TABLE logical_tb2(id int primary key, name varchar(20), age int);
  2. 在RDS PostgreSQL实例上将表logical_tb2加入发布pub1。
    ALTER PUBLICATION pub1 ADD TABLE logical_tb2;
  3. AnalyticDB PostgreSQL版实例上创建与RDS PostgreSQL实例源表结构相同的目标表。
    CREATE TABLE logical_tb2(id int primary key, name varchar(20), age int);
  4. AnalyticDB PostgreSQL版实例上刷新订阅的发布信息,新增的logical_tb2表即可同步至AnalyticDB PostgreSQL版实例。
    ALTER SUBSCRIPTION sub1 REFRESH PUBLICATION;

停止数据同步

RDS PostgreSQL实例上已创建发布pub1,发布中包含logical_tb1和logical_tb2两张表,表logical_tb1继续同步,表logical_tb2不再同步。

  1. 在RDS PostgreSQL实例上将不需要同步的表logical_tb2从发布pub1中删除。
    ALTER PUBLICATION pub1 DROP TABLE logical_tb2;
  2. AnalyticDB PostgreSQL版实例上刷新订阅的发布信息,表logical_tb1可继续同步,表logical_tb2不再同步。
    ALTER SUBSCRIPTION sub1 REFRESH PUBLICATION;

查询一键建仓任务状态

查询一键建仓任务是否完成

您可以在RDS PostgreSQL实例上执行以下语句查询一键建仓任务是否完成:

SELECT confirmed_flush_lsn = pg_current_wal_lsn() FROM pg_replication_slots WHERE slot_name = '<subscription_name>';

subscription_name为您需要查询的一键建仓任务名称。

返回结果说明如下:

  • 如果返回结果为t,表示一键建仓任务已完成。
  • 如果返回结果为f,表示一键建仓任务未完成。
  • 如果返回结果为空,表示一键建仓任务不存在或状态异常。

查询当前一键建仓任务状态

您可以在RDS PostgreSQL实例上执行以下语句查询一键建仓任务状态:

SELECT active FROM pg_replication_slots WHERE slot_name='<subscription_name>';

subscription_name为您需要查询的一键建仓任务名称。

返回结果说明如下:

  • 如果返回结果为t,表示一键建仓任务状态正常。
  • 如果返回结果为f,表示一键建仓任务状态异常。
  • 如果返回结果为空,表示一键建仓任务不存在。

查询AnalyticDB PostgreSQL版实例中一键建仓任务数量

您可以在AnalyticDB PostgreSQL版上执行以下语句查看当前实例中存在多少个一键建仓任务:

SELECT count(*) FROM pg_subscription WHERE subenabled = true;