データ基盤の運用において、データウェアハウスのデータを外部のストレージにバックアップすることは重要な業務の一つです。
- オペミスでデータを削除してしまった時に復旧する※
- 利用頻度の低いデータを外部ストレージに退避させコスト削減する
- 他のデータウェアハウスにデータを移行する
今回、Google Cloud(GCP) のBigQueryから Google Cloud Storage(以下 GCS) にデータをバックアップする方法を紹介します。
- roles/bigquery.jobUser
- roles/bigquery.dataViewer
- roles/storage.admin
terraformでroleを管理している場合は、google_project_iam_member
のリソースに適宜、権限を追加してください。
以下のコマンドを実行すると、BigQueryからGCSにデータがエクスポートされます。
destination_format: parquet形式がおすすめです。csv形式ですと、ArrayなどのNest形式の変換ができず失敗することがあります。例えば、Google Analytics(GA4)のデータをBigQueryにエクスポートしている際は、ネストされているデータが含まれます。
GCSのファイル名には、アスタリスクを含めることもおすすめです。1ファイルあたりの上限が1GBですが、アスタリスクをつけると適宜分割されます。サフィックスに 000000000000
のから始まる連番が振り分けられます。
--destination_format PARQUET \
${project}:${dataset}.${table} \
gs://${bucket}/${filename_prefix}-*.parquet
また、BigQueryテーブルのスキーマ情報もダンプしておくこともおすすめです。
# bq show
${project}:${dataset}.${table} | jq '.schema.fields' > schema.json
# gcloud storage mv ./schema.json gs://${bucket}/
バックアップ時の権限に加え、BigQueryにデータを書く必要があるので、
- roles/bigquery.dataEditor
の権限が必要になります。(roles/bigquery.dataEditorを付与した場合、roles/bigquery.dataViewerは無くして問題なです)
以下のコマンドを実行すると、GCSにバックアップしたデータをBigQueryにリストアできます。
bq loadする際に、スキーマ情報が必要になるので、先ほどダンプしたschema.jsonを使います。
# gcloud storage cp gs://${bucket}/schema.json .
# bq
${dataset}.${table} \
gs://${bucket}/${filename_prefix}-*.parquet
./schema.json
今回は、コンソール上で、手軽にBigQueryデータをバックアップ/リストアする方法をまとめました。
BigQueryやGCSの操作は、Pythonクライアントを利用しても簡単に行えます。Cloud Schedulerなどを組み合わせてhttp経由でCloud Run / Cloud Functionsを実行しバックアップを定期実行するなども有用です。