如何取消删除BigQuery表?

Jor*_*ani 23 google-bigquery

我不小心删除了我的一个BigQuery表.是否可以取回它?API似乎不支持取消删除.

Jor*_*ani 38

可以通过表复制和快照装饰器在BigQuery中取消删除.也就是说,您可以在删除表之前复制表的快照.

有几点需要注意:

  1. 你必须分两步完成这个步骤; 首先,将表的快照复制到第二个表.然后,您可以将第二个表复制回原始位置.
  2. 您只能取消删除在过去2天内删除的表.
  3. 如果您之后重新创建了一个具有相同名称的表,则可能无法取消删除旧表.

下面是一个使用示例bq,但您可以使用BigQuery Web UI执行相同的操作.

首先让我们创建一个我们要删除的虚拟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 |
+----+
Run Code Online (Sandbox Code Playgroud)

现在,从表生存时获取当前的unix时间戳.

$ date +%s
1418864998
Run Code Online (Sandbox Code Playgroud)

请注意,这个时间以秒为单位,我们需要几毫秒.

"意外"删除表

$ bq rm dataset1.table1
rm: remove table 'helixdata2:dataset1.table1'? (y/N) y
Run Code Online (Sandbox Code Playgroud)

现在我们可以通过复制快照取消删除表:

$ 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'
Run Code Online (Sandbox Code Playgroud)

(注意我们将时间乘以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
Run Code Online (Sandbox Code Playgroud)

现在让我们验证表已经恢复:

$ bq query "select * from dataset1.table1"
Waiting on bqjob_r5967bea49ed9e97f_0000014a5af34dec_1 ... (0s) 
    Current status: DONE   
+----+
| a  |
+----+
| 17 |
+----+
Run Code Online (Sandbox Code Playgroud)

  • 重要提示:如果表格已被重新创建,您*不能*取消删除它们。这意味着此快照恢复不能与“在流式传输时按需创建表”模板表功能结合使用来从错误中恢复。我们通过艰难的方式了解到这一点:我们不小心删除了一个生产表,该表立即重新创建,因此我们无法从快照中恢复。 (2认同)

Fel*_*ffa 7

正如其他答案中所述,“取消删除”在CREATE OR REPLACE table.

如果您需要取消删除已被替换的表,请对以下问题进行投票

但是,这是仅使用 #standardSQL 即可访问表的早期版本的方法:

SELECT *
FROM `project.dataset.table` 
FOR SYSTEM TIME AS OF '2019-06-05 18:10:00'
Run Code Online (Sandbox Code Playgroud)


小智 6

恢复 1 小时前您的桌子如何(@-3600000 时间,以毫秒为单位):

bq cp my_project:old_dataset.old_table_name@-3600000 my_project:new_dataset.new_table_name
Run Code Online (Sandbox Code Playgroud)