数据复制服务 DRS-将PostgreSQL同步到PostgreSQL:使用须知

时间:2024-11-26 14:45:26

使用须知

DRS全量+增量同步过程一般包含四个阶段:任务启动阶段、全量阶段、增量阶段、结束任务阶段(单增量和单全量任务则包含三个阶段)。为了确保同步各个阶段的平顺,在创建同步任务前,请务必阅读以下使用须知。

表4 使用须知

类型名称

使用和操作约定

任务启动前使用须知

  • 源数据库参数要求
    • 源数据库的分区表触发器不可以设置为disable。
    • 全量同步支持源库备机状态,但需要设置hot_standby_feedback为on;增量同步不支持源库备机状态。
    • 若要做增量同步:

      源数据库参数wal_level必须配置为logical;

      源数据库中无主键表的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,同步结束后,此参数需改为原来的值。
  • 目标数据库对象要求
    • 目标库不可以包含,与待同步对象类型相同且名称相同的对象,包括库、模式、表等。系统库、系统模式、系统表等除外。
    • 支持目标数据库中的表比源数据库多列场景,但是需要避免以下场景可能导致的任务失败。

      目标端多的列要求非空且没有默认值,源端insert数据,同步到目标端后多的列为null,不符合目标端要求。

      目标端多的列设置固定默认值,且有唯一约束。源端insert多条数据后,同步到目标端后多的列为固定默认值,不符合目标端要求。

    • 全量同步前保证目标库表中无数据。如果存在数据,可能会导致数据不一致或任务失败。
    • 全量同步时出现失败重试或暂停续传时,为了保证无主键表数据一致性,会对目标库未完成同步的无主键表使用truncate清空数据后重新同步,因此,全量同步前需保证同步用户对目标库无主键表有truncate权限,否则可能导致任务失败。
  • 其他使用须知
    • 模式名或表名映射时,为防止索引和约束名冲突,同步后表上的原索引名称将变为此格式:i_+哈希值+原索引名(可能被截断)+_key。其中哈希值由“原模式名_原表名_原索引名”计算得到。同理,表上的原约束名将变为:c_+哈希值+原约束名(可能被截断)+_key。
    • 对于全量+增量和增量任务,启动前请确保源库中未启动长事务,启动长事务会阻塞逻辑复制槽的创建,进而引发任务失败。
    • 对于全量+增量和增量任务,如果预校验存在“内部错误”且在任务未启动时结束,请参考PostgreSQL为源强制结束任务章节检查并删除流复制槽,防止源库中流复制槽残留。
    • 对于全量+增量和增量任务,任务启动后,仅支持以下版本的源库发生主备倒换:源库为RDS for PostgreSQL 12.6及以上的小版本、RDS for PostgreSQL 13及以上版本的所有小版本。
    • 若选择同步DDL,须注意源库执行DDL时,确保在目标库上是兼容的。
      说明:

      同步DDL的实现原理是:在源库通过事件触发器捕获DDL语句,并且记录在特定的表中,然后将DDL语句同步至目标库。因此启动任务前,需要提前在源库创建事件触发器、函数等。详细操作可参考通过创建事件触发器和函数实现PostgreSQL增量DDL同步

全量同步过程使用须知

  • 请勿修改源库和目标库的端口号,请勿修改、删除源库和目标库连接用户的密码、权限,否则可能导致任务失败。
  • 请勿在源库执行任何DDL,否则可能导致数据不一致或任务失败。
  • 请勿在目标库做写入操作,否则可能导致数据不一致。
  • 为保证同步任务正常和数据的一致性,如有以上诉求,建议在业务低峰期时重新创建DRS任务。

增量同步过程使用须知

  • 请勿修改源库和目标库的端口号,请勿修改、删除源库和目标库连接用户的密码、权限,否则可能导致任务失败。
  • 请勿修改源数据库表的主键或者唯一键(主键不存在时),否则可能导致增量数据不一致或任务失败。
  • 请勿修改源数据库中表的replica identity属性,否则可能导致增量数据不一致或任务失败。
  • 请勿在目标库做写入操作,否则可能导致数据不一致。
  • 为保证同步任务正常和数据的一致性,如有以上诉求,建议在业务低峰期时重新创建DRS任务。
  • 库级同步时,源库新增无主键表时,请务必同时将该无主键表的replica identity属性设置为full,然后再写入数据,否则可能导致数据不一致或任务失败。
  • 库级同步时,源库新增主键表时,如果主键列toast属性为main、external、extended时,请务必同时将该表的replica identity属性设置为full,然后再写入数据,否则可能导致数据不一致或任务失败。

同步对比使用须知

  • 建议在源库的业务低峰期进行数据比对,防止误报不一致数据,以及减少对源库和DRS任务的冲击。
  • 在增量同步过程中做对比时,源库若存在写入,则对比结果可能不一致。
  • 不支持在全量同步过程中做对比。
  • 不支持数据对比过程中做限速。

结束任务使用须知

  • 任务正常结束
    • 将自动重置目标库序列值(自增序列值为源库序列值+安全余度,自减序列值为源库序列值-安全余度,安全余度默认为10000),若选择了同步用户,任务结束时将自动同步用户的成员关系。
    • 全量实时同步任务结束时会对序列值进行比对,序列值采用逻辑一致性的判断原则,即自增序列当且仅当目标库对应序列值大于等于源库对应序列值,自减序列当且仅当目标库对应序列值小于等于源库对应序列值时,序列值判定为一致。
    • 全量+增量实时同步任务正常结束时,将自动删除任务在源库创建的流复制槽。
    • 全量+增量实时同步任务正常结束时,如果目标库session_replication_role值为replica,需手动将目标库session_replication_role参数值修改为原来的值。
  • 任务强制结束
    • 需要手动刷新目标库中的序列值,可参考PostgreSQL为源强制结束任务章节的指导进行操作。
    • 强制结束全量+增量实时同步任务,需要手动删除源库可能残留的复制槽,可参考PostgreSQL为源强制结束任务章节的指导进行操作。
    • 强制结束全量+增量实时同步任务,如果目标库session_replication_role值为replica,需手动将目标库session_replication_role参数值修改为原来的值。
    • 逻辑复制槽命名规则为“drs_唯一性标识”,其中唯一性标识需要将任务node id中的“-”替换为“_”获取。node id可在DRS任务同步日志页面查看task node id is ***日志找到。

常见故障排查

  • 在任务创建、启动、全量同步、增量同步、结束等过程中,如有遇到问题,可先参考“故障排查”章节进行排查。
support.huaweicloud.com/realtimesyn-drs/drs_04_0508.html