关于 bigquery-migration-metadata-extractor
用于 BigQuery 迁移准备的 Agent 技能,通过 gcloud 提取数据仓库目录元数据和查询历史,不提取表行数据。支持本地运行或临时 Compute Engine VM,适合需要为迁移分析源数据库结构与工作负载的团队。
主要功能
- 01提取目录 DDL 元数据
- 02提取查询历史日志
- 03支持本地或云端运行
- 04通过 Cloud Storage 保存 ZIP
适用场景
- 01为 SQL 转换和建表收集源架构
- 02评估迁移工作负载
- 03为查询血缘分析获取历史记录
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ google/ skills --skill bigquery-migration-metadata-extractor安装后在 Claude Code 中输入/bigquery-migration-metadata-extractor确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
assets/extraction_stats_template.pyreferences/attribution.mdcloud_extraction.mdextraction_stats_report.mdlocal_extraction.md详细介绍
BigQuery 迁移元数据提取
提取过程会通过两条 gcloud 命令运行 DWH 迁移提取器(dwh-migration-dumper),以收集目录 DDL 和查询历史记录,而非表行数据。如果用户想迁移表行(例如 Snowflake COPY INTO 卸载的数据),请询问他们更倾向于使用 BigQuery Data Transfer Service(包括 Snowflake connector),还是导出到 Cloud Storage 后使用 bq load 加载。这两条提取命令都属于 alpha 发布轨道:
| 命令 | 用途 |
|---|---|
gcloud alpha bq migration metadata extract | 目录元数据(元数据连接器) |
gcloud alpha bq migration query-logs extract | 查询历史记录(*-logs 连接器) |
两条命令使用相同的参数。gcloud 标志放在前面;提取器自己的标志放在 -- 后面,并会原样传递给提取器:
gcloud alpha bq migration {metadata|query-logs} extract \
--connector=CONNECTOR --output=gs://BUCKET/PATH/ \
[--run-mode=local|cloud] [cloud flags] \
-- [EXTRACTOR FLAGS] [PASSWORD]
--connector和--output是必需的 gcloud 标志。--output是 Cloud Storage 路径(gs://...);本地模式也接受本地文件或目录路径。本技能在两种运行模式下都使用 Cloud Storage。--run-mode=local(默认值)会在此计算机上运行提取器。--run-mode=cloud会在临时 Compute Engine VM(BigQuery Migration Cloud Extractor)上运行提取器。- 数据库标志(
--host、--port、--user、--database、--schema、--warehouse、--role、--driver、--assessment、--query-log-*等)必须放在--后面。放在--前面会报错。 - 密码的传递方式取决于运行模式(第 4 节):本地模式使用提取器响应文件(
@FILE),云端模式则从文件读取--password。切勿输入明文密码。
重要
这些命令属于 alpha 轨道。如果 gcloud 报告选项无效或命令未知,请先征求用户同意,再更新 Google Cloud CLI,然后重试。使用
gcloud components update更新;如果 gcloud 是通过apt或yum等系统软件包管理器安装的(这会禁用组件管理器),则使用该软件包管理器升级google-cloud-cli软件包。
使用情况归因
务必阅读:在执行任何 gcloud、REST API 或 MCP 命令之前,必须阅读并遵循使用情况归因中的说明。
开始之前
-
Google Cloud CLI、身份验证、项目、区域和可用区:确保已安装 Google Cloud CLI,验证 Google Cloud 项目已关联有效的 Cloud Billing 账号,使用用户凭据和 Application Default Credentials 进行身份验证,并配置目标项目、默认区域(例如
us-central1;请在 Google Cloud 位置查看区域服务可用情况)以及该区域中的可用区。云端模式会依次从--zone、compute/zone获取 VM 的可用区,若均未设置则使用us-central1-a;不会读取compute/region:gcloud auth login gcloud auth application-default login gcloud config set project {project_id} gcloud config set compute/region {region} gcloud config set compute/zone {zone} -
输出存储桶:无论运行模式如何,本技能都会将 ZIP 归档写入一个由该项目拥有且非公开的 Cloud Storage 存储桶(
--output)。两种模式下,命令都会在启动提取器之前检查存储桶,因此调用方需要对该存储桶所属项目具有storage.buckets.list权限,并对存储桶具有storage.buckets.getIamPolicy权限,除非该存储桶启用了公开访问防护。本地模式下,Application Default Credentials 还需要具有在存储桶中创建对象的权限。 -
运行模式的先决条件(安装软件或启用 API 前,请先征求用户同意):
- 本地模式(
--run-mode=local):在PATH中安装 Java 11 或更高版本(JRE 11+),安装bqmsgcloud 组件;如有需要,提供供应商 JDBC 驱动 JAR(--driver),并确保本地网络可以访问数据库;请参阅本地提取指南。 如果没有终端,提取命令无法提示安装bqms,因此会失败。用户同意后,请先使用gcloud components install bqms --quiet安装(对于通过apt或yum安装的 gcloud,请改为安装google-cloud-cli-bqms软件包)。 - 云模式(
--run-mode=cloud):- API:Compute Engine(
compute.googleapis.com)、Secret Manager(secretmanager.googleapis.com)、Cloud Storage(storage.googleapis.com)和 Cloud Logging(logging.googleapis.com)。 - 网络和子网:VPC
--network和--subnet(默认为default)需要具备到数据库的路由,且数据库需将 VM 的出站 IP 范围列入允许名单。VM 还需要互联网访问权限,以下载提取器并访问 Google API:请保留默认的外部 IP;或者,在使用--no-address时,在 VM 所在区域添加 Cloud NAT。到数据库的 Cloud VPN 或 Cloud Interconnect 路由不能替代此要求。 - IAM 权限:调用方需要具备创建 VM 和密钥的角色,例如 Compute Admin(
roles/compute.admin)和 Secret Manager Admin(roles/secretmanager.admin),以及第 2 项中所述的存储桶权限。使用已准备好的--gce-service-account时,调用方还需要在该账号上具备 Service Account User(roles/iam.serviceAccountUser)权限,而该账号本身需要具备云端提取指南中列出的角色。 - 默认服务账号:如果未提供
--gce-service-account,每次运行都会创建或复用bqms-cloud-extractor@{project_id}.iam.gserviceaccount.com,并为其授予九个项目角色,包括roles/editor、roles/compute.admin和roles/cloudkms.cryptoKeyDecrypter。这需要 Service Account Admin(roles/iam.serviceAccountAdmin)和 Project IAM Admin(roles/resourcemanager.projectIamAdmin)权限。没有终端时,gcloud 会自动接受其“是否创建?”提示,因此省略--gce-service-account前,请先征得用户明确同意;请参阅云端提取指南。
- API:Compute Engine(
- 本地模式(
-
费用和清理:请查阅 Google Cloud 定价,了解 Compute Engine、Secret Manager 和 Cloud Storage 的费用。云端运行结束后,请删除该次运行创建的 Secret Manager 密钥(第 5 节)。
1. 选择运行模式
--run-mode=local(默认) | --run-mode=cloud(Cloud Extractor) | |
|---|---|---|
| 提取器运行位置 | 本机(需要 Java 运行时) | 临时 Compute Engine VM |
| 到数据库的网络路径 | 本机网络(VPN、本地部署环境、堡垒机) | VM 的 VPC;数据库必须接受来自该 VM 的连接 |
| JDBC 驱动程序 | 任何驱动程序,包括通过 --driver 传入的供应商 JAR | 仅限提取器捆绑的驱动程序;VM 没有供应商 JAR,也无法读取本地的 --driver 路径 |
| 凭据 | 本地提取器读取的 @FILE 响应文件 | --password(从文件读取)与其他提取器参数一起存储在 VM 读取的 Secret Manager 密钥中 |
| 提取器任务失败 | 部分 ZIP 文件仍会写入 --output | 不会上传 ZIP 文件;运行失败 |
| 接下来阅读 | 本地提取指南 | 云端提取指南 |
在满足以下任一条件时,选择 local:
- 连接器需要云端 VM 不具备的 JDBC 驱动程序:
teradata、teradata-logs、teradata14-logs、oracle、oracle-logs、oracle-stats、sqlserver、mysql、netezza、vertica、vertica-logs。 在本地,bqms启动器会自行下载 Oracle、SQL Server 和 MySQL 驱动程序(本地提取器不附带 JDBC 驱动程序,因此启动器也会下载 Snowflake、Redshift、PostgreSQL 和 Greenplum 驱动程序);Teradata、Netezza 和 Vertica 需要--driver(第 3 节)。 - 数据库只能从用户的网络访问(本地部署环境、VPN,或无法从 Google Cloud 路由到的 私有端点)。
- 用户无法在项目中创建 Compute Engine VM、服务账号或密钥。
--host是localhost、127.0.0.1、::1,或无法从 Google Cloud VPC 路由到的 私有地址。切勿为这些地址使用--run-mode=cloud;VM 无法访问它们(在 VM 上,127.0.0.1指向 VM 本身,即使用户声称该地址已配置路由)。请提供可路由的地址;或者,如果用户已接受备用方案,则使用相同的--output在本地运行,并移除仅适用于云端的标志。
当数据库可从 Google Cloud 访问(Snowflake、 Redshift、BigQuery、托管在云端的 PostgreSQL/Greenplum、Hive metastore),且用户不希望在本地安装任何内容时,选择 cloud。
告诉用户你选择了哪种运行模式以及原因,例如说明云端模式无法加载供应商 JDBC 驱动程序,也无法访问只能从用户网络访问的数据库。
2. 连接器和命令
每个连接器只提取目录元数据或查询日志其中之一,因此只属于一个命令。运行两个命令即可获取两者。
| 来源 | metadata extract 连接器 | query-logs extract 连接器 |
|---|---|---|
| Snowflake | snowflake(或 snowflake-account-usage-metadata、snowflake-information-schema-metadata) | snowflake-logs(或 snowflake-account-usage-logs、snowflake-information-schema-logs) |
| Amazon Redshift | redshift | redshift-raw-logs(或 redshift-logs、redshift-serverless-logs) |
| Teradata | teradata | teradata-logs(版本 15+)、teradata14-logs |
| Oracle | oracle(DDL)、oracle-stats(用于评估的工作负载统计信息;时间范围由 --query-log-days 设置) | oracle-logs |
| Google BigQuery | bigquery | bigquery-logs |
| Greenplum | greenplum | greenplum-logs |
| Vertica | vertica | vertica-logs |
| PostgreSQL | postgresql | 无 |
| SQL Server / Azure | sqlserver | 无 |
| MySQL | mysql | 无 |
| Netezza | netezza | 无 |
| Apache Hive metastore | hiveql | 无 |
提示
目录元数据提取速度快(几分钟),且足以满足 SQL 转换、架构创建、Parquet 导出和静态血缘分析的需求。查询日志提取耗时较长,仅在评估工作负载,或追踪未以视图形式存储的查询的血缘关系时需要(例如 dbt 或 Airflow 的
INSERT ... SELECT作业)。 始终使用--query-log-start/--query-log-end或--query-log-days(置于--之后)限定日志提取范围。
3. 标志
gcloud 标志(位于 -- 之前):
| 标志 | 运行模式 | 含义 |
|---|---|---|
--connector | 两者 | 必填。必须与命令匹配(第 2 节)。 |
--output | 两者 | 必填。gs://BUCKET/PATH/(或 .zip 对象路径)。本地模式也接受本地文件或目录路径。 |
--run-mode | 两者 | local(默认)或 cloud。 |
--expected-owner | 两者 | 必须拥有 --output 存储桶的项目(默认为当前项目)。 |
--endpoint-mode | 两者 | 标准 gcloud 区域端点选择;除非用户提出要求,否则留空。 |
--project | 两者 | 标准 gcloud 项目标志。 |
--zone、--secret、--network 等 | 仅限云端 | 请参阅云端提取指南。 |
提取器标志(位于 -- 之后):
| 标志 | 含义 |
|---|---|
--host、--port、--url | 服务器地址,或可覆盖主机和端口的完整 JDBC URL。 |
--user、@FILE | 用户名,以及存放密码的响应文件(第 4 节)。 |
--database、--schema | 以逗号分隔的列表,用于限定提取范围。postgresql 仅提取第一个 --database,并忽略 --schema;每个数据库运行一次,并分别指定自己的 --output。 |
--warehouse、--role | Snowflake 会话设置(按会话设置;绝不更改用户默认值)。 |
--assessment | BigQuery Migration Assessment 的额外数据(向 snowflake 传入 --assessment 时,请省略 --database 和 --schema,因为两者不能同时使用)。仅影响 teradata、teradata-logs、redshift、redshift-raw-logs、snowflake、snowflake-logs、hiveql 和 greenplum-logs 的输出;其他连接器会忽略此标志。 |
--query-log-start、--query-log-end、--query-log-days | *-logs 连接器的查询日志时间范围。 |
--driver | 供应商 JDBC 驱动程序 JAR(teradata*、vertica* 和 netezza 必填;本地 bqms 启动器下载驱动程序时可选,用于覆盖)。仅限本地模式。 |
4. 凭据
切勿在命令行中输入明文密码,也不要要求用户将密码粘贴到聊天中。请用户在自己的终端中运行下面的密码文件命令,并在终端中设置 DB_PASSWORD(例如,在 bash 或 zsh 中运行 read -rs DB_PASSWORD && export DB_PASSWORD),或者以其他方式创建文件,然后只提供文件路径。若未设置 DB_PASSWORD,这些命令会报错停止,而不会写入空密码。具体使用哪种机制取决于运行模式。
本地模式:@FILE 响应文件。 本地提取器会将 @FILE 参数作为 YAML 响应文件读取,并将每个键转换为一个标志,因此,包含 password: ... 的文件会提供 --password,而无需将密码放在命令行中。请以只有用户才能读取的权限写入文件,并将值用单引号括起来(其中任何 ' 都要加倍),以保留特殊字符。这种形式适用于 bash、zsh 和 sh,并假设密码只有一行:
: "${DB_PASSWORD:?DB_PASSWORD is not set}" && umask 077 && printf "password: '%s'\n" "$(printf '%s' "$DB_PASSWORD" | sed "s/'/''/g")" > ./extractor-secret.yaml
在 -- 后传入 @./extractor-secret.yaml(若文件位于当前目录之外,请使用绝对路径,例如 @$HOME/path/file.yaml;@~/... 不会展开)。
云模式:从文件读取 --password。 CLI 会将提取器参数按原样存储在 Secret Manager 中,VM 会使用这些参数运行提取器。VM 无法访问你的本地文件,因此在 VM 上使用 @FILE 参数会失败。请将密码写入只有用户才能读取的文件,并在 -- 后通过命令替换传入:
: "${DB_PASSWORD:?DB_PASSWORD is not set}" && umask 077 && printf '%s' "${DB_PASSWORD}" > ./db_password
-- ... --password="$(cat ./db_password)"
随后,该值会保存在本次运行的 Secret Manager 密钥中(运行后删除,见第 5 节),并且在 gcloud 运行期间会显示在这台机器的进程列表中,因此请使用只有用户才能访问的机器。
如果是你创建的密码文件,请在完成后删除;如果是用户提供的文件,请保留。
5. 快速开始
本地(使用供应商驱动程序的本地部署 Teradata):
gcloud alpha bq migration metadata extract \
--connector=teradata \
--output="gs://{bucket}/teradata_metadata/" \
-- \
--host="{teradata_host}" \
--user="{db_user}" \
--driver="{path_to}/terajdbc4.jar" \
--assessment \
@./extractor-secret.yaml
云端(通过 Cloud Extractor 使用 Snowflake):
gcloud alpha bq migration metadata extract \
--connector=snowflake \
--output="gs://{bucket}/snowflake_metadata/{run_label}/" \
--run-mode=cloud \
--project="{project_id}" \
--zone="{zone}" \
--secret="bqms-extractor-creds-{run_label}" \
-- \
--host="{account_identifier}.snowflakecomputing.com" \
--user="{db_user}" \
--database="{db_name}" \
--warehouse="{db_warehouse}" \
--role="{db_role}" \
--password="$(cat ./db_password)"
--secret 是可选的。如果不指定,CLI 会创建
bqms-extractor-creds-run-EPOCH_SECONDS,打印其名称,并为其添加标签
goog-bqms-extractor-run-id。如果传入 --secret,每次运行都要使用新的 {run_label}:如果密钥已存在,CLI 只会添加一个版本,之后删除该密钥也会同时删除它之前的版本。
每次云端运行都要指定一个尚无 .zip 文件的 --output 前缀,例如新的 {run_label} 文件夹。gcloud 只要在 --output 下找到任何非空 .zip 文件,就会报告成功,而不会检查文件的写入时间。如果那里有较早的归档文件(来自先前的元数据、查询日志或本地运行),命令就会立即以 Extraction complete 结束,而此时新 VM 仍在启动;此时删除密钥会导致实际运行失败。如果用户指定了前缀,请先检查 gcloud storage ls "gs://{bucket}/{path}/" 是否未列出任何 .zip,确认后按原样使用该前缀;否则请建议使用新的子前缀。
每个会运行或建议运行提取的回答,都必须按以下顺序包含这些步骤及其命令:
- 检查退出代码和任务摘要(第 6 节第 1 步)。
- 使用统计信息模板验证输出(第 6 节第 2 步):
cp <SKILL_DIR>/assets/extraction_stats_template.py ./extraction_stats.py && python3 ./extraction_stats.py --input "gs://{bucket}/{path}/"。 - 云端运行后,在完成第 1 和第 2 步后删除本次运行的 Secret Manager 密钥(如果运行失败,则立即删除),并说明原因:该密钥仍保存着数据库密码。如果传入了
--secret,请删除该名称对应的密钥:gcloud secrets delete bqms-extractor-creds-{run_label} --project={project_id} --quiet。否则,请删除命令打印出的自动命名密钥bqms-extractor-creds-run-EPOCH_SECONDS,或使用gcloud secrets list --filter="labels.goog-bqms-extractor-run-id:*"查找。只删除为本次运行创建的密钥;如果用户要求重复使用现有密钥,请在运行前记录其最新版本,并且只销毁本次运行新增的版本。请参阅云端提取指南的清理部分。 - 删除你创建的
extractor-secret.yaml或db_password;如果文件由用户提供,则保留不动。
6. 检查结果
-
退出代码和任务摘要。 任何必需任务失败时,提取器都会以 1 退出。具体含义取决于运行模式:
- 本地: gcloud 会报告
BigQuery Migration Extractor failed with exit code 1,但提取器已经将 ZIP 写入--output,其中每项失败都会有一个*.exception.txt条目。出现此错误后若已有 ZIP,即表示部分成功,不应因此重新运行。 - 云端: 只有提取器以 0 退出时,VM 才会上传 ZIP,因此只有在运行前
--output下没有.zip文件时,Extraction complete才表示成功(第 5 节)。如果任何必需任务失败,就不会上传任何内容,gcloud 会报告Extraction finished, but no non-empty artifact was found。务必告知用户接下来的两步:查看 VM 日志,了解提取器失败的原因;然后修复原因并重新运行,或使用--run-mode=local重新运行,以保留部分 ZIP。只有在找到错误条目时,gcloud 才会打印gcloud logging read 'resource.type="gce_instance" AND resource.labels.instance_id="..."'命令;否则,请根据Instance Link:行中的 VM 名称查询日志(参阅云端提取指南中的监控部分)。此外,还要删除本次运行的密钥(第 5 节)。 对于本地的不完整 ZIP,请查看N TASKS SUCCEEDED / N TASKS FAILED摘要和异常条目(unzip -l {archive}.zip '*.exception.txt'会列出失败的任务;每个文件都很长,因此只需读取错误信息:unzip -p {archive}.zip '{task}.exception.txt' | grep -m 3 -E '^\s*message:')。如果同一任务的特定版本回退任务已成功,则该失败无碍;回退任务带有版本后缀,例如在 PostgreSQL 11 及更高版本中,已填充数据的functions-11.csv旁边会有functions.csv.exception.txt。
- 本地: gcloud 会报告
-
存档完整性和统计信息。 将 提取统计信息模板 (
<SKILL_DIR>/assets/extraction_stats_template.py,其中<SKILL_DIR>是包含此SKILL.md的目录)复制到工作目录,然后对 ZIP、其文件夹或 GCS 前缀运行:cp <SKILL_DIR>/assets/extraction_stats_template.py ./extraction_stats.py python3 ./extraction_stats.py --input "gs://{bucket}/snowflake_metadata/"如果
gs://形式运行失败,请使用gcloud storage cp将 ZIP 复制到本地,然后对本地文件运行脚本。脚本会拒绝不完整的存档(22 字节的占位文件),并报告提取器遥测状态、数据库、架构、基表、视图和列的数量、基表行数和字节大小总计、按架构和表划分的明细,以及列数据类型分布。完整报告指标和
# CUSTOMIZE:扩展点请参阅 统计报告规范(例如,编辑_EXCLUDED_SYSTEM_SCHEMAS或_should_include_schema()以排除STAGING_TMP架构)。
说明
脚本会根据 Snowflake、Redshift(
svv_*)和 Teradata(dbc.*V)目录布局计算对象、行和字节数;对于 BigQuery 的tables.jsonl,则会统计表、视图和顶层列的数量(该连接器不会记录行数和大小,因此这些值显示为N/A)。如果存档中包含dumper-telemetry.jsonl,脚本会从中读取运行状态。对于其他布局(例如 PostgreSQL、Oracle 或 Hive 的tables.jsonl),脚本仍会验证存档并报告连接器和主机,但对象计数为零,运行状态可能显示为UNKNOWN。在 PostgreSQL 11 及更高版本中,脚本会显示FAILURE,这是因为functions.csv和aggregates.csv的回退任务虽失败但无碍(第 6 节,步骤 1)。此时请使用提取命令打印的任务摘要来查看运行状态,并从连接器自己的文件中统计对象(第 7 节)。
7. 输出归档
除非 --output 指定了 .zip 对象,否则对于 metadata extract 连接器,提取器会将 ZIP 命名为
dwh-migration-{connector}-metadata.zip;对于 query-logs extract 连接器,则命名为
dwh-migration-{connector}.zip,这些连接器的名称本身已以 -logs 结尾:
snowflake 会生成
dwh-migration-snowflake-metadata.zip,而 snowflake-logs 会生成
dwh-migration-snowflake-logs.zip。少数名称有所不同(oracle-stats 会生成
dwh-migration-oracle-stats.zip;hiveql 和使用
--assessment 提取的查询日志会附加 -YYYYMMDDTHHMMSS 时间戳),因此请列出
--output 以查找归档。每个归档都包含 compilerworks-metadata.yaml(提取器
版本和参数)以及连接器专属的 CSV 文件:
dwh-migration-snowflake-metadata.zip
├── databases-au.csv # Databases and owners
├── schemata-au.csv # Schemas
├── tables-au.csv # Tables, row counts, byte sizes
├── columns-au.csv # Columns, ordinal positions, types, nullability
├── views-au.csv # View DDL
├── functions-au.csv # User-defined and external functions
├── external_tables.csv # External stage tables
├── snowflake.yaml # Assessment flag and warehouse count
├── compilerworks-metadata.yaml # Extractor version and flags
└── dumper-telemetry.jsonl # Task timings
dwh-migration-snowflake-logs.zip
├── query_history_2026-08-05T000000Z.csv # One file per rotation window
├── ...
└── compilerworks-metadata.yaml
dwh-migration-postgresql-metadata.zip
├── database.csv # Databases on the server
├── is_columns_private.csv # Columns of user tables and views
├── pg_views_private.csv # User view DDL
├── functions-11.csv # Functions on search_path (11+; drop pg_catalog)
├── aggregates-11.csv, types.csv, casts.csv
├── is_columns_generic.csv, pg_views_generic.csv # System catalog objects
├── pg_user.csv # Roles and privileges (passwords masked)
├── *.csv.exception.txt # One per failed task
└── compilerworks-{metadata.yaml,arguments.txt,version.txt,format.txt}
在 PostgreSQL 归档中,*_private.csv 文件包含用户对象,*_generic.csv 文件包含
系统对象。is_columns_private.csv 包含视图列;从中减去 pg_views_private.csv 中的视图,即可统计基表数量。
functions-11.csv、aggregates-11.csv 和 types.csv 仅列出会话 search_path 上可见的对象(默认值为 "$user", public),因此不会包含其他架构中的函数和类型。若要包含这些对象,请将 --host、
--port 和 --database 替换为
--url="jdbc:postgresql://{host}:{port}/{db_name}?currentSchema={schema1},{schema2},public"。
归档中绝不会包含数据库密码:要确认这一点,请检查
compilerworks-arguments.txt 和 compilerworks-metadata.yaml 中没有
password 条目(若密码是常见词语,通过扫描密码值无法可靠判断);不过其中确实包含对象 DDL 和角色列表,而
dumper-telemetry.jsonl 是从
~/.cache/DWH-Dumper/all-dumper-telemetry.jsonl 复制而来,因此可能包含此前在同一台机器上运行提取器时记录的连接器、主机和错误信息。请将这些文件视为敏感信息,并将其保存在私有存储桶中。
8. 下游 BigQuery 工作流
每次云端运行都会写入各自的 --output 前缀(第 5 节)。若要将归档一起移交,请将已完成的 ZIP 文件复制到一个共享前缀,例如 gcloud storage cp "gs://{bucket}/{run_prefix}/*.zip" "gs://{bucket}/assessment/",切勿将该共享前缀用作云端
--output。然后:
- BigQuery 迁移评估:引导用户前往 Google Cloud Console 中的 BigQuery >
Migration > Assessment,并提供包含元数据(使用
--assessment提取)和日志的 GCS 前缀。 - 批量 SQL 转换:在 BigQuery > Migration > SQL translation 中附加元数据 ZIP 作为架构上下文,或通过 BigQuery Migration API / BQMS MCP 工具完成(参见
bigquery-migration-sql-translator)。 - 表数据传输(不在范围内):此技能仅提取目录元数据和查询日志。如果用户要求导出或加载表行数据(例如 Snowflake
COPY INTO卸载),请询问他们是否想使用 BigQuery Data Transfer Service(包括 Snowflake transfer connector),或将数据导出为 Parquet/CSV 到 Cloud Storage,再通过bq load加载。