如何编写自动化Shell脚本通过Transfer Service命令复制BigQuery数据集
BigQuery 数据集批量复制Shell脚本实现方案
前置依赖
- 已完成
bq命令行工具的安装与谷歌云身份初始化 - 当前账号持有源项目的数据集读取权限、目标项目的数据集创建及数据写入权限
实现逻辑
针对数千个数据集的批量复制场景,脚本会先拉取源项目下所有数据集列表,再遍历每个数据集调用BigQuery原生Transfer服务创建复制任务,无需逐表操作,避免数据遗漏。
完整可执行脚本
#!/bin/bash # 自定义配置项,执行前请替换为实际值 SOURCE_PROJECT="your-source-project-id" TARGET_PROJECT="your-target-project-id" REGION="your-dataset-region" # 示例值:US、asia-east1、eu # 可选配置:仅复制匹配指定前缀的数据集,不需要可注释 # DATASET_FILTER_PREFIX="prod_" # 错误日志输出路径 ERROR_LOG="./bq_dataset_copy_error.log" # 拉取源数据集列表 echo "正在拉取源项目 ${SOURCE_PROJECT} 下的数据集列表..." if [ -z "${DATASET_FILTER_PREFIX}" ]; then DATASET_LIST=$(bq ls --datasets --project_id "${SOURCE_PROJECT}" | tail -n +3 | awk '{print $1}') else DATASET_LIST=$(bq ls --datasets --project_id "${SOURCE_PROJECT}" | grep "^${DATASET_FILTER_PREFIX}" | tail -n +3 | awk '{print $1}') fi TOTAL_NUM=$(echo "${DATASET_LIST}" | wc -l) echo "共检索到 ${TOTAL_NUM} 个待复制数据集" # 遍历创建复制任务 CURRENT_INDEX=1 for DATASET_ID in ${DATASET_LIST}; do echo -e "处理进度:${CURRENT_INDEX}/${TOTAL_NUM},当前数据集:${DATASET_ID}" # 调用Transfer服务创建数据集复制任务 bq mk --transfer_config \ --project_id "${TARGET_PROJECT}" \ --data_source cross_region_copy \ --target_dataset "${DATASET_ID}" \ --display_name "copy_${SOURCE_PROJECT}_${DATASET_ID}_to_${TARGET_PROJECT}" \ --params "{\"source_dataset_id\":\"${DATASET_ID}\",\"source_project_id\":\"${SOURCE_PROJECT}\",\"overwrite_destination_table\":true}" \ --location "${REGION}" \ --no_ask_permission 2>> "${ERROR_LOG}" if [ $? -eq 0 ]; then echo "数据集 ${DATASET_ID} 复制任务创建成功" else echo "数据集 ${DATASET_ID} 复制任务创建失败,错误信息已写入 ${ERROR_LOG}" fi CURRENT_INDEX=$((CURRENT_INDEX + 1)) done echo "所有数据集复制任务已处理完成"
使用说明
- 执行前先给脚本添加执行权限:
chmod +x bq_copy_datasets.sh - 若不需要覆盖目标端已存在的同名表,可将params中的
overwrite_destination_table参数值改为false - 任务创建后会在后台自动异步执行,可在BigQuery控制台「数据传输」板块查看每个任务的执行状态和进度
- 跨区域复制场景无需额外修改逻辑,仅需将
REGION参数改为目标数据集所在的区域即可
内容的提问来源于stack exchange,提问作者Bharathram
相关产品推荐
相关产品推荐

