排查迁移错误
迁移作业进程在运行时可能会出错。
- 某些错误(例如源数据库上的密码错误)可以恢复,这意味着它们可以得到修复,并且迁移作业会自动恢复。
- 有些错误是无法恢复的,例如数据复制中的错误,这意味着需要从头开始重启迁移作业。
发生错误时,迁移作业状态会更改为 Failed
,子状态会反映失败前的最后状态。
如需排查错误,请前往失败的迁移作业以查看错误,然后按照错误消息中列出的步骤操作。
如需查看有关该错误的更多详细信息,请使用迁移作业中的链接前往 Cloud Monitoring。日志会过滤为特定的迁移作业。
在下表中,您可以查看一些问题示例以及这些问题的解决方法:
症状 | 可能的原因 | 可以尝试的操作 |
---|---|---|
未能连接到源数据库实例。 | 源数据库实例与目标实例之间存在连接问题。 | 按照调试连接中的步骤操作。 |
由于源数据库和目标数据库版本不兼容,无法运行迁移作业。 | 源数据库和目标数据库版本不是受支持的组合。具体而言,所提供的源数据库版本与目标数据库版本不兼容。 | 确保目标数据库版本与源数据库版本相同,或者比源数据库版本高一个主要版本。然后,创建新的迁移作业。 |
数据定义语言 (DDL) 或数据操纵语言 (DML) 在源上被屏蔽。 | 需要 ACCESS EXCLUSIVE lock 且在完全转储阶段运行的 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
命令。