操作要求
针对一些无法预知或人为因素及环境突变导致迁移失败的情况,数据库复制服务提供以下常见的操作限制,供您在迁移过程中参考。
类型名称
操作限制(需要人为配合)
注意事项
环境要求均不允许在迁移过程中修改,直至迁移结束。
建议目标库插件版本不低于源库插件版本,否则可能因为插件的兼容性问题导致迁移失败。
同一个列上存在主键与唯一键时,只会迁移主键。
一个迁移任务只能对一个数据库进行数据迁移,如果一个PostgreSQL实例下有多个数据库需要迁移,则需要为每个数据库创建实时迁移任务。
相互关联的数据对象要确保同时迁移,避免迁移因关联对象缺失,导致迁移失败。常见的关联关系:视图引用表、视图引用视图、主外键关联表、表继承子表引用父表、表分区子分区表引用分区表、表自增列引用序列等。
操作须知
迁移过程中,不允许修改、删除连接源和目标数据库的用户的用户名、密码、权限,或修改源和目标数据库的端口号。
迁移过程中,目标库不能进行写入操作,否则会导致数据不一致。
在任务启动、任务全量迁移阶段,不允许对源数据库做DDL操作,比如删除表、增加表等,这样会导致任务迁移失败。
增量迁移过程中,支持部分DDL操作,详细操作可参考PostgreSQL到PostgreSQL增量DDL同步。
全量迁移物化视图后,如果目标数据库需要使用物化视图,需要执行以下刷新语句:
refresh materialized view matviewname;
在增量数据迁移过程中,如果选择了库级同步,且在增量迁移过程中创建了新的无主键表或重命名已存在的无主键表,则需要在该表写入数据前执行以下命令:
alter table schema.table replica identity full;
在增量数据迁移过程中,目标库为PostgreSQL 12版本时,如果源库进行修改字段类型的DDL操作,需在执行的SQL语句后加上在“using 字段名::字段类型”,类似操作语句:
alter table schema1.table1 alter column c2 type int using c2::int
DRS使用test_decoding逻辑解码插件进行增量数据迁移,在配置全量+增量任务之前,请确保源端PostgreSQL实例上安装了test_decoding插件。
全量迁移过程中,DRS会向目标库PostgreSQL写入大量数据,会导致PostgreSQL的wal日志量急剧增长,PostgreSQL的磁盘有被写满的风险。可以通过在全量迁移前关闭PostgreSQL的日志备份功能,减少wal日志的生产,迁移完成后再将其打开的方式进行规避(具体操作方法可参考设置自动备份策略)。
注意关闭日志备份会影响数据库的灾备恢复,请根据实际情况谨慎选择。
在配置全量+增量任务之前,请确保源端PostgreSQL实例上安装了test_decoding插件。
环境要求
实时迁移对环境有一些特定的要求,请确保环境配置满足以下条件。该类型的要求系统会自动检查,并给出处理建议。
类型名称
使用限制(DRS自动检查)
数据库权限设置
全量迁移最小权限要求:
源数据库帐户需要具备数据库的CONNECT权限,模式的USAGE权限,表的SELECT权限,PostgresSQL10.0以下的版本还需要序列的SELECT权限,无主键表还需要表的UPDATE、DELETE和TRUNCATE权限(仅用于进行短暂的无主键表锁表操作)。
库级迁移时,目标数据库账户需要具有CREATEDB权限。
表级迁移时,如果数据库不存在,目标数据库账户需要具有CREATEDB权限;如果数据库存在,目标数据库账户需要数据库的CREATE和CONNECT权限;如果模式存在,需要模式的CREATE和USAGE权限。
全量+增量迁移最小权限要求:
源数据库帐户需要具备REPLICATION权限,数据库的CONNECT权限,模式的USAGE权限,表的SELECT权限,PostgresSQL10.0以下的版本还需要序列的SELECT权限。
库级迁移时,目标数据库账户需要具有CREATEDB权限。
表级迁移时,如果数据库不存在,目标数据库账户需要具有CREATEDB权限;如果数据库存在,目标数据库账户需要数据库的CREATE和CONNECT权限;如果模式存在,需要模式的CREATE和USAGE权限。
迁移对象约束
支持表、索引、外键、存储过程、函数、视图、约束、触发器、模式、排序规则、编码转换信息、数据类型、聚合函数、操作符、序列、物化视图、统计扩展、规则、事件触发器、类型转换、转换信息、文本搜索解析器、文本搜索字典、文本搜索模版、文本搜索配置的迁移。
支持如下字段类型:数字类型、货币类型、字符类型、二进制数据类型、日期/时间类型、布尔类型、枚举类型、几何类型、网络地址类型、位串类型、文本搜索类型、UUID类型、XML类型、JSON类型、数组、复合类型、范围类型。
暂不支持插件对象的迁移。
不支持迁移源库中的临时表。
支持在跨大版本间迁移,不允许从高的大版本迁移到低的大版本。
源库中的无日志表(UNLOGGED TABLE)进入增量期间后,将无法迁移增量数据到目标库。
表级迁移仅支持表、视图、物化视图和序列的对象选择,表上所创建的约束、索引和规则将和表一起迁移,不迁移触发器。
不迁移数据库中的系统模式,包括:“pg_”开头的任何模式、“information_schema”,RDS for PostgreSQL增强版还包括“sys”、“utl_raw”、“dbms_lob”、“dbms_output”和“dbms_random”。
源数据库要求
源数据库库名不支持如下字符:“+”、“%”、“"”、“'”、“\ ”、“<”和“>”,模式名和表名不支持“"”和“.”。
全量+增量迁移时,源数据库列名不支持如下字符:“"”和“'”。
全量+增量迁移时,源数据库需要配置如下信息:
增量迁移需要源数据库的“pg_hba.conf” 文件中包含如下的配置:
host replication all 0.0.0.0/0 md5
源数据库参数max_wal_senders和max_replication_slots必须大于0。
源数据库参数hot_standby和full_page_write必须开启。
源数据库参数max_prepared_transactions需要比目标数据库小。
源数据库参数max_worker_processes需要比目标数据库小。
源数据库参数max_locks_per_transaction需要比目标数据库小。
源数据库参数max_connections需要比目标数据库小。
源数据库参数wal_level必须配置为logical。
源数据库和目标数据库的lc_monetary参数值必须一致。
源数据库中同一个数据库下的触发器名称必须唯一。
源数据库中无主键表的REPLICA IDENTITY属性必须为FULL。
源库不支持低于PostgreSQL 9.4的版本。
源库为RDS for PostgreSQL增强版时,目标库仅支持RDS for PostgreSQL增强版。
建议将源数据库参数wal_keep_segments 值至少配置为(源库大小×5%÷16),如果源库业务较繁忙则应相应的增加该值。
目标数据库要求
目标库不支持低于PostgreSQL 9.4的版本。
目标数据库实例的运行状态必须正常。
库级迁移时,目标数据库不能包含与源库要迁移的数据库同名的数据库。
表级迁移时,目标数据库不能包含与源库要迁移的对象同名的对象。
目标数据库实例必须有足够的磁盘空间。
增量迁移时,目标库实例不能为只读实例。
目标数据库和源数据库的lc_monetary、wal_block_size、block_size参数值需保持一致,否则会导致迁移失败。
目标数据库的max_connections、max_worker_processes、max_prepared_transactions、max_locks_per_transaction参数值不能小于源数据库的参数值,否则可能会导致迁移失败。
全量+增量迁移时,如果源数据库中要迁移的表包含外键,目标数据库的session_replication_role参数必须设置为replica。迁移结束后,请将此参数设置为origin。