我不小心删除了我的一个BigQuery表。是否可以取回它? API似乎不支持取消删除。
答案 0 :(得分:33)
通过表复制和快照装饰器可以在BigQuery中取消删除。也就是说,您可以在删除表之前复制表的快照。
有几点需要注意:
以下是使用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'