G-gen の西島です。当記事では、Google Cloud(旧称 GCP)が提供するデータ ウェアハウスである BigQuery で、誤って削除したデータセットを復元する方法をご紹介します。
BigQuery データセットの復元方法
削除された BigQuery データセットの復元方法には、以下の2種類があります。
- タイムトラベルの利用(テーブルを1つずつリストア)
- UNDROP SCHEMA の利用(データセットを丸ごとリストア)
後者の「UNDROP SCHEMA の利用」は、2024年7月時点では、プレビュー版の機能である点にご注意ください。
タイムトラベルの利用(テーブルを1つずつリストア)
概要
こちらの手法では、BigQuery のシステムビューである INFORMATION_SCHEMA
の TABLE_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_SCHEMA
の TABLE_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 等によるバックアップの実施を検討することも必要です。
スナップショット機能については、以下の記事もご参照ください。
西島 昌太(記事一覧)
カスタマーサクセス課 データエンジニア
2023年4月に新卒入社。
元はフロントエンド開発を主戦場に、現在はデータエンジニアリングを勉強中。何でも屋さんを目指して、日々邁進。 休日は大体プログラムを書いてる人