从 PostgreSQL 迁移到 ProtonBase 指南
背景信息
ProtonBase支持从多种PostgreSQL的数据源进行迁入,包括阿里云ADB for PostgreSQL、PolarDB PG版、RDS PG、以及其他类似云平台及各类自建PostgreSQL 数据源和其他兼容PG生态的数据产品。
本文以阿里云RDS PG为例,介绍如何通过 ProtonBase 同步工具 Teleport 将数据同步到 ProtonBase 中。
Teleport相关文档请参考。
准备工作
内网打通
注意:此步骤非必须,也可以走公网进行数据同步。但从同步速度和费用角度,建议进行打通,参考文档数据同步网络配置。
权限准备
可以直接使用已有的高权限账号,也可以创建新的专门为同步使用的账号。需要包含如下权限:
-
REPLICATION的复制权限
-
对需要同步的表和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
-
自建服务,请修改 postgresql.conf 文件中 wal_level 值后重启
-
云厂商
-
阿里云,请参考官网设置 (opens in a new tab)
-
其他,待补充
-
配置数据同步
在源端创建测试测试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)
注意事项
-
Teleport支持常见的DDL的变更的自动同步,比如
create table
/truncate table
/drop table
/add column
/alter column type
等,但是不支持约束变更、drop column
等的自动同步。在源端有不支持自动同步的DDL行为发生时,可能导致Teleport同步链路停止。 -
启动后可能报错:requestId: 9a0905554f6a4d94a901cb172d610e49 message: ERROR: permission denied for database source_demo. Please check and retry。一般为PUBLICATION没有创建。请参考前面步骤进行检查。
-
同步状态一直显示运行中,没有显示具体的延迟。原因为Teleport目前的实现机制需要在增量阶段至少有新数据写入时,才能计算出延迟。