BigQuery のテーブル スナップショットで、スピーディで簡単かつ経済的なデータのバックアップが可能に
Google Cloud Japan Team
※この投稿は米国時間 2021 年 10 月 30 日に、Google Cloud blog に投稿されたものの抄訳です。
人間にミスはつきものです。車の施錠を忘れたり、プライベートなメールに誤って「全員に返信」を押してしまった経験をされたことはありませんか?しかし、エンタープライズ データ ウェアハウスでは、誤ってデータを削除、変更といったミスを犯すと、ビジネスに大きな影響を及ぼしかねません。
BigQuery のタイムトラベルは、すべてのデータセットで自動的に有効になり、過去 7 日以内であれば、どの時点のテーブルの状態にもすばやくアクセスできます。しかし、この機能を使ってテーブルを復元するには、「最後の既知の正常な」時間の記録をつけておく必要があり、注意が必要です。また、監査や法規制のコンプライアンス要件に対応するため、7 日間を超えてデータの状態を維持したい場合もあるかもしれません。そこで、新機能 BigQuery テーブル スナップショットの出番です。
テーブル スナップショットは、BigQuery API、SQL、コマンドライン インターフェース、または Google Cloud Console で利用できます。Cloud Console での簡単な例を見てみましょう。
まず、スナップショット機能を試すために、新しいデータセットとテーブルを作成します。
次に、新しく作成したテーブルの [プロパティ] ページを [エクスプローラ] ペインで選択して開きます。スナップショットのソーステーブルをベーステーブルと呼びます。
SQL や BigQuery コマンドライン ツールを使用してスナップショットを作成することもできますが、この例では Cloud Console のツールバーにある [スナップショット] ボタンを使用してinventory テーブルのスナップショットを作成します。
BigQuery では、既存の bigquery.tables.get と bigquery.tables.getData の権限に加えて、ベーステーブルに必要な新しい IAM 権限(bigquery.tables.createSnapshot)が導入されました。この新しい権限は、bigQuery.dataViewer と bigQuery.dataEditor ロールに追加され、お客様が作成したカスタムロールにも追加する必要があります。
テーブル スナップショットは、データやスキーマの変更はできません。それ以外は通常のテーブルと同じように処理できます。ベーステーブルと同じデータセットにスナップショットを作成する場合は、一意の名前を付けるか、テーブル名の末尾にタイムスタンプを付加した推奨された名前を使用する必要があります。
元のテーブル名をスナップショット名として使用する場合は、名前の競合を避けるために新しいデータセットにスナップショットを作成する必要があります。たとえば、新しいデータセットを作成して、ソース データセットからすべてのテーブルのスナップショットを作成し、元の名前を維持するスクリプトを記述できます。なお、別のデータセットにスナップショットを作成した場合、スナップショットはソースではなくコピー先データセットのセキュリティ構成を継承する点にご留意ください。
オプションで、[有効期限] フィールドに値を入力すると、BigQuery では指定した時点で自動的にスナップショットが削除されます。また、オプションで [スナップショット時間] フィールドに値を指定して、タイムトラベル期間内のベーステーブルの履歴バージョンからスナップショットを作成することもできます。つまり、3 時間前のベーステーブルの状態からスナップショットを作成できます。
この例では、inventory-snapshot という名前を使います。[保存] をクリックしてから数秒後、スナップショットが作成されます。[エクスプローラ] ペインのテーブルのリストに、別のアイコンが表示されます。
この操作を SQL で記述すると以下のようになります。
では、Cloud Console で新しいテーブル スナップショットの [プロパティ] ページを見てみましょう。
一般的なスナップショット テーブルの情報に加えて、スナップショットの作成に使用したベーステーブルの情報や、スナップショットが作成された日時が確認できます。これは、ベーステーブルが削除された場合も変わりません。スナップショットのサイズはテーブル全体のサイズを表示します。ただしスナップショットで維持されているデータと現在ベーステーブルで維持されているデータのサイズの差に対してのみ課金が発生します(BigQuery の標準的な価格を使用)。ベーステーブルにデータの削除や変更がない場合は、スナップショットの追加料金は発生しません。
スナップショットは読み取り専用なので、スナップショットのテーブルデータを DML で変更または、スナップショットのスキーマを DDL を使用して変更しようとすると、エラーが発生します。ただし、説明文、有効期限、ラベルなどのスナップショットのプロパティを変更することは可能です。また、テーブルのアクセス制御を使用して、他のテーブルと同様に、スナップショットにアクセスできるユーザーを変更できます。
誤ってベーステーブルからデータを削除してしまったとします。SQL ワークスペースで以下のコマンドを実行することで、このケースをシミュレーションできます。
これを見ると、ベーステーブルには 6 行しかありませんが、スナップショットの行数とサイズは変わっていないことがわかります。削除されたデータにアクセスする必要がある場合は、スナップショットに直接クエリを実行します。例えば、以下のクエリでは、スナップショットにまだ 7 行あることを示しています。
しかし、スナップショットのデータをアップデートしたい場合は、書き込み可能なテーブルに復元する必要があります。そのためには、Cloud Console の [復元] ボタンをクリックします。
デフォルトの設定では、スナップショットは新しいテーブルに復元されます。そこで、既存のテーブルに復元する場合は、既存のテーブル名を使用し、[テーブルが存在する場合は上書きする] チェックボックスをオンにします。
この操作は、BigQuery API、SQL、CLI でも行えます。そして、SQL の記述は以下のようになります。
このブログでは、Google Cloud Console と新しいテーブル スナップショット機能を使って、BigQuery テーブルのバックアップを簡単に作成する方法を紹介してきました。また、スケジュール設定された BigQuery のクエリ機能を使用して、テーブルのスナップショットを定期的(日単位、月単位など)に作成することもできます。テーブル スナップショットの詳細については、BigQuery ドキュメントをご覧ください。
- BigQuery グループ プロダクト マネージャー Brian Welcker