文档

一键建仓

更新时间:

AnalyticDB PostgreSQL版的一键建仓功能支持将RDS PostgreSQL实例中的数据同步到AnalyticDB PostgreSQL版中。您只需要在RDS PostgreSQL侧创建发布(PUBLICATION),在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

一键建仓任务的名称。

conninfo

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;

相关文档

  • 更多关于RDS PostgreSQL实例创建PUBLICATION的信息,请参见逻辑订阅

  • 通过一键建仓同步完数据后,您可以使用AnalyticDB PostgreSQL版向量分析实时物化视图等功能分析数据。

  • 本页导读 (1)
文档反馈