GoogleBigQueryから誤って削除されたデータを復元する方法
公開: 2022-04-12Google BigQueryの重要なテーブル、ビュー、またはデータセット全体を誤って削除したことがありますか? 持っている場合は、削除されたデータを含むテーブルとクエリの操作を続行できないことを知っています。
誤って削除したデータを復元し、予定より早く白髪にならないようにするための詳細な手順を作成しました。
目次
- 削除したテーブルを復元する方法
- 削除したビューを復元する方法
- 削除されたデータセットを復元する方法
- 今後同様の問題を防ぐために何をすべきか
- 問題が再発した場合に問題の規模を縮小するにはどうすればよいですか
削除したテーブルを復元する方法
削除されてから7日以内で、その名前と削除元のデータセットの名前がわかっている場合は、削除されたテーブルを復元できます。
テーブルを復元するには、GoogleBigQueryインターフェースでCloudShellコマンドラインを開きます。

次のコマンドを入力します。
bq cp mydataset.mytable@-3600000 mydataset.newtable
bq cp mydataset.mytable@-3600000 mydataset.newtable
テーブル名とデータセット名を使用した同じコマンドの例:
bq cp OWOXBI_Reports.123_Transactions_withModels@-13600000 OWOXBI_Reports_Restore.123_Transactions_withModels
bq cp OWOXBI_Reports.123_Transactions_withModels@-13600000 OWOXBI_Reports_Restore.123_Transactions_withModels
どこ:
- OWOXBI_Reports.123_Transactions_withModels —削除されたデータセットとテーブルです。
- OWOXBI_Reports_Restore.123_Transactions_withModels —データセットと、データを復元するデータセット内のテーブルの名前です。
- @ -13600000 —探しているテーブルがまだ存在していた過去(13,600,000ミリ秒前)の距離。 たとえば、テーブルが30分前に削除された場合、1時間前(60秒×60分×1000)の時間間隔@-3600000を設定するだけで十分です。
リクエストを入力した後、承認が必要です。 [承認]ボタンをクリックします。

コマンドが正常に実行されると、テーブルが復元されます。

次のようなテキストが表示されます。
Waiting on bqjob_r4ca30008c2e3147d_0000017af0d58e5e_1 ... (0s) Current status: DONE Table 'summer-drive-112011:OWOXBI_Reports_Restore.test_table@-600000' successfully copied to 'summer-drive-112011:OWOXBI_Reports_Restore.test_table'
Waiting on bqjob_r4ca30008c2e3147d_0000017af0d58e5e_1 ... (0s) Current status: DONE Table 'summer-drive-112011:OWOXBI_Reports_Restore.test_table@-600000' successfully copied to 'summer-drive-112011:OWOXBI_Reports_Restore.test_table'
削除したビューを復元する方法
上記の方法でリモートビューを復元することはできません。 この方法は、テーブルにのみ適しています。
Googleサポートでは、ログエクスプローラーを使用して削除されたビューを復元することをお勧めします。
リモートビューを更新したクエリを見つけるには、GoogleCloudPlatformログで次のクエリを実行します。
resource.type="bigquery_resource" protoPayload.methodName="tableservice.update" protoPayload.serviceData.tableUpdateRequest.resource.tableName.tableId="custom_events_attribution_VIEW"
resource.type="bigquery_resource" protoPayload.methodName="tableservice.update" protoPayload.serviceData.tableUpdateRequest.resource.tableName.tableId="custom_events_attribution_VIEW"
どこ:
- tableservice.update —ビューの更新をログに表示するコマンドです
- custom_events_attribution_VIEW —ビューの名前
[時間範囲の選択]設定で、ビューに変更を加えることができる期間(たとえば、1年)を設定します。

コマンドを実行すると、探しているビューを更新したすべてのクエリが表示されます。 最後のタイムスタンプクエリを選択します。

ログからクエリをコピーして、ビューを再作成します。

さらに、探していたビューを作成したクエリを見つけることができます(その前に、ビューを更新したクエリを検索しました)。 これを行うには、次のコマンドを使用します。
resource.type="bigquery_resource" protoPayload.methodName="tableservice.insert" protoPayload.serviceData.tableInsertRequest.resource.tableName.tableId="query_name_VIEW"
resource.type="bigquery_resource" protoPayload.methodName="tableservice.insert" protoPayload.serviceData.tableInsertRequest.resource.tableName.tableId="query_name_VIEW"

ログで必要なエントリを検索するために、可能な限り長い期間を設定することをお勧めします。

ログの記録が開始される前にビューが作成された場合、それを復元することはできません。 この場合、上記で説明したtableservice.updateコマンドが役立ちます。
削除されたデータセットを復元する方法
データセットを削除すると、復元できなくなります。 同じ名前で新しいデータセットを作成し、削除されたデータセットにあったテーブルとビューを復元して、それらを新しいデータセットに移動する必要があります。
データセットを削除してから最初の24時間は、同じ名前で新しいデータセットを作成することはできませんが、削除されたデータセットの一部であったテーブルとビューの名前を見つけることはできます。 ただし、テーブルとビュー自体は表示されなくなります。
BigQueryで検索すると、削除されたデータセットのビューを名前で見つけることができます。

テーブルの名前に共通のコンポーネントが含まれていないため、テーブルのリストは検索では見つかりません。
削除されたデータセットからテーブル名を検索するには、次のSQLクエリを使用します。 クエリで、テーブルを変更できる期間(creation_time BETWEEN)を指定します。 その結果、クエリは、どの期間内に変更が加えられたテーブルを返します。 これらは、削除されたデータセットのテーブルになります。
SELECT * FROM ( SELECT query, user_email, CONCAT(destination_table.project_id,".",destination_table.dataset_id,".",destination_table.table_id) AS destination_table, COUNT(job_id) AS job_ids, MAX(creation_time) AS lastUpdateDate FROM region-us.INFORMATION_SCHEMA.JOBS_BY_PROJECT WHERE creation_time BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 180 DAY) AND TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 0 DAY) AND state = 'DONE' AND CONCAT(destination_table.project_id,".",destination_table.dataset_id,".",destination_table.table_id) LIKE "%OWOXBI_Reports.%" GROUP BY 1, 2, 3 ORDER BY 5 DESC)
SELECT * FROM ( SELECT query, user_email, CONCAT(destination_table.project_id,".",destination_table.dataset_id,".",destination_table.table_id) AS destination_table, COUNT(job_id) AS job_ids, MAX(creation_time) AS lastUpdateDate FROM region-us.INFORMATION_SCHEMA.JOBS_BY_PROJECT WHERE creation_time BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 180 DAY) AND TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 0 DAY) AND state = 'DONE' AND CONCAT(destination_table.project_id,".",destination_table.dataset_id,".",destination_table.table_id) LIKE "%OWOXBI_Reports.%" GROUP BY 1, 2, 3 ORDER BY 5 DESC)
リクエストの結果、次の情報が届きます。
- query —destination_tableに変更を加えたクエリのテキスト
- user _email —destination_table更新要求を開始したユーザー
- destination_table —更新されたテーブル
- job_ids —指定された時間間隔(creation_time BETWEEN…)の間に開始されるクエリの数
- lastUpdateDate —クエリが最後に開始された時刻(MAX(creation_time)AS lastUpdateDate)
データセットを削除してから24時間後に、同じ名前で新しいデータセットを作成し、テーブルとビューの復元を開始できます。
今後同様の問題を防ぐために何をすべきか
- プロジェクトでの作業を開始するときに、GoogleBigQueryプロジェクトでログ収集をオンにします。
- テーブルに名前を付けて、データセットと同じように表示しないでください。
- GoogleBigQueryから削除するテーブルの名前を再確認してください。
- ユーザーインターフェイスではなく、クエリを介してテーブルを削除します。
- エンティティタイプをデータセット、テーブル、およびビューの名前に追加します。 例えば:
- OWOXBI_report_dataset
- OWOXBI_report_table
- OWOXBI_report_view
クエリを使用してテーブルを削除できます。
DROP TABLE `summer-drive-112011.OWOXBI_Reports_Restore.test_table`
DROP TABLE `summer-drive-112011.OWOXBI_Reports_Restore.test_table`
クエリを使用してビューを削除することもできます。
DROP VIEW `summer-drive-112011.OWOXBI_Reports_Restore.test_VIEW`
DROP VIEW `summer-drive-112011.OWOXBI_Reports_Restore.test_VIEW`
問題が再発した場合に問題の規模を縮小するにはどうすればよいですか
- スケジュールとGoogleAppsScriptのクエリを変更しないでください。 翌日、すべてのビューとテーブルを復元します。その後、ScheduleとGoogleAppsScriptは正しく機能します。
- ビューまたはテーブルがアトリビューションモデルの設定に関与している場合は、データを以前の場所に復元した後、アトリビューション計算を再開する必要があります。
トピックに関する有用なリンク
削除されたテーブルの復元
テーブルの削除
ビューの管理
GoogleBigQueryでテーブルをすぐに復元する方法

我々の顧客
育つ 22%高速
マーケティングで最も効果的なものを測定することで、より速く成長します
マーケティング効率を分析し、成長分野を見つけ、ROIを向上させます
デモを入手