诊断 Oracle 到 AlloyDB for PostgreSQL 迁移中的问题

本页面列出了以下各项的已知错误和建议的问题排查步骤:

迁移作业错误

迁移作业过程在运行时可能会发生错误。

  • 某些错误(例如源数据库上的密码错误)是可恢复的。这些错误修复后,迁移作业会自动恢复。
  • 有些错误是不可恢复的,例如数据复制中的错误。修复这些错误后,您必须重启迁移作业。

发生错误时,迁移作业状态会更改为 Failed,子状态会反映失败前的最后一个状态。如需排查错误,请前往失败的迁移作业以查看错误,然后按照错误消息中所述的步骤操作。如需查看有关错误的更多详细信息,请使用迁移作业中的链接导航到 Cloud Monitoring。系统会过滤日志,仅显示特定迁移作业的日志。

下表列举了一些问题示例及其解决方法:

症状 可能的原因 可以尝试的操作
出错提示:Database Migration Service can't set up a tunnel to be connected to the bastion host。 Database Migration Service 无法访问堡垒主机,或者堡垒主机不接受连接。 请验证 源连接配置文件和 SSH 隧道服务器配置中的转发 SSH 隧道设置,然后重试。
出错提示:Database Migration Service can't connect to the database 或 Database Migration Service private connectivity error, cannot connect to the database。 Database Migration Service 无法与源 Oracle 数据库建立连接。

验证您是否可以从项目中访问源数据库。 检查与 来源连接配置方法相关的设置。

如果包含特定的 Oracle 错误代码(例如 ORA-12170: TNS:Connect timeout occurred),请参阅 Oracle 文档了解详情。

错误消息:Archiving mode is not ARCHIVELOG。 您的源数据库未以 ARCHIVELOG 模式运行。 将源数据库配置为使用 ARCHIVELOG 模式。 如需了解详情,请参阅 配置 Oracle 源数据库。
出错提示:Supplemental logging ("ALL COLUMN LOGGING") isn't turned on for the tables listed below。 您的源数据库未启用补充日志数据。 启用补充日志数据,并将其模式设置为 ALL。 如需了解详情,请参阅 配置 Oracle 源数据库。
错误消息:No Archive Log Files were found in the source。 Database Migration Service 仅读取已关闭的归档日志,但在源数据库中未找到任何日志。
  1. 在源数据库中运行以下命令,以关闭当前日志文件:ALTER SYSTEM SWITCH LOGFILE。
  2. 请尝试重新查找日志。

如果数据库没有任何活跃的写入操作,您可能需要执行至少一个 INSERT 操作来触发日志创建。

出错提示:We're missing the necessary permissions to read from the source。 源数据库中的迁移用户账号没有所需的权限。

Database Migration Service 会以您在源连接配置文件中配置的用户账号身份连接到源。该账号需要一组特定权限(例如 SELECT ANY TABLE)才能读取源数据库中的数据。

确保迁移用户账号拥有必要的权限。 如需了解详情,请参阅 配置 Oracle 源数据库。

错误消息:Unable to connect to the destination database。 连接到目标数据库时出现问题。 验证您是否可以从项目中访问目标数据库。 检查与 目标连接配置方法相关的设置。
错误消息:The following tables don't exist in the destination database: {table_names}。 您尝试迁移的列出的表在目标数据库中不存在。 当您转换源架构时,Database Migration Service 会创建必要的表和定义。
错误消息:password authentication failed for user {username}。 目标数据库的用户名或密码配置不正确。 确保目标 PostgreSQL 连接配置文件已正确配置,并使用了正确的用户名和密码。
出错提示:The following tables in the destination database don't have primary keys: {table_names}。 出错提示中列出的表存在于目标数据库中,但缺少主键。

当您转换架构时,Database Migration Service 转换工作区会自动为没有主键的表添加主键。

如果您使用旧版转换工作区,则需要在目标中手动创建主键。如需了解详情,请参阅 旧版转换工作区。

警告:The following tables have foreign keys: {table_names}。 出错提示中列出的表存在于目标数据库中,但具有外键。

Database Migration Service 不会以事务方式复制数据,因此表可能会不按顺序迁移。如果存在外键,并且使用外键的子表在其父表之前迁移,则可能会遇到复制错误。

为避免此类数据完整性问题,请为迁移用户使用 REPLICATION 选项跳过外键。如需了解详情,请参阅 外键和触发器的注意事项。

错误消息:Unable to resume replication as log position is lost。 如果复制过程长时间暂停,导致日志位置丢失,则可能会发生此错误。 迁移作业的暂停时间不应超过(或接近)日志保留期限。如果日志位置丢失,您需要重新创建迁移作业。
错误消息:ORA-00942: table or view does not exist。 此错误可能是由于 Oracle 服务器上的缓存所致。 重新创建数据库用户以解决缓存问题。
迁移作业会保持在完整转储阶段,不会进入变更数据捕获 (CDC) 阶段。 Database Migration Service 仍在对某些表执行完整转储,或者由于错误,一个或多个表无法完成完整转储。
  • 检查迁移作业错误,然后修正适用于表的错误或从作业中移除关联的表。
  • 检查 Database Migration Service 服务日志,查看是否有正在进行的完整转储活动,并等待其完成。

连接问题

本部分列出并介绍了潜在网络连接问题的问题排查步骤。

无法连接到目标数据库:EOF

运行 Connectivity Tests 会返回 [DATABASE] unable to connect to the destination database: EOF 出错提示。

可能的原因:服务连接配置不正确。

可尝试的操作:确保在 服务连接 Terraform 配置文件中将 enable_proxy_protocol 设置为 false。仅 NGINX 和 Apache 等 HTTP 服务器支持代理协议。

使用 gcloud 创建 Private Service Connect 设置时,代理协议默认处于停用状态。

连接超时,连接被拒绝

运行 Connectivity Tests 失败或超时。这很可能是由于 Private Service Connect 设置中的路由配置不正确所致。 造成此问题的原因可能有多种。

可能的原因:缺少防火墙规则,该规则允许 Private Service Connect NAT CIDR 范围访问堡垒机所在的 Private Service Connect 子网,特别是堡垒机虚拟机 nic0 接口。

解决方法:确保您的组织政策不会限制内部防火墙规则,例如在 Terraform 示例脚本中定义的 psc_sp_in_fw 防火墙规则,该脚本用于 为未启用 PSC 的 AlloyDB for PostgreSQL 实例配置目标专用 IP 连接。

可能的原因:代理已关闭。所提供的端口上没有监听器,因此连接会挂起。

可尝试的操作:您可以尝试与堡垒虚拟机建立 SSH 连接,并使用以下命令搜索代理:

  • netstat -tunalp | grep PORT

分析对该命令的响应:

  • 如果您收到空响应,则表示代理已关闭。请尝试运行以下命令:

    sudo su; cd /,然后运行 sudo dpkg -s dante-server 检查是否已安装 Dante 服务器:

    • 如果已安装代理,您会收到以下消息:

      Status: install ok installed

    • 如果未安装代理,则可能缺少路由器。添加路由器,然后运行 apt-get install dante-server 检查是否可以下载代理。

  • 如果代理正在运行并监听提供的端口,请尝试通过执行以下操作来打开与该代理的连接:

    1. 安装 PostgreSQL 客户端:

      sudo apt-get install postgresql-client。

    2. 连接到 PostgreSQL 数据库:

      psql -h 127.0.0.1 -p PORT -U DBUSERNAME -W(系统会提示您输入密码)。

      替换以下内容:

      • PORT:数据库端口号。
      • DBUSERNAME:用于连接到 PostgreSQL 数据库的用户名。
    3. 安装 telnet 客户端:

      sudo apt-get install telnet

    4. 连接到 telnet 客户端:

      telnet 127.0.0.1 PORT

      将 PORT 替换为数据库端口号。

    根据命令的结果,执行以下操作:

    • 如果命令无法打开连接,请尝试查看代理日志以找出根本原因。根本原因可能因 AlloyDB for PostgreSQL 实例设置而异。

    • 如果连接是使用 telnet 打开的,但在客户端中挂起,则可能的问题是堡垒 IP 地址路由。在虚拟机上,在终端中输入 ip route。查看您是否可以找到一条路由规则,该规则使用辅助 nic(nic1,即 DB_SUBNETWORK_GATEWAY IP 地址)将连接路由到 AlloyDB for PostgreSQL 实例专用 IP 地址。

可能的原因:服务连接不接受来自 Database Migration Service 的端点连接。服务连接包含已接受的项目列表,而 Database Migration Service 项目不在此列表中。

解决方法:如需解决此问题,请尝试以下任一方法:

排查 Oracle SCAN 错误

本部分介绍了使用单一客户端访问名称 (SCAN) 功能从 Oracle Real Application Clusters (RAC) 来源迁移时可能会遇到的潜在问题。

无法与 Oracle SCAN 数据库建立连接

运行 Connectivity Tests 失败或超时。

可能的原因:您可能正在尝试直接与 Oracle SCAN 源数据库建立连接。Database Migration Service 不支持在 Oracle RAC 环境中使用 SCAN 功能直接连接到数据库。

解决方法:如需解决此问题,请尝试以下任一方法:

  • 直接连接到其中一个节点。

  • 使用 Oracle Connection Manager。

  • 使用 HAProxy 等反向代理解决方案创建专用连接配置。