诊断 PostgreSQL 到 AlloyDB 迁移中的问题

排查迁移错误

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

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

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

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

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

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

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

在初始同步过程(完全转储)期间,应避免对表执行需要 ACCESS EXCLUSIVE (例如 ALTER TABLEDROP TABLE)的 DDL 或程序。否则,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 目标位置从源数据库导入大量数据的速度可能会很慢。
  • 创建目标位置时,请将数据磁盘大小设置为接近最终大小。完整转储阶段使用的是 I/O 写入密集型工作负载,磁盘越大,I/O 性能就越好。如需了解详情,请参阅块存储性能
  • 为 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 控制台中的 Logs Explorer 页面。
  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 命令。