排查迁移问题

本文档可帮助您排查将数据仓库(例如 Teradata、Amazon Redshift、Oracle 或 Apache Hive)迁移到 BigQuery 时遇到的常见问题,包括与迁移评估、交互式和批量 SQL 转换以及使用 dwh-migration-dumper 命令行提取工具生成元数据相关的问题。

如需检查已迁移的查询和作业的作业执行详情、错误代码和 slot 使用情况,您还可以查询 INFORMATION_SCHEMA.JOBS 视图。

迁移评估

以下部分介绍了将数据仓库迁移到 BigQuery 时的一些常见问题和问题排查方法。

dwh-migration-dumper 工具错误

如需排查元数据或查询日志提取期间发生的 dwh-migration-dumper 工具终端输出中的错误和警告,请参阅生成元数据问题排查。

Hive 迁移错误

以下部分介绍了在您计划将数据仓库从 Hive 迁移到 BigQuery 时可能会遇到的常见问题。

hadoop-migration-assessment 查询日志提取日志记录钩子会在 hive-server2 日志中写入调试日志消息。如果您遇到任何问题,请查看包含 MigrationAssessmentLoggingHook 字符串的日志记录钩子调试日志。

处理 ClassNotFoundException 错误

此错误可能是由日志记录钩子 JAR 文件错误导致的。确保您已将 JAR 文件添加到 Hive 集群上的 auxlib 文件夹。您也可以在 hive.aux.jars.path 属性中指定 JAR 文件的完整路径,例如 file://AUXLIB_PATH/HiveMigrationAssessmentQueryLogsHooks_deploy.jar。

子文件夹不显示在已配置的文件夹中

此问题可能是由日志记录钩子初始化期间配置错误或出现问题引起的。

在您的 hive-server2 调试日志中搜索以下日志记录钩子消息:

Unable to initialize logger, logging disabled
Log dir configuration key 'dwhassessment.hook.base-directory' is not set,
logging disabled.
Error while trying to set permission

请查看问题详情,看看是否需要进行更正,以修复相关问题。

文件不显示在文件夹中

此问题可能是由事件处理期间或向文件写入时遇到问题导致的。

在您的 hive-server2 调试日志中搜索以下日志记录钩子消息:

Failed to close writer for file
Got exception while processing event
Error writing record for query

请查看问题详情,看看是否需要进行更正,以修复相关问题。

缺少某些查询事件

此问题可能是由日志记录钩子线程队列溢出引起的。

在您的 hive-server2 调试日志中搜索以下日志记录钩子消息:

Writer queue is full. Ignoring event

如果您看到此消息,请考虑增大 dwhassessment.hook.queue.capacity 参数。

交互式 SQL 转换器

以下部分介绍了使用交互式 SQL 转换器时经常遇到的错误。

RelationNotFound 或 AttributeNotFound 转换问题

使用交互式 SQL 转换器转换查询后,您可能会遇到转换失败的情况,并收到 RelationNotFound 或 AttributeNotFound 错误。

您可以在 Google Cloud 控制台的 BigQuery 中前往转换详细信息页面,然后打开日志消息标签页,找到失败的转换。

为了确保最准确的翻译,您可以在查询之前输入查询中使用的任何表的数据定义语言 (DDL) 语句。例如,如果要转换 Amazon Redshift 查询 select table1.field1, table2.field1 from table1, table2 where table1.id = table2.id;,请在交互式 SQL 转换器中输入以下 SQL 语句:

create table schema1.table1 (id int, field1 int, field2 varchar(16));
create table schema1.table2 (id int, field1 varchar(30), field2 date);

select table1.field1, table2.field1
from table1, table2
where table1.id = table2.id;

使用 Gemini 修正翻译问题

如需修正出现 RelationNotFound 或 AttributeNotFound 错误的翻译作业,您还可以使用 Gemini 解决这些问题:

  1. 在 Google Cloud 控制台的 BigQuery 中,前往翻译详情页面,然后打开日志消息标签页。
  2. 点击类别列中显示消息 RelationNotFound 或 AttributeNotFound 的查询。
  3. 点击建议的修正。
  4. 点击应用。
  5. 如需重新翻译查询,请点击翻译。

批量 SQL 转换器

以下部分介绍了使用批量 SQL 转换器时遇到的常见错误。

RelationNotFound 或 AttributeNotFound 转换问题

使用批量 SQL 转换器转换查询后,您可能会遇到转换失败的情况,并收到 RelationNotFound 或 AttributeNotFound 错误。

您可以在 Google Cloud 控制台的 BigQuery 中前往转换详情页面,然后打开日志消息标签页,找到失败的转换。

Translation 最适合元数据 DDL。如果找不到 SQL 对象定义,则转换引擎会引发 RelationNotFound 或 AttributeNotFound 问题。我们建议您使用元数据提取器生成元数据包,以确保所有对象定义都存在。添加元数据是解决大多数翻译错误的建议第一步,因为这通常可以解决许多因缺少元数据而间接引发的其他错误。

如需了解详情,请参阅生成元数据以进行翻译和评估。

使用 Gemini 修正翻译问题

如需修正出现 RelationNotFound 或 AttributeNotFound 错误的翻译作业,您还可以使用 Gemini 解决这些问题:

  1. 前往翻译详情页面,然后打开日志消息标签页。
  2. 点击类别列中显示消息 RelationNotFound 或 AttributeNotFound 的查询。
  3. 如需前往“代码”标签页中包含错误的相应文件和行,请点击

    错误消息。

  4. 在操作列中,点击建议的修复。

  5. 选择以下某个选项:应用或应用并重新运行:

    • 如需将生成的架构文件从输出目录复制到输入目录,请点击 Apply。
    • 如需将生成的架构文件从输出目录复制到输入目录并打开重新运行窗口,请点击 Apply and rerun。

生成元数据以进行转换和评估

以下部分介绍了 dwh-migration-dumper 工具的一些常见问题和问题排查方法。

内存不足错误

dwh-migration-dumper 工具终端输出中的 java.lang.OutOfMemoryError 错误通常与内存不足以处理检索的数据有关。如需解决此问题,请增加可用内存或减少处理线程数。

您可以通过导出 JAVA_OPTS 环境变量来增加最大内存:

Linux

export JAVA_OPTS="-Xmx4G"

Windows

set JAVA_OPTS="-Xmx4G"

您可以通过添加 --thread-pool-size 标志值来减少处理线程数(默认值为 32)。此选项仅支持 hiveql 和 redshift* 连接器:

dwh-migration-dumper --thread-pool-size=1

处理 WARN...Task failed 错误

您有时可能会在 dwh-migration-dumper 工具终端输出中看到 WARN [main] o.c.a.d.MetadataDumper [MetadataDumper.java:107] Task failed: … 错误。提取工具会将多个查询提交到源系统,并且每个查询的输出会写入其各自的文件中。出现此问题意味着其中一个查询失败。不过,一个查询失败不会阻止其他查询执行。如果您看到多个 WARN 错误,请查看问题详情,看看是否有任何需要更正的问题,以便查询正确运行。例如,如果您在运行提取工具时指定的数据库用户缺少读取所有元数据的权限,请使用具有正确权限的用户重试。

ZIP 文件损坏

如需验证 dwh-migration-dumper 工具 ZIP 文件,请下载 SHA256SUMS.txt 文件并运行以下命令:

Bash

sha256sum --check SHA256SUMS.txt

OK 结果表示校验和验证成功。任何其他消息都表示验证错误:

  • FAILED: computed checksum did NOT match:ZIP 文件已损坏,必须重新下载。
  • FAILED: listed file could not be read:找不到 ZIP 文件版本。从同一发布版本下载校验和以及 ZIP 文件,并将它们放在同一目录中。

Windows PowerShell

(Get-FileHash RELEASE_ZIP_FILENAME).Hash -eq ((Get-Content SHA256SUMS.txt) -Split " ")[0]

将 RELEASE_ZIP_FILENAME 替换为 dwh-migration-dumper 命令行提取工具版本的下载 ZIP 文件名,例如 dwh-migration-tools-v1.0.52.zip。

True 结果表示校验和验证成功。

False 结果表示验证错误。从同一发布版本下载校验和以及 ZIP 文件,并将它们放在同一目录中。

Teradata 查询日志提取速度缓慢

如需提高 -Dteradata-logs.query-logs-table 和 -Dteradata-logs.sql-logs-table 标志指定的联接表的性能,您可以在 JOIN 条件中额外添加一个类型为 DATE 的列。此列必须在两个表中定义,并且必须是分区主索引的一部分。如需添加此列,请使用 -Dteradata-logs.log-date-column 标志。

以下示例展示了如何使用 -Dteradata-logs.log-date-column 标志:

Bash

dwh-migration-dumper \
  -Dteradata-logs.query-logs-table=historicdb.ArchivedQryLogV \
  -Dteradata-logs.sql-logs-table=historicdb.ArchivedDBQLSqlTbl \
  -Dteradata-logs.log-date-column=ArchiveLogDate

Windows PowerShell

dwh-migration-dumper `
  "-Dteradata-logs.query-logs-table=historicdb.ArchivedQryLogV" `
  "-Dteradata-logs.sql-logs-table=historicdb.ArchivedDBQLSqlTbl" `
  "-Dteradata-logs.log-date-column=ArchiveLogDate"

已超出 Teradata 行大小限制

Teradata 版本 15 的行大小上限为 64 KB。如果超出限制,提取工具会失败并显示以下消息:

[Error 9804] [SQLState HY000] Response Row size or Constant Row size overflow

如需解决此错误,请将行限制扩展到 1 MB 或将行拆分为多行:

  • 安装并启用 1MB 永久性和响应行功能以及当前 TTU 软件。如需了解详情,请参阅 Teradata 数据库消息 9804。
  • 使用 -Dteradata.metadata.max-text-length 和 -Dteradata-logs.max-sql-length 标志将长查询文本拆分为多行。

以下命令展示了如何使用 -Dteradata.metadata.max-text-length 标志将长查询文本拆分为多行,每行最多 10,000 个字符:

Bash

dwh-migration-dumper \
  --connector teradata \
  -Dteradata.metadata.max-text-length=10000

Windows PowerShell

dwh-migration-dumper `
  --connector teradata `
  "-Dteradata.metadata.max-text-length=10000"

以下命令展示了如何使用 -Dteradata-logs.max-sql-length 标志将长查询文本拆分为多行,每行最多 10,000 个字符:

Bash

dwh-migration-dumper \
  --connector teradata-logs \
  -Dteradata-logs.max-sql-length=10000

Windows PowerShell

dwh-migration-dumper `
  --connector teradata-logs `
  "-Dteradata-logs.max-sql-length=10000"

Oracle 连接问题

在密码或主机名无效等常见情况下,dwh-migration-dumper 工具会输出一条有意义的错误消息,其中描述了根本问题。不过,在某些情况下,Oracle 服务器返回的错误消息可能是通用的,并且难以调查。

其中一个问题是 IO Error: Got minus one from a read call。此错误表示已与 Oracle 服务器建立连接,但服务器未接受客户端并关闭了连接。此问题通常发生在服务器仅接受 TCPS 连接时。默认情况下,dwh-migration-dumper 工具使用 TCP 协议。如需解决此问题,您必须替换 Oracle JDBC 连接网址。

您可以通过提供以下格式的 url 标记来解决此问题,而无需提供 oracle-service、host 和 port 标记:jdbc:oracle:thin:@tcps://HOST_NAME:PORT/ORACLE_SERVICE。通常,Oracle 服务器使用的 TCPS 端口号为 2484。

以下示例展示了如何在命令中指定连接网址:

dwh-migration-dumper \
  --connector oracle-stats \
  --url "jdbc:oracle:thin:@tcps://HOST_NAME:PORT/ORACLE_SERVICE" \
  --assessment \
  --driver "JDBC_DRIVER_PATH" \
  --user "USER" \
  --password

除了将连接协议更改为 TCPS 之外,您可能还需要提供验证 Oracle 服务器证书所需的信任库 SSL 配置。如果缺少 SSL 配置,系统会显示 Unable to find valid certification path 错误消息。如需解决此问题,请设置 JAVA_OPTS 环境变量:

set JAVA_OPTS=-Djavax.net.ssl.trustStore="JKS_FILE_LOCATION" -Djavax.net.ssl.trustStoreType=JKS -Djavax.net.ssl.trustStorePassword="PASSWORD"

根据您的 Oracle 服务器配置,您可能还需要提供密钥库配置。如需详细了解配置选项,请参阅使用 Oracle JDBC 驱动程序的 SSL。

后续步骤