部署可伸缩的 BigQuery 备份自动化功能

本文档介绍了如何部署可扩缩的 BigQuery 备份自动化

本文档面向希望在组织中定义和自动化数据政策的云架构师、工程师和数据治理官。拥有 Terraform 经验会很有帮助。

架构

下图展示了自动备份架构:

自动备份解决方案的架构。

Cloud Scheduler 会触发运行。调度程序服务使用 BigQuery API 列出范围内的表。调度器服务通过 Pub/Sub 消息为每个表向配置器服务提交一个请求。配置器服务确定表的备份政策,然后为每个表向相关的 Cloud Run 服务提交一个请求。然后,Cloud Run 服务向 BigQuery API 提交请求并运行备份操作。Pub/Sub 会触发标记器服务,该服务会记录结果并更新 Cloud Storage 元数据层中的备份状态。

如需详细了解此架构,请参阅可扩缩的 BigQuery 备份自动化

目标

  • 构建 Cloud Run 服务。
  • 配置 Terraform 变量。
  • 运行 Terraform 和手动部署脚本。
  • 运行解决方案。

费用

在本文档中,您将使用 Google Cloud的以下收费组件:

如需根据您的预计使用量来估算费用,请使用价格计算器

新 Google Cloud 用户可能有资格申请免费试用

完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理

准备工作

如果您要重新部署解决方案,可以跳过此部分(例如,在提交新内容后)。

在本部分中,您将创建一次性资源。

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

  2. 如果您想创建一个新的 Google Cloud 项目用作部署的宿主项目,请使用 gcloud projects create 命令:

       gcloud projects create PROJECT_ID
    

    PROJECT_ID 替换为要创建的项目 ID。

  3. 安装 Maven:

    1. 下载 Maven
    2. 在 Cloud Shell 中,将 Maven 添加到 PATH

      export PATH=/DOWNLOADED_MAVEN_DIR/bin:$PATH
      
  4. 在 Cloud Shell 中,克隆 GitHub 代码库:

    git clone https://github.com/GoogleCloudPlatform/bq-backup-manager.git
    
  5. 设置并导出以下环境变量:

    export PROJECT_ID=PROJECT_ID
    export TF_SA=bq-backup-mgr-terraform
    export COMPUTE_REGION=COMPUTE_REGION
    export DATA_REGION=DATA_REGION
    export BUCKET_NAME=${PROJECT_ID}-bq-backup-mgr
    export BUCKET=gs://${BUCKET_NAME}
    export DOCKER_REPO_NAME=docker-repo
    export CONFIG=bq-backup-manager
    export ACCOUNT=ACCOUNT_EMAIL
    
    gcloud config configurations create $CONFIG
    gcloud config set project $PROJECT_ID
    gcloud config set account $ACCOUNT
    gcloud config set compute/region $COMPUTE_REGION
    
    gcloud auth login
    gcloud auth application-default login
    

    替换以下内容:

    • PROJECT_ID:您要将解决方案部署到的 Google Cloud 宿主项目的 ID。
    • COMPUTE_REGION:您要在其中部署计算资源(例如 Cloud Run 和 Identity and Access Management [IAM])的 Google Cloud 区域
    • DATA_REGION:您要将数据资源(例如存储桶和数据集)部署到的 Google Cloud 区域。
    • ACCOUNT_EMAIL:用户账号邮箱。
  6. 启用 API:

    ./scripts/enable_gcp_apis.sh
    

    该脚本会启用以下 API:

    • Cloud Resource Manager API
    • IAM API
    • Data Catalog API
    • Artifact Registry API
    • BigQuery API
    • Pub/Sub API
    • Cloud Storage API
    • Cloud Run Admin API
    • Cloud Build API
    • Service Usage API
    • App Engine Admin API
    • Serverless VPC Access API
    • Cloud DNS API
  7. 准备 Terraform 状态存储桶:

    gcloud storage buckets create $BUCKET --project=$PROJECT_ID --location=$COMPUTE_REGION --uniform-bucket-level-access
    
  8. 准备 Terraform 服务账号:

    ./scripts/prepare_terraform_service_account.sh
    
  9. 如需发布此解决方案使用的映像,请准备一个 Docker 代码库:

    gcloud artifacts repositories create $DOCKER_REPO_NAME
      --repository-format=docker \
      --location=$COMPUTE_REGION \
      --description="Docker repository for backups"
    
  10. 部署基础架构

    确保您已至少完成一次准备工作

    在本部分中,请按照相应步骤将最新代码库部署或重新部署到 Google Cloud 环境。

    激活 gcloud CLI 配置

    • 在 Cloud Shell 中,激活 gcloud CLI 配置并对其进行身份验证:

      gcloud config configurations activate $CONFIG
      
      gcloud auth login
      gcloud auth application-default login
      

    构建 Cloud Run 服务映像

    • 在 Cloud Shell 中,构建并部署将由 Cloud Run 服务使用的 Docker 映像:

      export DISPATCHER_IMAGE=${COMPUTE_REGION}-docker.pkg.dev/${PROJECT_ID}/${DOCKER_REPO_NAME}/bqsm-dispatcher-service:latest
      export CONFIGURATOR_IMAGE=${COMPUTE_REGION}-docker.pkg.dev/${PROJECT_ID}/${DOCKER_REPO_NAME}/bqsm-configurator-service:latest
      export SNAPSHOTER_BQ_IMAGE=${COMPUTE_REGION}-docker.pkg.dev/${PROJECT_ID}/${DOCKER_REPO_NAME}/bqsm-snapshoter-bq-service:latest
      export SNAPSHOTER_GCS_IMAGE=${COMPUTE_REGION}-docker.pkg.dev/${PROJECT_ID}/${DOCKER_REPO_NAME}/bqsm-snapshoter-gcs-service:latest
      export TAGGER_IMAGE=${COMPUTE_REGION}-docker.pkg.dev/${PROJECT_ID}/${DOCKER_REPO_NAME}/bqsm-tagger-service:latest
      
      ./scripts/deploy_services.sh
      

    配置 Terraform 变量

    此部署使用 Terraform 进行配置,并使用部署脚本。

    1. 在 Cloud Shell 中,创建一个新的 Terraform TFVARS 文件,您可以在其中替换本部分中的变量:

      export VARS=FILENAME
      .tfvars
      

      FILENAME 替换为您创建的变量文件的名称(例如 my-variables)。您可以将 example-variables 文件用作参考。

    2. 在 TFVARS 文件中,配置项目变量:

      project = "PROJECT_ID"
      compute_region = "COMPUTE_REGION"
      data_region = "DATA_REGION"
      

      您可以使用 variables.tf 文件中定义的默认值,也可以更改这些值。

    3. 配置您之前在准备工作中创建并准备好的 Terraform 服务账号:

      terraform_service_account =
      "bq-backup-mgr-terraform@PROJECT_ID.iam.gserviceaccount.com"
      

      请务必使用您创建的账号的完整邮箱。

    4. 将 Cloud Run 服务配置为使用您之前构建和部署的容器映像:

      dispatcher_service_image     = "${COMPUTE_REGION}-docker.pkg.dev/${PROJECT_ID}/${DOCKER_REPO_NAME}/bqsm-dispatcher-service:latest"
      configurator_service_image   = "${COMPUTE_REGION}-docker.pkg.dev/${PROJECT_ID}/${DOCKER_REPO_NAME}/bqsm-configurator-service:latest"
      snapshoter_bq_service_image  = "${COMPUTE_REGION}-docker.pkg.dev/${PROJECT_ID}/${DOCKER_REPO_NAME}/bqsm-snapshoter-bq-service:latest"
      snapshoter_gcs_service_image = "${COMPUTE_REGION}-docker.pkg.dev/${PROJECT_ID}/${DOCKER_REPO_NAME}/bqsm-snapshoter-gcs-service:latest"
      tagger_service_image         = "${COMPUTE_REGION}-docker.pkg.dev/${PROJECT_ID}/${DOCKER_REPO_NAME}/bqsm-tagger-service:latest"
      

      此脚本会指示 Terraform 在 Terraform 稍后创建的 Cloud Run 服务中使用这些已发布的映像。

      Terraform 仅将 Cloud Run 服务与现有映像相关联。它不会根据代码库构建映像,因为该操作已在上一步中完成。

    5. schedulers 变量中,定义至少一个调度程序。调度器会根据表级备份 cron 时间表定期列出和检查表是否需要备份。

      {
      name    = "SCHEDULER_NAME"
      cron    = "SCHEDULER_CRON"
      payload = {
          is_force_run = FORCE_RUN
          is_dry_run   = DRY_RUN
      
          folders_include_list  = [FOLDERS_INCLUDED]
          projects_include_list = [PROJECTS_INCLUDED]
          projects_exclude_list = [PROJECTS_EXCLUDED]
          datasets_include_list =  [DATASETS_INCLUDED]
          datasets_exclude_list =  [DATASETS_EXCLUDED]
          tables_include_list   =  [TABLES_INCLUDED]
          tables_exclude_list   =  [TABLES_EXCLUDED]
          }
      }
      

      替换以下内容:

      • SCHEDULER_NAME:Cloud Scheduler 的显示名称。
      • SCHEDULER_CRON:调度器根据范围内的各个表的备份时间表,检查这些表是否需要备份的频率。可以是任何与 unix-cron 兼容的字符串。例如,0 * * * * 表示每小时频率。
      • FORCE_RUN:布尔值。如果您希望调度器使用这些表的 cron 时间表,请将该值设置为 false。如果设置为 true,则会备份所有范围内的表,无论其 cron 设置如何。
      • DRY_RUN:布尔值。如果设置为 true,则不会执行实际的备份操作。仅生成日志消息。如果您想测试和调试解决方案,而又不想产生备份费用,请使用 true
      • FOLDERS_INCLUDED:包含 BigQuery 数据的文件夹的数字 ID 列表(例如 1234, 456)。设置后,解决方案会备份指定文件夹中的表,并忽略 projects_include_listdatasets_include_listtables_include_list 字段设置。
      • PROJECTS_INCLUDED:项目名称的列表(例如 "project1", "project2")。设置后,该解决方案会备份指定项目中的表,并忽略 datasets_include_listtables_include_list 字段设置。如果您设置了 folders_include_list 字段,则系统会忽略此设置。
      • PROJECTS_EXCLUDED:项目名称或正则表达式的列表(例如 "project1", "regex:^test_")。设置后,该解决方案不会备份指定项目中的表。您可以将此设置与 folders_include_list 字段结合使用。
      • DATASETS_INCLUDED:数据集列表(例如 "project1.dataset1", "project1.dataset2")。设置后,该解决方案会备份指定数据集中的表,并忽略 tables_include_list 字段设置。如果您设置了 folders_include_listprojects_include_list 字段,则系统会忽略此设置。
      • DATASETS_EXCLUDED:数据集或正则表达式列表(例如 "project1.dataset1", "regex:.*\\_landing$")。设置后,该解决方案不会备份指定数据集中的表。您可以将此设置与 folders_include_listprojects_include_list 字段结合使用。
      • TABLES_INCLUDED:表列表(例如 "project1.dataset1.table 1", "project1.dataset2.table2")。设置后,该解决方案会备份指定的表。如果您设置了 folders_include_listprojects_include_listdatasets_include_list 字段,则系统会忽略此设置。
      • TABLES_EXCLUDED:表或正则表达式的列表(例如 "project1.dataset1.table 1", "regex:.*\_test")。设置后,该解决方案不会备份指定的表。您可以将此设置与 folders_include_listprojects_include_listdatasets_include_list 字段结合使用。

      所有排除列表都接受 regex:REGULAR_EXPRESSION 形式的正则表达式。

      如果完全限定的条目名称(例如 "project.dataset.table")与提供的任何正则表达式匹配,则该条目将从备份范围中排除。

      以下是一些常见使用场景:

      • 排除所有以 _landing 结尾的数据集名称:datasets_exclude_list = ["regex:.*\\_landing$"]
      • 排除所有以 _test_tst_bkp_copy 结尾的表: tables_exclude_list = ["regex:.*\_(test|tst|bkp|copy)"]

    定义后备政策

    每次运行时,解决方案都需要确定每个范围内表的备份政策。如需详细了解政策类型,请参阅备份政策。本部分介绍如何定义后备政策。

    后备政策是使用一个 default_policy 变量和一组针对不同级别(文件夹、项目、数据集和表)的异常或替换项定义的。这种方法可提供精细的灵活性,而无需为每个表创建条目。

    根据您决定使用的备份方法(BigQuery 快照、导出到 Cloud Storage 或两者兼而有之),还有其他组政策字段。

    1. 在 TFVARS 文件中,为 default_policy 变量设置默认政策的以下常见字段:

      fallback_policy = {
        "default_policy" : {
          "backup_cron" : "BACKUP_CRON"
          "backup_method" : "BACKUP_METHOD",
          "backup_time_travel_offset_days" : "OFFSET_DAYS",
          "backup_storage_project" : "BACKUP_STORAGE_PROJECT",
          "backup_operation_project" : "BACKUP_OPERATIONS_PROJECT",
      
      

      替换以下内容:

      • BACKUP_CRON:一个 cron 表达式,用于设置表的备份频率(例如,如果每 6 小时备份一次,请指定 0 0 */6 * * *)。此表达式必须是与 Spring-Framework 兼容的 cron 表达式。
      • BACKUP_METHOD:方法,您可以将其指定为 BigQuery SnapshotGCS Snapshot(以使用“导出到 Cloud Storage”方法)或 Both。您需要为所选的每种备份方法提供必填字段,如下所示。
      • OFFSET_DAYS:用于确定备份表的时间点的过去天数。值可以是 0 到 7 之间的数字。
      • BACKUP_STORAGE_PROJECT:存储所有快照和导出操作的项目的 ID。这是 bq_snapshot_storage_datasetgcs_snapshot_storage_location 所在的同一项目。小型部署可以使用宿主项目,但大规模部署应使用单独的项目。
      • BACKUP_OPERATIONS_PROJECT:可选设置,您可以在其中指定所有快照和导出操作运行的项目的 ID。此项目适用快照和导出作业配额和限制。这可以是与 backup_storage_project 相同的值。如果未设置,解决方案会使用来源表的项目。
    2. 如果您指定 BigQuery SnapshotBoth 作为 backup_method,请在 default_policy 变量中的通用字段之后添加以下字段:

        "bq_snapshot_expiration_days" : "SNAPSHOT_EXPIRATION",
        "bq_snapshot_storage_dataset" : "DATASET_NAME",
      

      替换以下内容:

      • SNAPSHOT_EXPIRATION:每个快照的保留天数(例如 15)。
      • DATASET_NAME:用于存储快照的数据集的名称(例如 backups)。该数据集必须已存在于为 backup_storage_project 指定的项目中。
    3. 如果您指定 GCS Snapshot(以使用“导出到 Cloud Storage”方法)或 Both 作为 backup_method,请将以下字段添加到 default_policy 变量:

        "gcs_snapshot_storage_location" : "STORAGE_BUCKET",
        "gcs_snapshot_format" : "FILE_FORMAT",
        "gcs_avro_use_logical_types" : AVRO_TYPE,
        "gcs_csv_delimiter" : "CSV_DELIMITER",
        "gcs_csv_export_header" : CSV_EXPORT_HEADER
      

      替换以下内容:

      • STORAGE_BUCKET:用于存储导出数据的 Cloud Storage 存储桶,格式为 gs://bucket/path/。例如 gs://bucket1/backups/
      • FILE_FORMAT:用于将 BigQuery 表导出到 Cloud Storage 的文件格式和压缩方式。可用的值包括 CSVCSV_GZIPJSONJSON_GZIPAVROAVRO_DEFLATEAVRO_SNAPPYPARQUETPARQUET_SNAPPYPARQUET_GZIP
      • AVRO_TYPE:布尔值。如果设置为 false,则会将 BigQuery 类型导出为字符串。如果设置为 true,则会将这些类型导出为相应的 Avro 逻辑类型。如果 gcs_snapshot_format 是任何 Avro 类型格式,则此字段为必填字段。
      • CSV_DELIMITER:导出的 CSV 文件使用的分隔符,值可以是任何 ISO-8859-1 单字节字符。您可以使用 \ttab 指定制表符分隔符。当 gcs_snapshot_format 为任何 CSV 类型格式时,此字段为必填字段。
      • CSV_EXPORT_HEADER:布尔值。如果设置为 true,则列标题会导出到 CSV 文件。当 gcs_snapshot_format 为任何 CSV 类型格式时,此字段为必填字段。

      如需了解详情和 Avro 类型映射,请参阅下表:

      BigQuery 类型 Avro 逻辑类型
      TIMESTAMP timestamp-micros(注释 Avro LONG
      DATE date(注释 Avro INT
      TIME timestamp-micro(注释 Avro LONG
      DATETIME STRING(自定义命名的逻辑类型 datetime
    4. 为特定文件夹、项目、数据集和表添加替换变量:

        },
        "folder_overrides" : {
         "FOLDER_NUMBER" : {
         },
        },
      
        "project_overrides" : {
         "PROJECT_NAME" : {
         }
        },
      
        "dataset_overrides" : {
         "PROJECT_NAME.DATASET_NAME" : {
         }
        },
      
        "table_overrides" : {
         "PROJECT_NAME.DATASET_NAME.TABLE_NAME" : {
         }
        }
      }
      

      替换以下内容:

      • FOLDER_NUMBER:指定要为其设置替换字段的文件夹。
      • PROJECT_NAME:为特定项目、数据集或表设置替换字段时,指定项目。
      • DATASET_NAME:为特定数据集或表设置替换字段时,指定数据集。
      • TABLE_NAME:指定要为其设置替换字段的表。

      对于每个替换条目,例如 project_overrides 变量中的特定项目,请为您之前在 default_policy 中指定的备份方法添加常用字段和必填字段。

      如果您不想为特定级别设置替换项,请将相应变量设置为空映射(例如 project_overrides : {})。

      在以下示例中,为使用 BigQuery 快照方法的特定表设置了替换字段:

        },
        "project_overrides" : {},
      
        "table_overrides" : {
         "example_project1.dataset1.table1" : {
          "backup_cron" : "0 0 */5 * * *", # every 5 hours each day
          "backup_method" : "BigQuery Snapshot",
          "backup_time_travel_offset_days" : "7",
          "backup_storage_project" : "project name",
          "backup_operation_project" : "project name",
          # bq settings
          "bq_snapshot_expiration_days" : "14",
          "bq_snapshot_storage_dataset" : "backups2"
          },
         }
      }
      

    如需查看后备政策的完整示例,请参阅 example-variables 文件

    配置其他备份操作项目

    • 如果您想指定其他备份项目,例如在外部配置(表级备份政策)或表来源项目中定义的项目,请配置以下变量:

      additional_backup_operation_projects = [ADDITIONAL_BACKUPS]
      

      ADDITIONAL_BACKUPS 替换为项目名称的逗号分隔列表(例如 "project1", "project2")。如果您仅使用后备备份政策,而没有使用表级外部政策,则可以将该值设置为空列表。

      如果您未添加此字段,则在可选的 backup_operation_project 字段中指定的任何项目都会自动作为备份项目包含在内。

    配置 Terraform 服务账号权限

    在前面的步骤中,您配置了备份操作在其中运行的备份项目。Terraform 需要将资源部署到这些备份项目。

    Terraform 使用的服务账号必须具有这些指定备份项目所需的权限。

    • 在 Cloud Shell 中,向服务账号授予运行备份操作的所有项目的权限:

      ./scripts/prepare_backup_operation_projects_for_terraform.sh BACKUP_OPERATIONS_PROJECT DATA_PROJECTS ADDITIONAL_BACKUPS
      

      替换以下内容:

      • BACKUP_OPERATIONS_PROJECT:在任何后备政策和表级政策的 backup_operation_project 字段中定义的任何项目。
      • DATA_PROJECTS:如果后备或表级政策中未定义 backup_operation_project 字段,请添加这些来源表的项目。
      • ADDITIONAL_BACKUPS:在 additional_backup_operation_projects Terraform 变量中定义的任何项目。

    运行部署脚本

    1. 在 Cloud Shell 中,运行 Terraform 部署脚本:

      cd terraform
      
      terraform init \
          -backend-config="bucket=${BUCKET_NAME}" \
          -backend-config="prefix=terraform-state" \
          -backend-config="impersonate_service_account=$TF_SA@$PROJECT_ID.iam.gserviceaccount.com"
      
      terraform plan -var-file=$VARS
      
      terraform apply -var-file=$VARS
      
    2. 为 Firestore 添加存留时间 (TTL) 政策:

      
      gcloud firestore fields ttls update expires_at \
          --collection-group=project_folder_cache \
          --enable-ttl \
          --async \
          --project=$PROJECT_ID
      

      在某些情况下,该解决方案使用 Datastore 作为缓存。为了节省费用并提高查找性能,TTL 政策允许 Firestore 自动删除已过期的条目。

    设置对来源和目标的访问权限

    1. 在 Cloud Shell 中,为解决方案使用的服务账号设置以下变量:

      export SA_DISPATCHER_EMAIL=dispatcher@${PROJECT_ID}.iam.gserviceaccount.com
      export SA_CONFIGURATOR_EMAIL=configurator@${PROJECT_ID}.iam.gserviceaccount.com
      export SA_SNAPSHOTER_BQ_EMAIL=snapshoter-bq@${PROJECT_ID}.iam.gserviceaccount.com
      export SA_SNAPSHOTER_GCS_EMAIL=snapshoter-gcs@${PROJECT_ID}.iam.gserviceaccount.com
      export SA_TAGGER_EMAIL=tagger@${PROJECT_ID}.iam.gserviceaccount.com
      

      如果您已在 Terraform 中更改默认名称,请更新服务账号邮箱。

    2. 如果您已设置 folders_include_list 字段,并且希望将 BigQuery 扫描的范围设置为包含特定文件夹,请在文件夹级层授予所需权限:

      ./scripts/prepare_data_folders.sh FOLDERS_INCLUDED
      
    3. 如需让应用能够在不同项目中执行必要的任务,请向每个项目授予所需的权限:

      ./scripts/prepare_data_projects.sh DATA_PROJECTS
      ./scripts/prepare_backup_storage_projects.sh BACKUP_STORAGE_PROJECT
      ./scripts/prepare_backup_operation_projects.sh BACKUP_OPERATIONS_PROJECT
      

      替换以下内容:

      • DATA_PROJECTS:包含要备份的来源表的数据项目(或来源项目),例如 project1 project2。包括以下项目:

        • Terraform 变量 schedulers 中的包含列表内指定的项目。
        • 如果您想备份宿主项目中的表,请添加宿主项目。
      • BACKUP_STORAGE_PROJECT:解决方案会在其中存储备份的备份存储项目(或目标项目),例如 project1 project2。您需要添加以下字段中指定的项目:

        • 所有后备政策中的 backup_storage_project 字段。
        • 所有表级政策中的 backup_storage_project 字段。

        包含在多个领域中使用的备份存储项目,或同时用作来源项目和目标项目的项目

      • BACKUP_OPERATIONS_PROJECT:解决方案在其中运行备份操作的数据操作项目,例如 project1 project2。您需要添加以下字段中指定的项目:

        • 所有后备政策中的 backup_operation_project 字段。
        • BigQuery 扫描范围内的所有纳入名单(如果您未设置 backup_operation_project 字段)。
        • 所有表级政策中的 backup_operation_project 字段。

        包含在多个领域中使用的备份操作项目,或同时用作来源项目和目标项目的项目

    4. 对于使用列级访问权限控制的表,请确定您的表使用的所有政策标记分类(如果有),并向解决方案的服务账号授予对表数据的访问权限:

      TAXONOMY="projects/TAXONOMY_PROJECT/locations/TAXONOMY_LOCATION/taxonomies/TAXONOMY_ID"
      
      gcloud data-catalog taxonomies add-iam-policy-binding \
      $TAXONOMY \
      --member="serviceAccount:${SA_SNAPSHOTER_BQ_EMAIL}" \
      --role='roles/datacatalog.categoryFineGrainedReader'
      
      gcloud data-catalog taxonomies add-iam-policy-binding \
      $TAXONOMY \
      --member="serviceAccount:${SA_SNAPSHOTER_GCS_EMAIL}" \
      --role='roles/datacatalog.categoryFineGrainedReader'
      

      替换以下内容:

      • TAXONOMY_PROJECT:政策标记分类中的项目 ID
      • TAXONOMY_LOCATION:政策标记分类中指定的位置
      • TAXONOMY_ID:政策标记分类的分类 ID
    5. 针对每个政策标记分类重复执行上一步骤。

    运行解决方案

    部署解决方案后,使用以下部分来运行和管理解决方案。

    设置表级备份政策

    • 在 Cloud Shell 中,使用所需字段创建一个表级政策,然后将该政策存储在政策的 Cloud Storage 存储桶中:

      # Use the default backup policies bucket unless overwritten in the .tfvars
      export POLICIES_BUCKET=${PROJECT_ID}-bq-backup-manager-policies
      
      # set target table info
      export TABLE_PROJECT='TABLE_PROJECT'
      export TABLE_DATASET='TABLE_DATASET'
      export TABLE='TABLE_NAME'
      
      # Config Source must be 'MANUAL' when assigned this way
      export BACKUP_POLICY="{
      'config_source' : 'MANUAL',
      'backup_cron' : 'BACKUP_CRON',
      'backup_method' : 'BACKUP_METHOD',
      'backup_time_travel_offset_days' : 'OFFSET_DAYS',
      'backup_storage_project' : 'BACKUP_STORAGE_PROJECT',
      'backup_operation_project' : 'BACKUP_OPERATION_PROJECT',
      'gcs_snapshot_storage_location' : 'STORAGE_BUCKET',
      'gcs_snapshot_format' : 'FILE_FORMAT',
      'gcs_avro_use_logical_types' : 'AVRO_TYPE',
      'bq_snapshot_storage_dataset' : 'DATASET_NAME',
      'bq_snapshot_expiration_days' : 'SNAPSHOT_EXPIRATION'
      }"
      
      # File name MUST BE backup_policy.json
      echo $BACKUP_POLICY >> backup_policy.json
      
      gcloud storage cp backup_policy.json gs://${POLICIES_BUCKET}/policy/project=${TABLE_PROJECT}/dataset=${TABLE_DATASET}/table=${TABLE}/backup_policy.json
      

      替换以下内容:

      • TABLE_PROJECT:表所在的项目
      • TABLE_DATASET:表格的数据集
      • TABLE_NAME:表的名称

    触发备份操作

    您之前配置的 Cloud Scheduler 作业会根据其 cron 表达式自动运行。

    您也可以在 Google Cloud 控制台中手动运行作业。如需了解详情,请参阅运行作业

    监控和报告

    选择宿主项目 (PROJECT_ID) 后,您可以在 BigQuery Studio 中运行以下查询以获取报告和信息。

    • 获取每次运行(包括正在进行的运行)的进度统计信息:

      SELECT * FROM `bq_backup_manager.v_run_summary_counts`
      
    • 获取单次运行的所有严重错误(不可重试的错误):

      SELECT * FROM `bq_backup_manager.v_errors_non_retryable`
      WHERE run_id = 'RUN_ID'
      

      RUN_ID 替换为运行的 ID。

    • 获取表的所有运行及其执行信息:

      SELECT * FROM `bq_backup_manager.v_errors_non_retryable`
      WHERE tablespec = 'project.dataset.table'
      

      您还可以指定 grouped 版本:

      SELECT * FROM `bq_backup_manager.v_audit_log_by_table_grouped`, UNNEST(runs) r
      WHERE r.run_has_retryable_error = FALSE
      
    • 如需进行调试,您可以获取每次服务调用的详细请求和响应信息:

      SELECT
      jsonPayload.unified_target_table AS tablespec,
      jsonPayload.unified_run_id AS run_id,
      jsonPayload.unified_tracking_id AS tracking_id,
      CAST(jsonPayload.unified_is_successful AS BOOL) AS configurator_is_successful,
      jsonPayload.unified_error AS configurator_error,
      CAST(jsonPayload.unified_is_retryable_error AS BOOL) AS configurator_is_retryable_error,
      CAST(JSON_VALUE(jsonPayload.unified_input_json, '$.isForceRun') AS BOOL) AS is_force_run,
      CAST(JSON_VALUE(jsonPayload.unified_output_json, '$.isBackupTime') AS BOOL) AS is_backup_time,
      JSON_VALUE(jsonPayload.unified_output_json, '$.backupPolicy.method') AS backup_method,
      CAST(JSON_VALUE(jsonPayload.unified_input_json, '$.isDryRun') AS BOOL) AS is_dry_run,
      jsonPayload.unified_input_json AS request_json,
      jsonPayload.unified_output_json AS response_json
      FROM `bq_backup_manager.run_googleapis_com_stdout`
      WHERE jsonPayload.global_app_log = 'UNIFIED_LOG'
      -- 1= dispatcher, 2= configurator, 3=bq snapshoter, -3=gcs snapshoter and 4=tagger
      AND jsonPayload.unified_component = "2"
      
    • 获取系统根据后备手动添加或分配的备份政策:

      SELECT * FROM `bq_backup_manager.ext_backup_policies`
      

    限制

    如需详细了解 backup_operation_project 字段中指定的每个项目的限制和配额,请参阅限制

    清理

    为避免因本部署中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留该项目但删除各个资源。

    删除项目

      Delete a Google Cloud project:

      gcloud projects delete PROJECT_ID

    删除新资源

    作为删除项目的替代方法,您还可以删除在此过程中创建的资源。

    • 在 Cloud Shell 中,删除 Terraform 资源:

      terraform destroy -var-file="${VARS}"
      

      该命令会删除几乎所有资源。检查以确保您要删除的所有资源都已移除。

    后续步骤

    贡献者

    作者:Karim Wadie | 云战略工程师

    其他贡献者: