更新时间:2022-05-25 GMT+08:00
分享

PostgreSQL->PostgreSQL

使用技巧(需要人为配合)

推荐提前2-3天启动任务,并配合如下使用技巧和操作要求,以确保任务稳定运行。

  • 基于以下原因,建议您结合定时启动功能,选择业务低峰期开始运行同步任务。
    • 在网络无瓶颈的情况下,全量同步会对源数据库增加约50MB/s的查询压力,以及占用2~4个CPU。
    • 正在同步的数据被其他事务长时间锁死,可能导致读数据超时。
    • DRS并发读取数据库,会占用大约6-10个session连接数,需要考虑该连接数对业务的影响。
    • 全量阶段读取表数据时,特别是大表的读取,可能会阻塞业务上对大表的独占锁操作。
  • 建议您结合数据对比的“稍后启动”功能,选择业务低峰期进行数据对比,以便得到更为具有参考性的对比结果。由于同步具有轻微的时差,在数据持续操作过程中进行对比任务,可能会出现少量数据不一致对比结果,从而失去参考意义。

操作要求

针对一些无法预知或人为因素及环境突变导致同步失败的情况,数据复制服务提供以下常见的操作限制,供您在同步过程中参考。
表1 操作要求

类型名称

操作限制(需要人为配合)

注意事项

  • 表2中的环境要求均不允许在同步过程中修改,直至同步结束。
  • 实时同步会自动在目标库创建与源库相同的表和结构,不需要用户先行在目标库创建表结构。
  • 一个同步任务只能对一个数据库进行数据同步,如果一个PostgreSQL实例下有多个数据库需要同步,则需要为每个数据库创建实时同步任务。
  • 表级同步仅支持表、视图、物化视图和序列的对象选择,表上所创建的约束、索引和规则将随表一起同步,不同步触发器。相互关联的数据对象要确保同时同步或在目标库提前建好,避免因关联对象缺失,导致同步失败。常见的关联关系:视图引用表、视图引用视图、主外键关联表、表继承子表引用父表、表分区子分区表引用分区表、表自增列引用序列等。
  • 同步对象权限时,如果目标库连接账号不具备SUPERUSER属性,源数据库中请勿存在对象的owner在对象上的权限被收回的情况,否则可能导致同步失败。

操作须知

  • 同步过程中,不允许修改、删除连接源和目标数据库的用户的用户名、密码、权限,或修改源和目标数据库的端口号。
  • 同步过程中,目标库不能进行写入操作,否则会导致数据不一致。
  • 在任务启动、任务全量同步阶段,不允许对源数据库做DDL操作,比如删除表、增加表等,这样会导致任务同步失败。
  • 在任务增量同步阶段,不允许修改源数据库表的主键或者唯一键(主键不存在时),可能会导致数据不一致或者任务失败。
  • 增量同步过程中,支持部分DDL同步,详细操作可参考PostgreSQL到PostgreSQL增量DDL同步。
  • 增量同步DDL是将源库执行的DDL在目标库完整地进行回放,请注意源库执行的DDL语句需要是目标库兼容的,否则可能导致任务失败。
  • 全量同步物化视图后,如果目标数据库需要使用物化视图,需要执行以下刷新语句:
    refresh materialized view matviewname;
  • 在库级同步的增量数据同步过程中,如果创建了新的无主键表,则需要在该表写入数据前执行以下命令:
    alter table schema.table replica identity full;
  • DRS使用test_decoding逻辑解码插件进行增量数据同步,在配置全量+增量任务之前,请确保源端PostgreSQL实例上安装了test_decoding插件。
  • 全量同步过程中,DRS会向目标库PostgreSQL写入大量数据,会导致PostgreSQL的wal日志量急剧增长,PostgreSQL的磁盘有被写满的风险。可以通过在全量同步前关闭PostgreSQL的日志备份功能,减少wal日志的生产,同步完成后再将其打开的方式进行规避(具体操作方法可参考设置自动备份策略)。
    注意:
    • 关闭日志备份会影响数据库的灾备恢复,请根据实际情况谨慎选择。

环境要求

实时同步对环境有一些特定的要求,请确保环境配置满足以下条件。该类型的要求系统会自动检查,并给出处理建议。
表2 环境要求

类型名称

使用限制(DRS自动检查)

数据库权限设置

  • 全量同步最小权限要求:
    • 源数据库帐户需要数据库的CONNECT权限,模式的USAGE权限,表的SELECT权限,序列的SELECT权限。
    • 库级同步时,目标数据库账户需要具有CREATEDB权限,如果需要同步用户,还需要具有CREATEROLE权限。
    • 表级同步时,如果数据库不存在,目标数据库账户需要具有CREATEDB权限;如果数据库存在,目标数据库账户需要数据库的CREATE和CONNECT权限;如果模式存在,需要模式的CREATE和USAGE权限;如果需要同步用户,还需要具有CREATEROLE权限。
  • 全量+增量同步最小权限要求:
    • 源数据库帐户需要数据库的CONNECT权限,模式的USAGE权限,表的SELECT权限,序列的SELECT权限,无主键表还需要表的UPDATE、DELETE和TRUNCATE权限(仅用于进行短暂的无主键表锁表操作),还需备REPLICATION连接权限。

      REPLICATION连接权限的添加方法:在源数据库的“pg_hba.conf”配置文件的所有配置前增加一行配置“host replication <src_user_name> <drs_instance_ip>/32 md5”,在源库中通过SUPERUSER用户执行语句“select pg_reload_conf();”或重启数据库实例生效。

    • 库级同步时,目标数据库账户需要具有CREATEDB权限,如果需要同步用户,还需要具有CREATEROLE权限。
    • 表级同步时,如果数据库不存在,目标数据库账户需要具有CREATEDB权限;如果数据库存在,目标数据库账户需要数据库的CREATE和CONNECT权限;如果模式存在,需要模式的CREATE和USAGE权限;如果需要同步用户,还需要具有CREATEROLE权限。

同步对象约束

  • 支持的同步对象有:表、索引、外键、存储过程、函数(不支持C语言函数、带有LEAKPROOF或SUPPORT属性的函数)、视图、约束、触发器、模式、插件、排序规则、编码转换信息、数据类型(不支持基本类型)、聚合函数、操作符、序列、物化视图、统计扩展、规则、事件触发器(仅PostgreSQL11.5及以上版本的目标库支持)、类型转换(不支持二进制强制型的类型转换)、转换信息、文本搜索配置、文本搜索字典、文本搜索解析器(仅PostgreSQL11.5及以上版本的目标库支持)、文本搜索模版(仅PostgreSQL11.5版本及以上的目标库支持)。
  • 目前暂不支持表空间、外部数据包装器、外部服务器、用户映射、发布、订阅等对象的同步,不支持的对象将不被同步。
  • 支持的字段类型有:数字类型、货币类型、字符类型、二进制数据类型、日期/时间类型、布尔类型、枚举类型、几何类型、网络地址类型、位串类型、文本搜索类型、UUID类型、XML类型、JSON类型、数组、复合类型、范围类型。
  • 插件同步将在目标库使用默认版本创建插件对象,仅支持插件的对象的同步,如果源库在使用某个插件的过程中有新增的插件元数据,请在同步结束后使用该插件自有的语法重建元数据。
  • 不支持同步源库中的临时表。
  • 不支持表名末尾是空格的表。
  • 不支持将分区表触发器置为disable。
  • 支持在跨大版本间同步,不允许从高的大版本同步到低的大版本。
  • 源库中的无日志表(UNLOGGED TABLE)进入增量期间后,将无法同步增量数据到目标库。
  • 同步用户时,不会同步目标库已存在用户的任何属性、成员关系和默认访问权限,如需同步源库对应用户,请先在目标库删除已存在用户;必须选择对待同步用户或对象有依赖的用户;用户默认访问权限仅在库级同步时进行同步;目标库连接账号不能作为其他用户的父用户,当目标库连接账号不是SUPERUSER时,其必须具备CREATEROLE属性,且源库账号的SUPERUSER、REPLICATION、BYPASSRLS属性无法同步。如果源库存在与目标库连接账号同名的用户,则其他用户与它的成员关系将在结束任务时进行同步,而非全量阶段。
  • 不同步系统模式public的权限,表级同步时将同步目标库已存在的模式权限也将会同步。
  • 不同步数据库中的系统模式,包括:“pg_”开头的任何模式、“information_schema”,RDS for PostgreSQL增强版还包括“sys”、“utl_raw”、“dbms_lob”、“dbms_output”和“dbms_random”。

源数据库要求

  • 源数据库库名不支持如下字符:“+”、“%”、“"”、“'”、“\ ”、“<”和“>”,模式名和表名不支持“"”和“.”,列名不支持如下字符:“"”和“'”。
  • 源数据库的max_replication_slots参数值必须大于当前已使用的复制槽数量。
  • 源数据库的max_wal_senders参数值需不小于max_replication_slots参数值。
  • 源数据库参数wal_level必须配置为logical。
  • 源数据库中同一个数据库下的触发器名称必须唯一。
  • 源数据库中无主键表的REPLICA IDENTITY属性必须为FULL。
  • 源库不支持低于PostgreSQL 9.4的版本。
  • 源库为RDS for PostgreSQL增强版时,目标库仅支持RDS for PostgreSQL增强版。
  • 如需同步源库用户的密码,源库迁移账号必须具有系统表pg_catalog.pg_authid的select权限。

目标数据库要求

  • 不支持从高版本同步到低版本。
  • 目标数据库实例的运行状态必须正常。
  • 库级同步时,如果源库不存在plpgsql之外的插件,目标数据库不能包含与源库要同步的数据库同名的数据库;如果源库安装了plpgsql之外的插件,请确保目标库仅在对应数据库中安装了插件,而未创建其他自建对象。
  • 表级同步时,目标数据库不能包含与源库要同步的对象同名的对象。
  • 目标库为PostgreSQL11.5以下的版本时,由于目标库root用户未提权(请参考RDS for PostgreSQL权限说明),将不支持事件触发器、文本搜索解析器、文本搜索模版的同步,对于PostgreSQL11.5及以上版本的目标库,目标库连接用户需为root用户或root用户的成员。
  • 目标数据库实例必须有足够的磁盘空间。
  • 目标数据库和源数据库的lc_monetary参数值需保持一致。
  • 目标数据库的block_size参数值必须大于源库中的对应参数值。
  • 全量+增量同步时,如果源数据库中要同步的表包含外键、触发器、事件触发器(仅PostgreSQL11.5及以上版本),目标数据库的session_replication_role参数必须设置为replica。同步结束后,请将此参数设置为origin。
  • 选择同步对象权限时,需要满足如下要求:
    • 目标库迁移用户不是SUPERUSER时,源库下层对象的owner必须具有上层对象的create权限,比如表的owner必须具有其schema上的create权限。
    • 目标库迁移用户不是SUPERUSER时,无法同步父用户为SUPERUSER的成员关系,以及owner/grantor为SUPERUSER的对象的owner/grantor。
    • 目标库迁移用户的default privilege需要为系统默认值,否则可能导致目标库与源库的对象权限不一致。
分享:

    相关文档

    相关产品

close