排查迁移错误
迁移作业流程在运行时可能会出错。
- 某些错误(例如源数据库上的密码错误)可以恢复,这意味着它们可以得到修复,并且迁移作业会自动恢复。
- 某些错误无法恢复,例如数据复制中的错误,这意味着需要从头开始重启迁移作业。
发生错误时,迁移作业状态会更改为 Failed
,并且子状态会反映失败前的最后状态。
如需排查错误,请前往失败的迁移作业以查看错误,然后按照错误消息中列出的步骤操作。
如需查看有关该错误的更多详细信息,请使用迁移作业中的链接前往 Cloud Monitoring。日志会过滤到特定的迁移作业。
在下表中,您可以查看一些问题示例以及解决方法:
症状 | 可能的原因 | 可以尝试的操作 |
---|---|---|
未能连接到源数据库实例。 | 源数据库实例和目标实例之间存在连接问题。 | 请按照调试连接性中的步骤操作。 |
由于源数据库和目标数据库版本不兼容,迁移作业运行失败。 | 源数据库版本和目标数据库版本不受支持。具体而言,提供的源数据库版本与目标数据库版本不兼容。 | 确保目标数据库版本与源数据库版本相同或比源数据库版本高一个主要版本。然后,创建新的迁移作业。 |
源端阻止使用数据定义语言 (DDL) 或数据操纵语言 (DML)。 | 需要 ACCESS EXCLUSIVE 锁定且在完整转储阶段运行的 DDL 会被阻止。 |
在初始同步过程(完全转储)期间,应避免对表执行需要 例如,如果某个表仍处于初始同步过程中,并且对同一表执行了 |
错误消息: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 参数未正确配置。 |
请遵循这些准则正确设置此参数。 |
错误消息: 或
错误消息: |
在迁移作业升级期间,无法清理复制所需的设置。 | 对于每个数据库,请以具有 如需详细了解要运行哪些命令,请参阅清理复制槽。 |
错误消息: |
提供给 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 证书。 |
错误消息: |
为 max_locks_per_transaction 参数设置的值不足。 |
将此参数的值设置为至少为 {max_number_of_tables_per_database }/(max_connections + max_prepared_transactions )。 |
错误消息: |
pglogical 软件包未在源实例上正确安装。 | 如需详细了解如何正确安装此软件包,请参阅在源实例上安装 pglogical 软件包。 |
错误消息: |
已配置的来源处于恢复模式。 | 配置未处于恢复模式的来源。 |
完整转储速度缓慢。 | AlloyDB 目标位置从源数据库导入大量数据的速度可能会很慢。 |
|
错误消息:subscriber {subscriber_name} initialization failed during nonrecoverable step (d), please try the setup again |
迁移作业在完全转储阶段失败,且无法恢复。源数据库实例已重启或处于恢复模式,或者由于为 如需查找问题的根本原因,请执行以下操作:
|
|
错误消息:ERROR: unknown column name {column_name} |
在主节点上的已复制表中添加了列,但在副本节点上未添加。 |
在持续迁移期间,只有数据操纵语言 (DML) 更改会自动更新。管理数据定义语言 (DDL) 更改,以确保源数据库和目标数据库保持兼容,是用户的责任,可通过两种方式来实现:
如需查看使用 |
错误消息:ERROR: cannot truncate a table referenced in a foreign key constraint |
用户尝试截断具有外键约束条件的表。 |
请先移除外键约束条件,然后截断表。 |
错误消息:ERROR: connection to other side has died |
由于为 |
不妨考虑在源数据库实例上将 |
清理复制槽
您会看到以下某条消息:
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
权限的用户身份运行以下命令:
从错误消息中获取复制槽名称,然后运行以下命令逐个删除槽:
select pg_drop_replication_slot({slot_name});
-
如果错误消息中未显示复制槽名称,请运行以下命令查询现有复制槽:
select pg_drop_replication_slot(slot_name) from pg_replication_slots where slot_name like '%alloydb%' and active = 'f';
-
如果没有使用源实例的 AlloyDB 副本,请运行以下命令来清理
pglogical
设置:select pglogical.drop_node(node_name) from pglogical.node where node_name like
'alloydb';
-
如果不再需要
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
命令。