使用MMS执行数据迁移

更新时间:
复制 MD 格式

完成了目标 schema 和 SQL 转换后。本文档介绍如何用 MaxCompute Migration Service(MMS) 搬迁数据。

目标

  • 配置一个具备 MMS 最小 BigQuery 权限集的 GCP Service Account。

  • 在 MMS 中注册 BigQuery 数据源,创建全量与增量迁移作业。

  • 在作业配置阶段将 BigQuery 分区映射到 MaxCompute 分区。

  • 监控作业进度、校验行数、并从部分失败中恢复。

对于绝大多数 BigQuery → MaxCompute 迁移,MMS 是推荐路径,免去了手工 export/import 管线(BigQuery → GCS → OSS → MaxCompute),该管线在大规模场景下容易引发数据正确性与成本问题。

MMS 能力总览

MaxCompute Migration Service(MMS 4.0) 是一个托管迁移工具,通过 BigQuery Storage Read API 直连 BigQuery,通过 Tunnel 服务写入 MaxCompute。

  • 关键能力

    能力

    说明

    直连搬迁

    无需 GCS / OSS 中转

    自动 Schema 转换

    按文档 3 类型映射执行,无需手写 DDL

    分区感知搬迁

    保留 BigQuery 时间列与摄入时间分区;映射到 MaxCompute AUTO PARTITIONED BY

    全量与增量模式

    全库、指定 Dataset、指定表、或按分区过滤

    并发度可配

    作业级并行 + 每表线程池

    带宽控制

    限制出向吞吐,尊重 BigQuery / 网络 SLA

    内置校验

    每张表完成后做行数比对

    重试机制

    作业级 + 表级重试,覆盖部分失败

    进度看板

    表级状态(等待 / 运行 / 完成 / 失败),带每表指标

  • 不适用 MMS 的场景。

    • 实时流数据(由 Pub/Sub 灌入 BigQuery 的表,需要零间隙捕获),先搭并行的 Flink / DataHub 接入,切换后再用 MMS 做历史回填。

    • 需要显著手工调整的 schema(例如为下游消费者做列类型强转),在 MaxCompute 预建目标表,使用 MMS 的“目标 schema 提供模式”。

工具操作说明

GCP Service Account 配置

  • 所需 IAM 角色

    角色

    用途

    roles/bigquery.dataViewer

    读取 Dataset 元数据与表数据。在项目或 Dataset 级授予

    roles/bigquery.jobUser

    运行 Storage Read API 会话(按 Job 计量)。在项目级授予

  • 命令行创建

    export GCP_PROJECT="your-project"
    export SA_NAME="mms-migration"
    export SA_EMAIL="${SA_NAME}@${GCP_PROJECT}.iam.gserviceaccount.com"
    
    gcloud iam service-accounts create "${SA_NAME}" \
      --display-name "MaxCompute Migration Service" \
      --project "${GCP_PROJECT}"
    
    gcloud projects add-iam-policy-binding "${GCP_PROJECT}" \
      --member "serviceAccount:${SA_EMAIL}" \
      --role "roles/bigquery.dataViewer"
    
    gcloud projects add-iam-policy-binding "${GCP_PROJECT}" \
      --member "serviceAccount:${SA_EMAIL}" \
      --role "roles/bigquery.jobUser"
    
    gcloud iam service-accounts keys create ./mms-sa-key.json \
      --iam-account "${SA_EMAIL}"
  • 上传到 MMS

    MMS 控制台 → 数据源 → 新建 → BigQuery → 上传 mms-sa-key.json 并指定 GCP 项目 ID。MMS 校验 key 并列出可访问的 Dataset。

  • 安全提示

    JSON key 文件只在上传窗口期保留。MMS 确认数据源注册后立即删除本地副本。项目结束时轮换密钥。

在 MMS 中创建迁移作业

MMS 作业向导分五个阶段:

阶段 1:作业基本信息

  • 作业名、描述、源(已注册的 BigQuery 数据源)、目标(MaxCompute 项目)。

  • 作业类型:全量迁移(所有行)或增量迁移(从检查点之后的行)。

阶段 2:迁移范围

  • 全库

    该服务账号可见的所有 Dataset。

  • 指定 Dataset

    一个或多个 Dataset,包含其中所有表。

  • 指定表

    明确的表清单。

  • 每一项可选分区过滤(例如 ss_sold_date >= '2026-01-01'),只迁移片段。

阶段 3:目标配置

  • 目标 MaxCompute 项目 + Schema。

  • 目标表格式:

    • Append Delta Table(推荐,绝大多数 BigQuery 迁移)。

    • 标准表(少见,一次性快照场景)。

  • 命名规则:

    {source_dataset}_{source_table} 或用户提供的前后缀模式。

  • Schema 策略:

    • 自动生成

      MMS 应用文档 3 的类型映射(最常见)。

    • 使用已有

      目标表必须先存在;MMS 校验 schema 一致。

阶段 4:分区映射

  • MMS 自动检测源分区并给出建议:

    BigQuery 分区

    MMS 建议目标

    时间列(col DATE)

    AUTO PARTITIONED BY (TRUNC_TIME(col, 'day') AS <col>_dt)

    摄入时间(_PARTITIONTIME)

    AUTO PARTITIONED BY (TRUNC_TIME(_partitiontime, 'day') AS event_dt) + ingestion_time_partition = true

    整数范围

    范围聚簇(见文档 3 §3.2.4)或手动分区列

    无分区

    无分区

确认建议或覆盖粒度 / 派生列名。

阶段 5:性能与调度

  • 表并发(默认 4,上限 32)。

  • 每表线程数(默认 8,上限 32)。

  • 带宽上限(默认无限制;建议按 BigQuery 出向预算或共享网络约束设定)。

  • 调度:立即、单次未来时刻、或周期性(增量作业)。

提交作业。它会进入作业列表,状态为 pending,开始执行时转 running。

监控与排错

  • 作业进度看板

    • 总体状态:pending / running / completed / partially-failed / failed。

    • 每表拆解:状态、已迁移行数、已迁移字节数、耗时。

    • 实时吞吐图(行/秒、MB/秒)—— 便于发现网络或配额瓶颈。

  • 行数校验 每张表完成后 MMS 在源和目标各跑 SELECT COUNT(*) 并记录匹配/不匹配。若不匹配,状态标 failed,报告具体差量。

  • 常见失败模式

    现象

    根因

    处理

    Permission denied(读表时)

    服务账号缺少 Dataset 级 bigquery.dataViewer

    在 Dataset 级授权,重试失败表

    Storage Read API not enabled

    GCP 项目未启用 BigQuery Storage API

    gcloud services enable bigquerystorage.googleapis.com 启用

    大表网络超时

    跨区出向撞 NAT / 防火墙限制

    降低每表线程数;考虑带宽上限;开启重试

    Schema 不匹配(目标已存在)

    目标表已存在且列不一致

    删除目标,或改用自动生成模式

    行数不匹配

    迁移过程中源被并发写入

    冻结源写入,或在初次迁移后跑一次增量补迁作业

  • 重试行为

    MMS 按表粒度重试: 部分失败不会重跑已完成表。在作业详情页点击重试失败表。

  • 日志入口

    每表详细日志(Tunnel session ID、每 session 字节数、重试次数)在作业详情页可查。提工单时附上作业 ID 与表名。