我不小心覆盖了现有表,将其用作临时表来存储另一个select的结果。如果旧表和新表具有不同的表结构,有没有办法将其回滚?是否有可能阻止某人覆盖特定的表以防止将来出现这种情况?
以下问题中有一条评论说,如果表格架构不同,则无法恢复。不确定最近是否有变化。
答案 0 :(得分:2)
首先使用与您的"丢失"完全相同的架构的东西(任何东西)再次覆盖您的桌子。表
然后按照参考文章中的相同步骤进行操作 -
SELECT * FROM [yourproject:yourdataset.yourtable@<time>]
如果您的表在上周左右或创建后没有更改
,则可以使用@ 0或者,为了避免成本 - 做bq cp ....
答案 1 :(得分:0)
您可以在 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