【发布时间】:2018-02-05 16:09:53
【问题描述】:
我不小心覆盖了现有表,将其用作临时表来存储另一个选择的结果。如果旧表和新表的表结构不同,有没有办法回滚?是否可以防止某人覆盖特定表以防止将来发生这种情况?
以下问题中有一条评论说,如果表架构不同,则无法恢复。不确定最近是否发生了变化。
【问题讨论】:
标签: google-bigquery
我不小心覆盖了现有表,将其用作临时表来存储另一个选择的结果。如果旧表和新表的表结构不同,有没有办法回滚?是否可以防止某人覆盖特定表以防止将来发生这种情况?
以下问题中有一条评论说,如果表架构不同,则无法恢复。不确定最近是否发生了变化。
【问题讨论】:
标签: google-bigquery
首先用与“丢失”表具有完全相同架构的东西(任何东西)再次覆盖您的表
然后按照参考帖子中的相同步骤进行操作 - 即:
SELECT * FROM [yourproject:yourdataset.yourtable@<time>]
如果您的表格在上周左右或自创建以来没有更改,您可以使用 @0
或者,为了避免成本 - 做 bq cp ....
【讨论】:
您可以在 SQL 中恢复。 但是这会丢失可以为空的列和描述字段并产生查询成本
bq query --use_legacy_sql=false "CREATE OR REPLACE TABLE project:dataset.table AS SELECT * FROM project:dataset.table FOR SYSTEM_TIME AS OF TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 10 MINUTE)"
我最近发现这更有效
以毫秒为单位获取 unix 时间戳,并使用 cp 覆盖自身
bq query --use_legacy_sql=false "SELECT DATE_DIFF(TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 100 MINUTE), TIMESTAMP '1970-01-01', MILLISECOND)"
bq cp project:dataset.table@1625288152215 project:dataset.table
在你这样做之前,你可以检查以下内容
bq show --schema --format=prettyjson project:dataset.table@1625288152215 > schema-a.json
bq show --schema --format=prettyjson project:dataset.table > schema-b.json
diff schema-a.json schema-b.json
【讨论】: