从 PostgreSQL 联机迁移到 Azure Database for PostgreSQL 时的已知问题和限制
重要
建议使用 Azure Database for PostgreSQL 中的新迁移服务,以获得更简化、更高效的迁移体验。 该服务通过支持各种源环境简化了流程,确保顺利过渡到 Azure Database for PostgreSQL。
本文说明了在使用 Azure 数据库迁移服务 (DMS) 从 PostgreSQL 联机迁移到 Azure Database for PostgreSQL 时存在的已知问题和限制。
联机迁移配置
支持的最低 PostgreSQL 源版本为 9.4,支持的最高目标版本为 14.9。
仅支持迁移到同一版本或更高版本。 例如,不支持将 PostgreSQL 9.5 迁移到 Azure Database for PostgreSQL 9.6 或 10。 不支持从 PostgreSQL 11 迁移到 PostgreSQL 9.6。
若要在源 PostgreSQL
postgresql.conf
文件中启用逻辑复制,请设置以下参数:参数 说明 wal_level
设置为逻辑。 max_replication_slots
至少设置为要迁移的数据库数上限。 如果你要迁移 4 个数据库,请将值至少设置为 4
。max_wal_senders
设置并发运行的数据库数。 建议值为 10
。将 DMS 代理 IP 添加到源 PostgreSQL
pg_hba.conf
。预配 Azure 数据库迁移服务后,记下 DMS IP 地址。
将 IP 地址添加到
pg_hba.conf
文件中:host all 172.16.136.18/10 md5 host replication postgres 172.16.136.18/10 md5
用户必须在托管源数据库的服务器上具有“复制”角色。
源数据库架构和目标数据库架构必须匹配。
大小限制
- 可以使用单个 DMS 服务将最多 1 TB 的数据从 PostgreSQL 迁移到 Azure Database for PostgreSQL。
- DMS 允许用户选择数据库中要迁移的表。
在幕后,pg_dump
命令通过以下选项之一来提取选定表的转储:
-T
,表示包含 UI 中选择的表名-t
,表示排除用户未选择的表名
在 -t
或 -T
选项后面,最多可以包含 7500 个字符作为 pg_dump
命令的一部分。 pg_dump
命令使用选定或未选定表的字符计数(以较少者为准)。 如果选定和未选定表的字符数超过 7500,则 pg_dump
命令会失败并出错。
对于前面的示例,pg_dump
命令为:
pg_dump -h hostname -u username -d databasename -T "\"public\".\"table_1\"" -T "\"public\".\"table_2\""
在前面的命令中,字符数为 55(包括双引号、空格、-T
和斜杠)。
数据类型限制
限制:如果表中没有主键,则所做的更改可能不会同步到目标数据库。
解决方法:暂时为表设置一个主键,以便迁移能够继续。 完成数据迁移后,可以删除主键。
从 AWS RDS PostgreSQL 进行联机迁移的限制
尝试执行从 Amazon Web Service (AWS) 关系数据库 (RDS) PostgreSQL 到 Azure Database for PostgreSQL 的联机迁移时,可能会遇到以下错误:
错误:数据库“{database}”的表“{table}”中的列“{column}”的默认值在源服务器和目标服务器上不同。 在源服务器上,值为“{value on source}”,而在目标服务器上,值则为“{value on target}”。
限制:如果列架构上的默认值在源数据库和目标数据库上不同,则会出现此错误。
解决方法:确保目标上的架构与源上的架构匹配。 有关迁移架构的详细信息,请参阅 Azure Database for PostgreSQL 联机迁移文档。
错误:目标数据库“{database}”包含“{number of tables}”个表,而源数据库“{database}”包含“{number of tables}”个表。 源数据库和目标数据库中表的数目应当匹配。
限制:当源数据库与目标数据库的表数不同时,将出现此错误。
解决方法:确保目标上的架构与源上的架构匹配。 有关迁移架构的详细信息,请参阅 Azure Database for PostgreSQL 联机迁移文档。
错误: 源数据库 {database} 为空
限制:当源数据库为空时,会出现此错误。 你可能选择了错误的数据库作为源。
解决方法:反复检查选择迁移的源数据库,然后重试。
错误: 目标数据库 {database} 为空。 迁移架构。
限制:当目标数据库上没有架构时,会出现此错误。 确保目标上的架构与源上的架构匹配。
解决方法:确保目标上的架构与源上的架构匹配。 有关迁移架构的详细信息,请参阅 Azure Database for PostgreSQL 联机迁移文档。
其他限制
数据库名称不能包含分号 (
;
)。已捕获的表必须包含主键。 如果某个表没有主键,则对记录执行的 DELETE 和 UPDATE 操作的结果将不可预测。
忽略更新主键段。 应用此类更新将被目标识别为未更新任何行的更新操作。 结果是生成一条写入到异常表的记录。
如果表包含
JSON
列,对此表执行任何 DELETE 或 UPDATE 操作可能导致迁移失败。迁移同名但大小写不同的多个表可能会导致不可预知的行为,且此操作不受支持。 例如,使用 table1、TABLE1 和 Table1。
不支持更改 [CREATE | ALTER | DROP | TRUNCATE] 表 DDL 的处理。
在数据库迁移服务中,单个迁移活动最多只能容纳四个数据库。
不支持迁移 pg_largeobject 表。