Snowflake删除列后Time Travel失效,如何恢复被删列C的数据?
Snowflake删除列后Time Travel无法找回数据的原因及恢复方案
为什么列C的数据无法通过Time Travel查询返回?
- 当前表schema优先规则:Snowflake的Time Travel查询会基于当前表的结构来读取历史数据。执行
ALTER TABLE DROP COLUMN c后,表的元数据已经移除了列C的定义,所以即使历史快照中存在列C的数据,查询结果也不会包含该列。 - DROP COLUMN是元数据级操作:这个操作并没有立即物理删除列C的数据,只是在元数据中标记该列不可见。数据会保留到表的Time Travel保留期结束,或者执行
VACUUM操作后才会被彻底清理。
如何恢复列C?
方法1:直接使用UNDROP COLUMN(推荐)
只要还在表的Time Travel保留期内(默认1天,企业版最长90天),可以直接恢复被删除的列:
ALTER TABLE time_travel_test UNDROP COLUMN c;
执行后,列C会被恢复,且原有数据完整保留。
方法2:通过克隆历史快照恢复
如果UNDROP无法使用(比如误操作后过了保留期,或者需要单独提取列数据),可以克隆删除列之前的表快照,再将列数据合并回原表:
-- 克隆指定时间点的表到新表 CREATE OR REPLACE TABLE time_travel_test_clone CLONE time_travel_test AT(TIMESTAMP=>$good_data_timestamp); -- 给原表添加列C,再从克隆表同步数据 ALTER TABLE time_travel_test ADD COLUMN c NUMBER; UPDATE time_travel_test t SET c = tc.c FROM time_travel_test_clone tc WHERE t.a = tc.a AND t.b = tc.b;
补充说明
你测试中的AT(TIMESTAMP=>$good_data_timestamp)查询之所以不返回列C,只是因为当前表的schema已经没有该列定义,但列C的历史数据其实还存在于Snowflake的存储中,直到被真空操作清理。
内容的提问来源于stack exchange,提问作者Felipe Hoffa
相关产品推荐
相关产品推荐

