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

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

迁移作业错误

迁移作业进程在运行时可能会出错。

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

发生错误时,迁移作业状态会变为 Failed,子状态会反映失败前的最后状态。如需排查错误,请前往失败的迁移作业以查看错误,然后按照错误消息中列出的步骤操作。 如需查看有关该错误的更多详细信息,请使用迁移作业中的链接前往 Cloud Monitoring。日志会按特定迁移作业进行过滤。

在下表中,您可以查看一些问题示例以及这些问题的解决方法:

症状 可能的原因 可以尝试的操作
错误消息:Database Migration Service can't set up a tunnel to be connected to the bastion host。 Database Migration Service 无法访问堡垒主机,或者堡垒主机不接受连接。 请验证,然后重试。
错误消息: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

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

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

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

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

连接超时,连接被拒绝

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

可能的原因:缺少防火墙规则,导致 Private Service Connect NAT CIDR 范围无法访问堡垒所在的 Private Service Connect 子网,尤其是堡垒虚拟机 nic0 接口。

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

可能的原因:代理服务器出现故障。所提供的端口上没有监听器,因此连接挂起。

可尝试的操作:您可以尝试与堡垒虚拟机建立 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 替换为数据库端口号。

    根据命令的结果:

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

    • 如果使用 telnet 打开连接,但在客户端中挂起,则可能的问题是堡垒 IP 地址路由。在虚拟机上,于终端中输入 ip route。查看是否可以找到使用辅助 nic(nic1,即 DB_SUBNETWORK_GATEWAY IP 地址)将连接路由到 Cloud SQL 实例专用 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)创建专用连接配置。