web-dev-qa-db-ja.com

BigQueryテーブルの削除を取り消すにはどうすればよいですか?

BigQueryテーブルの1つを誤って削除してしまいました。取り戻すことはできますか? APIはundeleteをサポートしていないようです。

26
Jordan Tigani

BigQueryでの削除の取り消しは、テーブルコピーとスナップショットデコレータを介して可能です。つまり、テーブルが削除される前のテーブルのスナップショットをコピーできます。

注意点がいくつかあります。

  1. これは2つのステップで行う必要があります。まず、テーブルのスナップショットを2番目のテーブルにコピーします。次に、その2番目のテーブルを元の場所にコピーします。
  2. 過去2日以内に削除されたテーブルのみを元に戻すことができます。
  3. その後、同じ名前のテーブルを再作成した場合、古いテーブルを元に戻すことができない場合があります。

これはbqを使用した例ですが、BigQuery WebUIでも同じことができます。

まず、削除するダミーのbigqueryデータセットとテーブルを作成しましょう。

$ bq mk -d dataset1
Dataset 'helixdata2:dataset1' successfully created.
$ bq query --destination_table=dataset1.table1 "SELECT 17 as a"
Waiting on bqjob_ra0dedbee5cb4228_0000014a5af133d6_1 ... (0s) 
Current status: DONE   
+----+
| a  |
+----+
| 17 |
+----+

ここで、テーブルが有効だった時点から現在のUNIXタイムスタンプを取得します。

$ date +%s
1418864998

この時間は秒単位であることに注意してください。ミリ秒が必要です。

'誤って'テーブルを削除する

$ bq rm dataset1.table1
rm: remove table 'helixdata2:dataset1.table1'? (y/N) y

これで、スナップショットをコピーしてテーブルの削除を取り消すことができます。

$ bq cp dataset1.table1@1418864998000 dataset1.temp
Waiting on bqjob_r4d8174e2e41ae73_0000014a5af2a028_1 ... (0s) 
    Current status: DONE    
Tables 'helixdata2:dataset1.table1@1418864998000' successfully copied to     
    'helixdata2:dataset1.temp'

(ミリ秒が必要なため、時間を1000倍したことに注意してください)これにより、テーブルの古いスナップショットがdataset1.tempにコピーされました。それを元の場所にコピーして、一時テーブルを削除してみましょう。

$ bq cp dataset1.temp dataset1.table1
Waiting on bqjob_r3c0bb9302fb81d59_0000014a5af2dc7b_1 ... (0s) 
    Current status: DONE    
Tables 'helixdata2:dataset1.temp' successfully copied to 
    'helixdata2:dataset1.table1'
$ bq rm dataset1.temp
rm: remove table 'helixdata2:dataset1.temp'? (y/N) y

次に、テーブルが復元されたことを確認しましょう。

$ bq query "select * from dataset1.table1"
Waiting on bqjob_r5967bea49ed9e97f_0000014a5af34dec_1 ... (0s) 
    Current status: DONE   
+----+
| a  |
+----+
| 17 |
+----+
37
Jordan Tigani

他の回答で述べられているように、「[削除]」はCREATE OR REPLACE tableの後には機能しません。

置き換えられたテーブルの削除を取り消す必要がある場合は、 次の問題に賛成

ただし、これは、#standardSQLのみを使用して以前のバージョンのテーブルにアクセスする方法です。

SELECT *
FROM `project.dataset.table` 
FOR SYSTEM TIME AS OF '2019-06-05 18:10:00'
1
Felipe Hoffa

1時間前のテーブルの状態の回復(ミリ秒単位の@ -3600000時間):

bq cp my_project:old_dataset.old_table_name@-3600000 my_project:new_dataset.new_table_name
1
Israel Gómez

BigQuery CLIを使用して、古いテーブル名、エポック時間の目的の日付、および新しいテーブル名を指定できます。

<project>:<dataset>.<table>@<DESIRED_Epoch_TIME> <project>:<dataset>.<table>

例えば:

bq cp my_project.old_dataset.old_table_name@1551880188000 my_project.new_dataset.new_table_name

2019年3月9日(Epoch:1551880188000)にあったコンテンツを新しいテーブルにコピーします

0
shayms8