从 PostgreSQL 迁移到 ProtonBase 指南

背景信息

ProtonBase支持从多种PostgreSQL的数据源进行迁入,包括阿里云ADB for PostgreSQLPolarDB PG版RDS PG、以及其他类似云平台及各类自建PostgreSQL 数据源和其他兼容PG生态的数据产品。

本文以阿里云RDS PG为例,介绍如何通过 ProtonBase 同步工具 Teleport 将数据同步到 ProtonBase 中。

Teleport相关文档请参考

准备工作

内网打通

注意:此步骤非必须,也可以走公网进行数据同步。但从同步速度和费用角度,建议进行打通,参考文档数据同步网络配置

权限准备

可以直接使用已有的高权限账号,也可以创建新的专门为同步使用的账号。需要包含如下权限:

  1. REPLICATION的复制权限

  2. 对需要同步的表和schema的读权限

如需创建同步专用账号,并进行赋权,请参考以下命令:

-- 原有高权限账号登录
psql postgres://${user}:${password}@${host}:5432/${your_database_name}
 
-- 创建CDC专用同步账号
CREATE USER ${cdc_user} WITH REPLICATION ENCRYPTED PASSWORD '${cdc_user_passord}';
 
-- 对新cdc专用同步账号赋权
source_db=# grant select on all tables in schema schema1,[other_schema] to ${cdc_user};
source_db=# grant usage on schema schema1,[other_schema] to ${cdc_user};

操作步骤

创建PUBLICATION

-- 高权限账号登录
psql -h ${host} -p 5432 -U ${user}  "dbname=${your_database_name} replication=database" -W
 
-- 以下命令二选一
-- 对所有表创建订阅
CREATE PUBLICATION teleport_pub FOR ALL TABLES;
 
--只对同步表创建订阅
CREATE PUBLICATION teleport_pub FOR TABLE ${your_schema}.${your_table}, ...;

设置WAL_LEVEL

设置wal_level = logical

配置数据同步

在源端创建测试测试db和测试table

source_demo=> \l
                                                   数据库列表
    名称     |       拥有者       | 字元编码 | 校对规则 |   Ctype    |                 存取权限
-------------+--------------------+----------+----------+------------+-------------------------------------------
 postgres    | alicloud_rds_admin | UTF8     | C        | en_US.utf8 |
 rdsadmin    | aurora             | UTF8     | C        | en_US.utf8 | aurora=CTc/aurora
 source_demo | aurora             | UTF8     | C        | en_US.utf8 |
 template0   | alicloud_rds_admin | UTF8     | C        | en_US.utf8 | =c/alicloud_rds_admin                    +
             |                    |          |          |            | alicloud_rds_admin=CTc/alicloud_rds_admin
 template1   | alicloud_rds_admin | UTF8     | C        | en_US.utf8 | =c/alicloud_rds_admin                    +
             |                    |          |          |            | alicloud_rds_admin=CTc/alicloud_rds_admin
(5 行记录)
 
source_demo=> create table t1(a int,b text);
CREATE TABLE
source_demo=> insert into t1 values (1,'test1');
INSERT 0 1
source_demo=> insert into t1 values (2,'test2');
INSERT 0 1
source_demo=> select * from t1;
 a |   b
---+-------
 1 | test1
 2 | test2
(2 行记录)

创建Teleport同步任务

输入用户名和密码后进行连接测试。

勾选要同步的数据库和表信息。

如果有需要,可以配置在目标端的新的database和schema名称。默认保留源端的database和schema名字。

确定同步模式和脏数据策略

启动同步

在弹出的对话框,或者作业的右上角,点击启动。一般任务初始化需要一些时间进行资源准备。

资源准备完成后,根据页面的提示可以看到当前所处节点。当进行当增量阶段显示运行中或显示具体时延时,意味着已经在实施同步。

接下来查看目标端同步的t1表内容,注意要去前面配置的目标端的映射db和schema里找。

postgres=> \c newdb
You are now connected to database "newdb" as user "operator@protonbase.app".
 
newdb=> \dn
           List of schemas
    Name    |         Owner
------------+------------------------
 newschema  | alex.yan@protonbase.io
 pb_toolkit | unknown (OID=1)
 public     | unknown (OID=1)
(3 rows)
 
newdb=> set search_path=newschema;
SET
newdb=> \d
                 List of relations
  Schema   | Name | Type  |         Owner
-----------+------+-------+------------------------
 newschema | t1   | table | alex.yan@protonbase.io
(1 row)
 
newdb=> select * from t1;
 a |   b
---+-------
 2 | test2
 1 | test1
(3 rows)

源端写入一条新值。

source_demo=> insert into t1 values (3,'test3');INSERT 0 1

重新查看目标端,验证同步生效。

newdb=> select * from t1;
 a |   b
---+-------
 3 | test3
 2 | test2
 1 | test1
(3 rows)

注意事项

  1. Teleport支持常见的DDL的变更的自动同步,比如create table/truncate table/drop table/add column/alter column type等,但是不支持约束变更、drop column等的自动同步。在源端有不支持自动同步的DDL行为发生时,可能导致Teleport同步链路停止。

  2. 启动后可能报错:requestId: 9a0905554f6a4d94a901cb172d610e49 message: ERROR: permission denied for database source_demo. Please check and retry。一般为PUBLICATION没有创建。请参考前面步骤进行检查。

  3. 同步状态一直显示运行中,没有显示具体的延迟。原因为Teleport目前的实现机制需要在增量阶段至少有新数据写入时,才能计算出延迟。