削除されたBigQueryデータセットを復元する方法

記事タイトルとURLをコピーする

G-gen の西島です。当記事では、Google Cloud(旧称 GCP)が提供するデータ ウェアハウスである BigQuery で、誤って削除したデータセットを復元する方法をご紹介します。

BigQuery データセットの復元方法

削除された BigQuery データセットの復元方法には、以下の2種類があります。

  1. タイムトラベルの利用(テーブルを1つずつリストア)
  2. UNDROP SCHEMA の利用(データセットを丸ごとリストア)

後者の「UNDROP SCHEMA の利用」は、2024年7月時点では、プレビュー版の機能である点にご注意ください。

タイムトラベルの利用(テーブルを1つずつリストア)

概要

こちらの手法では、BigQuery のシステムビューである INFORMATION_SCHEMATABLE_STORAGE_TIMELINE ビューを確認することで復元対象のテーブルをリストアップしたあと、タイムトラベル機能を使って、テーブルを1つ1つ復元します。

タイムトラベル機能では、削除されたり変更されたデータにアクセスすることができます。デフォルトでは過去7日分のデータが保管されます。

必要な権限

こちらの手順を実施するには、以下の権限が必要です。

  • プロジェクトに対する bigquery.tables.get
  • プロジェクトに対する bigquery.tables.list
  • プロジェクトに対する bigquery.datasets.create

これらの権限は、以下の事前定義ロールに含まれています。これらのロールを、プロジェクトレベルで操作者の Google アカウント / グループに付与する必要があります。

  • BigQuery データ閲覧者(roles/bigquery.dataViewer
  • BigQuery データ編集者(roles/bigquery.dataEditor
  • BigQuery ジョブユーザー (roles/bigquery.jobUser

リストア対象のテーブルをリストアップ

はじめに、削除されたデータセットに含まれていたテーブルのリストアップを行います。

データセットを削除した場合、Cloud Audit Logs には google.cloud.bigquery.v2.DatasetService.DeleteDataset というメソッドのログにデータセット ID が記録されますが、そのデータセットに含まれていたテーブルの名称は記録されません

つまり、監査ログから削除されたテーブルの一覧を取得することはできません。そこで INFORMATION_SCHEMATABLE_STORAGE_TIMELINE ビューを確認します。このビューには過去のある時点のストレージ使用状況が記録されており、そこから間接的に、その時点で存在していたテーブルの名前を確認することができます。

削除されたデータセットのテーブル名を特定する SQL は、以下のとおりです。

SELECT DISTINCT
  project_id, table_schema AS dataset, table_name, deleted
FROM
  `region-asia-northeast1`.INFORMATION_SCHEMA.TABLE_STORAGE_TIMELINE
WHERE
  project_id = 'xxxxx'
  AND deleted = true
  AND timestamp >= '2024-03-21'
ORDER BY
  1, 2, 3, 4

FROM 句の region-asia-northeast1 の部分は、データセットの存在したリージョンを指定してください。US マルチリージョンであれば region-us、 東京リージョンであれば region-asia-northeast1 です。

WHERE 句の timestamp は、データセットを削除してしまった日付・時刻を含むよう、範囲を指定してください。

データセットを作成

削除されたデータセットと同じ名前、同じリージョンのデータセットを新規作成します。

データセットは、BigQuery コンソール画面や bq コマンドで作成できます。

テーブルのリストア

新規作成したデータセット内に、テーブルをリストアします。

テーブルをリストアする bq コマンドは、以下のとおりです。

# UNIX タイムスタンプ(ミリ秒単位)の取得
date -d '2024-06-27 17:00:00' +%s000
  
# テーブルの復元
bq cp dataset.table1@1719471634000 dataset.table1

上記の date コマンドは、人間にわかりやすい日付・時刻の文字列を、UNIX タイムスタンプ形式で表示するものです。

その次の bq コマンドは、UNIX タイムスタンプ で 1719471634000(2024-06-27 10:00:00 UTC+0900)の時点の dataset.table1 という BigQuery テーブルを復元するものです。

コマンドライン上の Unix タイムスタンプとテーブル名は、ご自身の環境にあわせて変更してください。

UNDROP SCHEMA の利用(データセットを丸ごとリストア)

概要

こちらの手法は、データセットをまるごと復元する方法です。ただし、復元できるのはタイムトラベル期間内に削除されたデータセットのみです。

また、後述のドキュメント「データセットの削除取り消しに関する制限事項」を読み、注意点について確認してください。

当機能は、2024年7月時点でプレビュー版であることから、サポート対象外であるほか、本番環境での利用は推奨されていません。

必要な権限

こちらの手順を実施するには、以下の権限が必要です。

  • プロジェクトに対する bigquery.datasets.create
  • データセットに対する bigquery.datasets.get

これらの権限は、以下の事前定義ロールに含まれています。以下のロールを、プロジェクトレベルで操作者の Google アカウント / グループに付与することで、当作業を行うことができるようになります。

  • BigQuery ユーザー(roles/bigquery.user

SQL でのリストア

BigQuery コンソール等で以下の SQL を実行することで、データセットを中身のテーブルごとリストアできます。

# DATASET_ID は、削除を取り消すデータセットに置き換える
UNDROP SCHEMA `DATASET_ID`;

DATASET_ID は、ご自身の環境にあわせて変更してください。

API でのリストア

BigQuery API の datasets.undelete メソッドを使用します。以下は、cURL コマンドで API を直接呼び出す例です。

curl -X POST \
   -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://bigquery.googleapis.com/bigquery/v2/projects/{projectId}/datasets/{datasetId}:undelete

コマンドライン上の {projectId}{datasetId} はご自身の環境にあわせて変更してください。

バックアップによる対策

本記事では、 誤って削除したデータセットに含まれるテーブル復元方法を紹介しましたが、紹介したどちらの方法でも、タイムトラベル期間内でしか復元することができません。設定可能な最長のタイムトラベル期間は7日間です。

7日間以上の RPO が求められる場合、BigQueryのスナップショット機能や Cloud Storage へのエクスポート、BigQuery Data Transfer Service 等によるバックアップの実施を検討することも必要です。

スナップショット機能については、以下の記事もご参照ください。

blog.g-gen.co.jp

西島 昌太(記事一覧)

カスタマーサクセス課 データエンジニア
2023年4月に新卒入社。

元はフロントエンド開発を主戦場に、現在はデータエンジニアリングを勉強中。何でも屋さんを目指して、日々邁進。 休日は大体プログラムを書いてる人