【问题标题】:How can I undelete a BigQuery table?如何取消删除 BigQuery 表?
【发布时间】:2015-02-16 17:13:00
【问题描述】:

我不小心删除了我的一个 BigQuery 表。有可能找回吗? API 似乎不支持取消删除。

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

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

    BigQuery 曾经对取消删除有限制,但随着时间的推移,这些限制已被删除。

    这是一个使用 bq 的示例,但您可以使用 BigQuery 网络用户界面执行相同的操作。

    首先让我们创建一个要删除的虚拟 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 |
    +----+
    

    【讨论】:

    • 只是一点点补充,如果您收到此错误“查询操作中的错误:无法在没有项目 ID 的情况下启动作业”。添加您的项目 ID。对于 bq shell:- [ bq shell --project_id=myprojectid ]
    • @Jordan Tigani 我可以获取数据集的快照吗?我想知道哪些表在特定的时间戳出现,因为我不确定我不小心删除了哪些表。
    • 重要提示:如果表已重新创建,您不能取消删除表。这意味着此快照恢复不能用于结合“在流式传输时按需创建表”模板表功能从错误中恢复。我们以惨痛的方式学到了这一点:我们不小心删除了一个生产表,该表被立即重新创建,因此我们无法从快照中恢复。
    • 我们从终端命令行运行它并得到“sqlite3.OperationalError:尝试写入只读数据库”???我们缺少什么?
    • 看来在哪里运行这些命令的答案是在您的项目的 Cloud Shell 中 console.cloud.google.com。他们似乎在那里为我们成功运行
    【解决方案2】:

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

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

    【讨论】:

    • 对所选答案语法的有用补充。为我工作,当我乘以 10 得到 10 小时。
    【解决方案3】:

    如其他答案中所述,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'
    

    【讨论】:

      【解决方案4】:

      您可以使用 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),到新表

      【讨论】:

        猜你喜欢
        • 2018-02-27
        • 2016-12-03
        • 2020-03-24
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 2018-08-18
        • 2022-01-12
        • 1970-01-01
        相关资源
        最近更新 更多