诊断 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 databaseDatabase 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

运行连接测试会返回 [DATABASE] unable to connect to the destination database: EOF 错误消息。

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

可以尝试的操作: 确保在 服务连接 Terraform 配置文件中将enable_proxy_protocol设置为 false。 代理协议仅适用于 HTTP 服务器,例如 NGINX 和 Apache。

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

连接超时,连接被拒绝

运行连接测试失败或超时。这很可能是由 Private Service Connect 设置中的路由配置错误导致的。 此问题可能有多种原因。

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

可以尝试的操作: 确保您的组织政策不会限制内部 防火墙规则,例如为非 PSC 启用的 AlloyDB for PostgreSQL 实例配置目标专用 IP 连接的示例 Terraform 脚本中定义的 psc_sp_in_fw 防火墙规则 。

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

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

  • netstat -tunalp | grep PORT

分析命令的响应:

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

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

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

    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。查看是否可以找到使用辅助 nicnic1DB_SUBNETWORK_GATEWAY IP 地址)将连接路由到 AlloyDB for PostgreSQL 实例专用 IP 地址的路由规则。

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

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

  • 在 Google Cloud 控制台中,前往 Private Service Connect

    前往 Private Service Connect

    已发布的服务 标签页中,接受来自 Database Migration Service 的服务连接连接(如果连接处于待处理状态)。

  • 将请求项目添加到服务连接中的允许的项目(如果连接被拒绝)。

    如果此操作无法解决问题,请重新创建连接配置文件。

  • 删除与 Private Service Connect 连接关联的连接配置文件,然后重新创建该文件。

排查 Oracle SCAN 错误

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

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

运行连接测试失败或超时。

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

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

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

  • 使用 Oracle Connection Manager

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