支持的源和目标数据库
源数据库 | 目标数据库 |
---|---|
RDS for PostgreSQL 自建PostgreSQL 9.4/9.5/9.6/10/11/12/13/14/15 |
RDS for PostgreSQL 自建PostgreSQL 9.4/9.5/9.6/10/11/12/13/14/15 |
说明
自建PostgreSQL/RDS PostgreSQL数据库版本为9.4/9.5/9.6/10/11/12/13/14/15,且源数据库和目标数据库的大版本需保持一致。
支持同步的SQL操作
-
DML
INSERT、UPDATE、DELETE。
-
DDL
增量同步的DDL操作仅支持CREATE TABLE、ALTER TABLE、DROP TABLE、CREATE SEQUENCE、ALTER SEQUENCE、DROP SEQUENCE、CREATE VIEW、ALTER VIEW、DROP VIEW、CREATE INDEX、ALTER INDEX、DROP INDEX。
说明
暂不支持 CREATE TABLE 表名 AS SELECT 语句。
RENAME表名之后,向更改名称后的表插入新的数据时,DTS不会同步新的数据到目标库,因可能会导致任务中断异常或数据不一致。
暂不支持以注释开头的DDL语句的同步。
仅正向同步(源库同步至目标库)支持DDL,反向同步(目标库同步至源库)不支持同步DDL,将自动过滤DDL操作。
数据库账号及权限
数据库 所需权限 参考赋权语句 源库 正向同步(源库同步至目标库)所需权限:
模式的USAGE权限制。
待迁移对象的SELECT权限包含增量时,需具备SUPERUSER权限。
反向同步(目标库同步至源库)所需权限:
schema的创建权限。
正向同步(源库同步至目标库)参考赋权语句:
授予user_name用户schema_name模式的usage权限:
GRANT USAGE ON SCHEMA schema_name TO user_name;
授予user_name用户object_name对象的select权限:
GRANT SELECT ON object_name TO user_name;
授予user_name用户超级权限:
ALTER USER user_name WITH SUPERUSER;
反向同步(目标库同步至源库)参考赋权语句:
授予用户user_name在数据库database_name下的schema创建权限:
GRANT CREATE ON DATABASE database_name TO user_name;
目标库 正向同步(源库同步至目标库)所需权限:
schema的创建权限。
反向同步(目标库同步至源库)所需权限:
模式的USAGE权限。
待迁移对象的SELECT权限包含增量时,需具备SUPERUSER权限。
正向同步(源库同步至目标库)参考赋权语句:
授予用户user_name在数据库database_name下的schema创建权限:
GRANT CREATE ON DATABASE database_name TO user_name;
反向同步(目标库同步至源库)参考赋权语句:
授予user_name用户schema_name模式的usage权限:
GRANT USAGE ON SCHEMA schema_name TO user_name;
授予user_name用户object_name对象的select权限:
GRANT SELECT ON object_name TO user_name;
授予user_name用户超级权限:
ALTER USER user_name WITH SUPERUSER;
准备工作
源库为PostgreSQL自建库的情况
针对源库、目标库是自建库的情况,需要进行如下准备工作:
-
登录自建PostgreSQL所属的服务器。
-
修改配置文件postgresql.conf,将配置文件中的wal_level设置为logical。
-
将DTS的IP地址加入至自建PostgreSQL的配置文件pg_hba.conf中。如下图:
如果您已将信任地址配置为0.0.0.0/0,可跳过本步骤。
-
如果任务包含增量同步,需安装PostgreSQL的逻辑解码器输出插件Decoderbufs,建议安装v2.1.1.Final以上版本,低版本可能会导致PostgreSQL数据库出现coredump,详细的步骤可参考如下内容或PostgreSQL官网文档。
-
请自行前往github仓库获取Decoderbufs插件。
-
进行插件的配置。
-
首先,进行插件的编译。
export PATH=/usr/lib/postgresql/9.6/bin:$PATH make make install
-
其次,在postgresql.conf中配置逻辑复制。
# MODULES shared_preload_libraries = 'decoderbufs' # REPLICATION wal_level = logical # minimal, archive, hot_standby, or logical (change requires restart) max_wal_senders = 8 # max number of walsender processes (change requires restart) wal_keep_segments = 4 # in logfile segments, 16MB each; 0 disables #wal_sender_timeout = 60s # in milliseconds; 0 disables max_replication_slots = 4 # max number of replication slots (change requires restart)
-
然后,重启PostgreSQL。
-
最后,验证配置是否生效。
#创建逻辑复制,使用逻辑复制插件decoderbufs select * from pg_create_logical_replication_slot('decoderbufs_demo', 'decoderbufs'); #对相关表进行数据操作 #使用decoderbufs调试模式 SELECT data FROM pg_logical_slot_peek_changes('decoderbufs_demo', NULL, NULL, 'debug-mode', '1'); #使用decoderbufs获取wal变更,更新wal位置 SELECT data FROM pg_logical_slot_get_changes('decoderbufs_demo', NULL, NULL, 'debug-mode', '1'); #查看逻辑复制的wal位置 SELECT * FROM pg_replication_slots WHERE slot_type = 'logical'; #删除逻辑复制 select pg_drop_replication_slot("decoderbufs_demo");
-
-
数据类型映射说明。
PostgreSQL类型 Decoderbuf字段 BOOLOID datum_boolean INT2OID datum_int32 INT4OID datum_int32 INT8OID datum_int64 OIDOID datum_int64 FLOAT4OID datum_float FLOAT8OID datum_double NUMERICOID datum_double CHAROID datum_string VARCHAROID datum_string BPCHAROID datum_string TEXTOID datum_string JSONOID datum_string XMLOID datum_string UUIDOID datum_string TIMESTAMPOID datum_string TIMESTAMPTZOID datum_string BYTEAOID datum_bytes POINTOID datum_point PostGIS geometry datum_point PostGIS geography datum_point
-
源库为天翼云及其他云PostgreSQL的情况
源库为天翼云及其他云PostgreSQL且任务包含增量同步时,源库需开启逻辑解码器输出插件Decoderbufs。
- 天翼云在开通PostgreSQL实例时已预置开启Decoderbufs插件,当源库为天翼云PostgreSQL时,请你参照天翼云关系数据库PostgreSQL版-管理插件相关指引查看确认Decoderbufs插件的开启情况,已开启则无需进行操作,未开启则参照指引进行Decoderbufs插件的安装。
- 当源库为其他云PostgreSQL时,需要查看源库对应版本是否支持并已开启Decoderbufs插件。如源库版本不支持Decoderbufs插件则无法进行其他云PostgreSQL到天翼云PostgreSQL的增量迁移;如源库版本支持Decoderbufs插件但未开启则按照文档启用插件;如已开启则无需进行操作。具体请参考其他云PostgreSQL的相关指引,例如:
- 华为云支持的插件列表及插件管理的相关指引。
- 阿里云支持的插件列表及插件管理的相关指引。
源库要求
- 源数据库的分区表触发器不可以设置为disable。
- 全量同步支持源库备机状态,但需要设置hot_standby_feedback为on;增量同步不支持源库备机状态。
- 同步对象依赖和关联的对象也须一起同步,否则可能导致任务失败。
- 若要做增量同步,源数据库的“pg_hba.conf” 文件中包含如下的配置:
- host replication all 0.0.0.0/0 md5源数据库参数wal_level必须配置为logical;
- 源数据库需提前安装Decoderbufs插件;
- 源数据库中无主键表的replica identity属性必须为full;
- 源数据库的max_replication_slots参数值必须大于当前已使用的复制槽数量;
- 源数据库的max_wal_senders参数值必须等于或大于max_replication_slots参数值;
- 源数据库中表的主键列toast属性为main、external、extended时,其replica identity属性必须为full。
- 同步对象依赖和关联的对象也须一起同步,否则可能导致任务失败。
目标库要求
- 目标数据库的block_size参数值必须大于或等于源库中的对应参数值。
- 目标数据库和源数据库的lc_monetary参数值一致。
- 若要做增量同步,且同步对象包含外键、触发器或事件触发器,则目标数据库的session_replication_role参数必须设置为replica,同步结束后,此参数需改为origin。
- 目标库不可以包含与待同步对象类型相同且名称相同的对象,包括模式、表、序列等,否则任务可能出差。系统库、系统模式、系统表等除外。
- 选择表级对象迁移时,增量迁移过程中不建议对表进行重命名操作。
- 对于全量+增量和增量任务,启动前请确保源库中未启动长事务,启动长事务会阻塞逻辑复制槽的创建,进而引发任务失败。
- 若选择同步DDL,须注意源库执行DDL时,确保在目标库上是兼容的。
- 目标数据库关联RDS实例必须有足够的磁盘空间,磁盘大小建议取以下两种中的最小值:
- 源库待迁移数据量大小的1.5倍。
- 源库待迁移数据量大小加200GB。
操作须知
- 双向同步是在全量同步完成后才开始进行,全量同步完成之前,目标库只能读不能写,否则会导致源库与目标库数据不一致。待全量同步完成后,目标库可读可写。
- DTS为了防止双向回环同步,会在源库和目标库分别创建回环标记表public.ctyun_circle_check,请勿操作此表。
冲突检测
正向和反向都可以选择如下冲突修复策略,DTS根据用户配置的冲突修复策略进行冲突的检测和处理:
-
TaskFailed(遇到冲突,任务报错退出)。
当数据同步遇到冲突时,同步任务直接报错并退出,同步任务进入失败状态,需要您介入修复任务。
-
Ignore(遇到冲突,直接使用目标实例中的冲突记录)。
当数据同步遇到冲突时,直接跳过当前同步语句,继续往下执行,选择使用目标库中的冲突记录。
-
Overwrite(遇到冲突,直接覆盖目标实例中的冲突记录)。
当数据同步遇到冲突时,直接覆盖目标库中的冲突记录。
说明如果同步任务暂停或者重启后存在延迟,在延迟期间,这些策略均不生效,默认覆盖目标端数据。
操作步骤
1、购买DTS数据同步实例。
在管理控制台点击“创建实例”进入订购页面,“实例类型”选择“数据同步”,“目标库实例”的“数据库类型”选择PostgreSQL,选择实例,选择网络接入类型等,完成其他信息的填写并完成购买。
2、进入实例配置页面。
DTS实例购买成功后,进入【数据迁移】实例列表页面,上一步骤购买成功的实例在实例列表中显示状态为“待配置”,进入实例配置页面的操作分两种情况:
- 当DTS实例的网络接入类型为“公网EIP”时,请先点击“绑定弹性IP”按钮完成公网弹性IP的绑定,然后点击该实例操作列的“实例配置”按钮。
- 当DTS实例网络接入类型为“VPC网络”时,直接点击该实例操作列的“实例配置”按钮。
3、配置源库及目标库信息。
进入实例配置第一个步骤的【配置源库及目标库信息】页面,填入源库与目标库的相关配置信息,源库数据库类型选择PostgreSQL,完成IP地址端口、数据库账号、数据库密码等信息的填写。
完成上述信息的填写后可以进行数据库的连接测试,测试数据库能否正常连接。
4、配置同步对象及高级配置。
源库和目标库连通性测试成功后,点下一步按钮,进入实例配置第二个步骤的【配置同步对象及高级配置】页面,同步拓扑选择“双向同步",冲突修复策略按需进行选择,冲突修复策略参见本文冲突检测章节内容。
5、预检查和启动同步。
点击“下一步预检查”,进入【预检查】页面。预检查会检查如下列表信息,并给出检查结果,用户可以依据检查结果进行下一步操作。
方向 检查项 检查内容 正向预检查
lc_monetary参数配置一致性检查 检查源库与目标库的lc_monetary参数配置是否一致。 pg版本检查 检查源库和目标库的pg版本是不是符合要求。 同名对象存在性检查 检查目标库中是否存在和待迁移库同名的待迁移对象。 扩展插件兼容性检查 检查源库中安装的扩展插件,在目标库是否存在。 约束完整性检查 检查待同步对象中子表依赖的父表是否被选中。 检查hot_standby_feedback参数配置 全量同步源库pg为备节点时,hot_standby_feedback参数需配置为ON。 源库用户权限检查 检查源库用于DTS任务的用户是否具有相应的权限。 源库连通性检查 检查数据传输服务器能否连通源数据库。 源数据库的模式名表名是否合法 检查源数据库的模式名表名是否合法,名称不可以包含+"%'<>,.字符。 源库参数wal_level是否为logical 勾选增量同步时,检查源库wal_level参数值是否为logical。 目标库用户权限检查 检查目标库用于DTS任务的用户是否具有相应的权限。 目标库连通性检查 检查数据传输服务器能否连通目标数据库。 源库参数max_replication_slots校验 勾选增量同步时,检查源库max_replication_slots参数值是否大于当前已使用的复制槽数量。 源库参数max_wal_senders校验 勾选增量同步时,检查源库max_wal_senders参数值是否大于当前已使用的复制槽数量。 逻辑解码插件安装校验 勾选增量同步时,检查源库是否安装逻辑解码插件decoderbufs。 待同步表是否存在主键检查 勾选增量同步时,检查待同步表中是否存在无主键的表。 无日志表存在性检查 勾选增量同步时,检查当前选择的待同步对象中的表是否存在无日志表。 源库主备状态检查 勾选增量同步时,检查源库是否为集群中的主库。 ddl同步元数据检查 勾选ddl同步时,检查源库是否有ddl同步所需的元数据对象。 反向预检查 待同步表REPLICA_IDENTITY模式检查 检查待同步表REPLICA_IDENTITY值是否都为FULL。 无日志表存在性检查 校验待同步对象中是否存在无日志表。 校验源库参数wal_level是否为logical 校验源库参数wal_level是否为logical。 源库主备状态检查 勾选增量时,源库pg必须为主节点。 源库参数max_replication_slots校验 源库“max_replication_slots”参数值必须大于当前已使用的复制槽数量。否则,可能导致同步失败。 源库参数max_wal_senders校验 源数据库“max_wal_senders”参数值必须大于当前已使用的复制槽数量。否则,可能会导致同步失败。 源库用户权限检查 检查源库用于DTS任务的用户是否具有相应的权限。 目标库用户权限检查 检查目标库用于DTS任务的用户是否具有相应的权限。 逻辑解码插件安装校验 源数据库是否安装逻辑解码插件decoderbufs。
如果预检查通过,可点击【预检查】页面底部的“启动同步”按钮,开始同步任务。