诊断 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 无法访问堡垒主机,或者堡垒主机不接受连接。 请验证 来源连接配置文件中的转发 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。 代理协议仅适用于 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。查看是否可以找到使用辅助 nicnic1,即 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)创建专用连接配置。