一键建仓
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版
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实例的连接信息,由连接地址、端口号、数据库名称、账号和密码组成。连接信息的获取方法如下:
示例如下: |
publication_name | RDS PostgreSQL实例上发布的名称。 |
subscription_parameter | 一键建仓任务的可选参数,当前仅支持
|
修改一键建仓任务
刷新一键建仓任务的同步对象
当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版实例。
在RDS PostgreSQL实例上创建测试表logical_tb1。
CREATE TABLE logical_tb1(a int primary key, b varchar(20));
在RDS PostgreSQL实例上创建发布pub1,并将表logical_tb1加入发布pub1。
CREATE PUBLICATION pub1 FOR TABLE logical_tb1;
在AnalyticDB PostgreSQL版实例上创建与RDS PostgreSQL实例源表结构相同的目标表。
CREATE TABLE logical_tb1(a int primary key, b varchar(20));
在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版实例。
在RDS PostgreSQL实例上创建测试表logical_tb2。
CREATE TABLE logical_tb2(id int primary key, name varchar(20), age int);
在RDS PostgreSQL实例上将表logical_tb2加入发布pub1。
ALTER PUBLICATION pub1 ADD TABLE logical_tb2;
在AnalyticDB PostgreSQL版实例上创建与RDS PostgreSQL实例源表结构相同的目标表。
CREATE TABLE logical_tb2(id int primary key, name varchar(20), age int);
在AnalyticDB PostgreSQL版实例上刷新订阅的发布信息,新增的logical_tb2表即可同步至AnalyticDB PostgreSQL版实例。
ALTER SUBSCRIPTION sub1 REFRESH PUBLICATION;
停止数据同步
RDS PostgreSQL实例上已创建发布pub1,发布中包含logical_tb1和logical_tb2两张表,表logical_tb1继续同步,表logical_tb2不再同步。
在RDS PostgreSQL实例上将不需要同步的表logical_tb2从发布pub1中删除。
ALTER PUBLICATION pub1 DROP TABLE logical_tb2;
在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;