排查迁移错误
迁移作业进程在运行时可能会出错。
- 某些错误(例如源数据库上的密码错误)可以恢复,这意味着它们可以得到修复,并且迁移作业会自动恢复。
- 某些错误(例如数据复制错误)无法恢复,这意味着迁移作业需要从头开始重启。
发生错误时,迁移作业状态会变为 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命令。