完成了目标 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 enabledGCP 项目未启用 BigQuery Storage API
gcloud services enable bigquerystorage.googleapis.com启用大表网络超时
跨区出向撞 NAT / 防火墙限制
降低每表线程数;考虑带宽上限;开启重试
Schema 不匹配(目标已存在)
目标表已存在且列不一致
删除目标,或改用自动生成模式
行数不匹配
迁移过程中源被并发写入
冻结源写入,或在初次迁移后跑一次增量补迁作业
重试行为
MMS 按表粒度重试: 部分失败不会重跑已完成表。在作业详情页点击重试失败表。
日志入口
每表详细日志(Tunnel session ID、每 session 字节数、重试次数)在作业详情页可查。提工单时附上作业 ID 与表名。