Google bigquery 如何取消删除BigQuery表?

Google bigquery 如何取消删除BigQuery表?,google-bigquery,Google Bigquery,我不小心删除了我的一个BigQuery表。有可能把它拿回来吗?API似乎不支持取消删除。可以通过表复制和快照装饰程序在BigQuery中取消删除。也就是说,可以从删除表之前复制表的快照 BigQuery过去对取消删除有限制,但随着时间的推移,这些限制已被删除 下面是一个使用bq的示例,但是您可以使用BigQueryWebUI做同样的事情 首先,让我们创建一个将要删除的伪bigquery数据集和表: $ bq mk -d dataset1 Dataset 'helixdata2:dataset1'

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

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

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

下面是一个使用
bq
的示例,但是您可以使用BigQueryWebUI做同样的事情

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

您可以使用BigQuery CLI,指定旧表名、所需的历元时间日期和新表名:

:.@:.

例如:

bq cp my_project.old_dataset.old_table_name@1551880188000 my_project.new_dataset.new_table_name
将在2019年3月9日复制中的内容
(EPOCH:1551880188000),对于新表

如其他答案所示,在创建或替换表后,“取消删除”将不起作用

如果您需要取消删除已被替换的表,请:

但是,这就是如何使用#standardSQL访问表的早期版本:

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

回顾1小时前您的餐桌情况(@-3600000时间单位:毫秒):


如果您遇到以下错误“查询操作中出错:没有项目id无法启动作业”,只需添加一点内容。添加您的项目id。对于bq shell:-[bq shell--project_id=myprojectid]@Jordan Tigani我可以获取数据集的快照吗?我想知道在特定的时间戳中存在哪些表,因为我不确定哪些表是我意外删除的。重要说明:如果表已重新创建,则无法撤消删除。这意味着此快照恢复不能与“流式处理时按需创建表”模板表功能一起用于从错误中恢复。我们通过艰难的方式了解到这一点:我们意外地删除了一个生产表,该表立即被重新创建,因此无法从快照中恢复。我们从终端命令行运行此操作,并获得“sqlite3.OperationalError:尝试写入只读数据库”???我们遗漏了什么?在哪里运行这些命令的答案似乎在console.Cloud.google.com上您的项目的云Shell中。对于我们来说,它们似乎正在成功运行,这是对所选答案语法的有益补充。为我工作,当我乘以10得到10小时。
bq cp my_project:old_dataset.old_table_name@-3600000 my_project:new_dataset.new_table_name