如何取消删除BigQuery表?

时间:2014-12-18 01:19:19

标签: google-bigquery

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

4 个答案:

答案 0 :(得分:33)

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

有几点需要注意:

  1. 你必须分两步完成;首先,将表的快照复制到第二个表。然后,您可以将第二个表格复制回原始位置。
  2. 您只能取消删除在最后 2 天内删除的表格。
  3. 如果您之后重新创建了一个具有相同名称的表格,则可能无法取消删除旧表格。
  4. 以下是使用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 |
    +----+
    

    现在,从表生存时获取当前的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 |
    +----+
    

答案 1 :(得分:1)

在1小时前恢复您的餐桌状态(@ -3600000时间以毫秒为单位):

bq cp my_project:old_dataset.old_table_name@-3600000 my_project:new_dataset.new_table_name

答案 2 :(得分:0)

您可以使用BigQuery CLI,指定旧表名称,EPOCH时间中的所需日期以及新表名称:

<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),移至新表格

答案 3 :(得分:0)

如其他答案所示,在CREATE OR REPLACE table之后,“取消删除”将不起作用。

如果您需要取消删除已替换的表,请upvote the following issue

但是,这是仅使用#standardSQL就能获得表的早期版本的方法:

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