从 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

    1. 预配 Azure 数据库迁移服务后,记下 DMS IP 地址。

    2. 将 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 允许用户选择数据库中要迁移的表。

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 表。