诊断 PostgreSQL 到 AlloyDB 迁移中的问题

排查迁移错误

迁移作业进程在运行时可能会出错。

  • 某些错误(例如源数据库上的密码错误)可以恢复,这意味着它们可以得到修复,并且迁移作业会自动恢复。
  • 有些错误是无法恢复的,例如数据复制中的错误,这意味着需要从头开始重启迁移作业。

发生错误时,迁移作业状态会更改为 Failed,子状态会反映失败前的最后状态。

如需排查错误,请前往失败的迁移作业以查看错误,然后按照错误消息中列出的步骤操作。

如需查看有关该错误的更多详细信息,请使用迁移作业中的链接前往 Cloud Monitoring。日志会过滤为特定的迁移作业。

在下表中,您可以查看一些问题示例以及这些问题的解决方法:

症状 可能的原因 可以尝试的操作
未能连接到源数据库实例。 源数据库实例与目标实例之间存在连接问题。 按照调试连接中的步骤操作。
由于源数据库和目标数据库版本不兼容,无法运行迁移作业。 源数据库和目标数据库版本不是受支持的组合。具体而言,所提供的源数据库版本与目标数据库版本不兼容。 确保目标数据库版本与源数据库版本相同,或者比源数据库版本高一个主要版本。然后,创建新的迁移作业。
数据定义语言 (DDL) 或数据操纵语言 (DML) 在源上被屏蔽。 需要 ACCESS EXCLUSIVE lock 且在完全转储阶段运行的 DDL 会被阻止。

在初始同步过程(完全转储)中,应避免在表上执行需要 ACCESS EXCLUSIVE 的 DDL 或程序,例如 ALTER TABLEDROP TABLE。否则,DDL 或程序将等待初始同步完成。

例如,如果某个表仍在初始同步过程中,并且对该表执行了 ALTER TABLE 命令,则该命令不会运行,后续的 DDL 和 DML 命令将被阻塞,直到初始同步完成。

错误消息:No pglogical extension installed on databases (X) 一个或多个源数据库未安装 pglogical 按照这些准则在源实例的数据库上安装 pglogical
错误消息:Replication user 'x' doesn't have sufficient privileges. 使用 Database Migration Service 的用户没有执行指定操作所需的权限。 请遵循这些准则,确保该用户拥有所需的权限。
错误消息:Unable to connect to source database server. Database Migration Service 无法与源数据库服务器建立连接。 确保源数据库实例和目标数据库实例可以相互通信,并且您已完成在定义迁移作业的设置时显示的所有必需前提条件。
错误消息:The source database 'wal_level' configuration must be equal to 'logical'. 源数据库的 wal_level 设置为 logical 以外的值。 wal_level 设置为 logical
错误消息:The source database 'max_replication_slots' configuration is not sufficient. max_replication_slots 参数未正确配置。 请按照这些准则正确设置此参数。
错误消息:The source database 'max_wal_senders' configuration is not sufficient. max_wal_senders 参数未正确配置。 请按照这些准则正确设置此参数。
错误消息:The source database 'max_worker_processes' configuration is not sufficient. max_worker_processes 参数未正确配置。 请按照这些准则正确设置此参数。

错误消息:Cleanup may have failed on source due to error: generic::unknown: failed to connect to on-premises database.

错误消息:Error promoting EM replica: finished drop replication with errors.

在升级迁移作业期间,无法清理复制所需的设置。

对于每个数据库,请以具有 superuser 权限的用户身份运行命令。

如需详细了解要运行哪些命令,请参阅清理复制槽

错误消息:x509 certificate signed by unknown authority.

提供给 Database Migration Service 的源 CA 证书可能仅包含根证书。不过,源证书需要根证书和所有中间证书。

例如,对于 Amazon Relational Database Service,使用 rds-ca-2019-root.pem 证书可能会导致此问题。

创建包含根证书和所有必需的中间证书的组合源 CA 证书。

对于 Amazon Relational Database Service 使用情形,请使用 rds-combined-ca-bundle.pem 证书,而不是 rds-ca-2019-root.pem 证书。

错误消息:ERROR: Out of shared memory HINT: You might need to increase max_locks_per_transaction.

max_locks_per_transaction 参数设置的值不足。 将此参数的值设置为至少为 {max_number_of_tables_per_database}/(max_connections + max_prepared_transactions)。

错误消息:ERROR: no data left in message.

pglogical 软件包未在源实例上正确安装。 如需详细了解如何正确安装此软件包,请参阅在源实例上安装 pglogical 软件包

错误消息:Cannot assign TransactionIds during recovery.

配置的来源处于恢复模式。 配置未处于恢复模式的来源。
完全转储速度较慢。 AlloyDB 目标数据库在从源数据库导入大量数据时可能会很慢。
  • 为 AlloyDB 目标数据库选择更高的层级,以获得尽可能高的网络和磁盘带宽。
  • 调整 AlloyDB 目标的 max_wal_size 标志。通常,此标志的理想设置值为 32 GB 或 64 GB。更新此标志不需要您重启服务器。
错误消息:subscriber {subscriber_name} initialization failed during nonrecoverable step (d), please try the setup again

迁移作业在完全转储阶段失败,且无法恢复。源数据库实例已重启或处于恢复模式,或者由于为 wal_sender_timeout 参数设置的值不足,复制连接已结束。

如需查找问题的根本原因,请执行以下操作:

  1. 前往 Google Cloud 控制台中的日志浏览器页面。
  2. 从资源列表中选择您的 AlloyDB 实例。系统会显示实例的最新日志列表。
  3. 从日志文件名中选择 postgres.log
  4. 将日志的严重程度级别设置为高于 Warning 的所有级别。第一个错误日志可能是失败的根本原因。
  • 确保 Database Migration Service 在完整转储阶段始终可以连接到源数据库实例。
  • 检查源数据库实例中的 wal_sender_timeout 参数值是否设置为较大的数字(例如 0)。
  • 重新启动迁移作业,然后重试。
错误消息:ERROR: unknown column name {column_name}

在主节点上向复制的表添加了一列,但在副本节点上未添加该列。

在持续迁移期间,只有数据操纵语言 (DML) 更改会自动更新。管理数据定义语言 (DDL) 更改以确保源数据库和目标数据库保持兼容是用户的责任,可通过两种方式来实现:

  • 停止写入源数据库,并在源数据库和目标数据库中运行 DDL 命令。在目标数据库上运行 DDL 命令之前,向进行 DDL 更改的 Cloud SQL 用户授予 cloudsqlexternalsync 角色。
  • 使用 pglogical.replicate_ddl_command,可允许 DDL 命令在源数据库和目标数据库上同时运行。运行命令的用户在源和目标上必须具有相同的用户名,并且应该是超级用户或要迁移的制品(例如表、序列、视图或数据库)的所有者。
  • 如需查看使用 pglogical.replicate_ddl_command. 的示例,请参阅持续迁移

错误消息:ERROR: cannot truncate a table referenced in a foreign key constraint

用户尝试截断具有外键限制条件的表。

先移除外键限制条件,然后再截断表。

错误消息:ERROR: connection to other side has died

由于为 wal_sender_timeout parameter 设置的值不足,复制连接已结束。此错误通常发生在初始转储成功后的复制阶段。

请考虑增加 wal_sender_timeout 参数值,或通过将源数据库实例上的该参数值设置为 0 来停用超时机制。

当您迁移所选数据库,但迁移作业无法将数据复制到一个或多个数据库时,数据库列表中会显示“失败”状态 各种迁移作业错误。

错误列中,点击查看错误并修正这些错误。您还可以从迁移作业中移除失败的数据库。

如需详细了解如何从迁移作业中移除失败的数据库,请参阅管理迁移作业

清理复制槽

您会看到以下某条消息:

  • Cleanup may have failed on source due to error: generic::unknown: failed to connect to on-premises database.
  • Error promoting EM replica: finished drop replication with errors.

可能的原因

提升 AlloyDB 实例时,如果无法从 AlloyDB 实例访问源实例(例如,源实例未运行,或者您已从源实例的许可名单中移除 AlloyDB 实例),则在迁移作业提升期间无法清理复制所需的设置。您必须手动清理复制槽。

可以尝试的操作

对于每个数据库,以具有 superuser 权限的用户身份运行以下命令:

  1. 从错误消息中获取复制槽名称,然后运行以下命令逐个删除这些槽:

    select pg_drop_replication_slot({slot_name});
  2. 如果错误消息中未显示复制槽名称,请运行以下命令来查询现有复制槽:

    select pg_drop_replication_slot(slot_name) from pg_replication_slots where slot_name like '%alloydb%' and active = 'f';
  3. 如果没有使用源实例的 AlloyDB 副本,请运行以下命令来清理 pglogical 设置:

    select pglogical.drop_node(node_name) from pglogical.node where node_name like 'alloydb';
  4. 如果不再需要 pglogical 扩展程序,请运行以下命令来卸载该扩展程序:

    DROP EXTENSION IF EXISTS pglogical;

删除处于引导模式下的孤立 AlloyDB 集群

在极少数极端情况下,您可能会发现迁移作业已被删除,但关联的 AlloyDB 集群尚未删除,并且仍处于引导模式。您可以使用 AlloyDB 的用于删除集群的 gcloud 命令,并结合 --force 选项来删除集群。

请注意,在迁移作业使用引导集群时删除该集群会导致未定义的行为。

管理用户和角色

迁移现有用户

目前,Database Migration Service 不支持将现有用户从源实例迁移到目标 AlloyDB 实例。您可以手动在 AlloyDB 中创建用户来管理此迁移。

关于 alloydbexternalsync 用户

在迁移期间,AlloyDB 主数据库上的所有对象都归 alloydbexternalsync 用户所有。迁移数据后,您可以按照以下步骤将对象的所有权修改为其他用户:

  • 运行 GRANT alloydbexternalsync to {USER} 命令。
  • 在每个数据库上,运行 reassign owned by alloydbexternalsync to {USER}; 命令。
  • 如需移除 alloydbexternalsync 用户,请运行 drop role alloydbexternalsync 命令。