使用CLONE恢复对象后,如何保留原表的Time Travel历史?
保留原表Time Travel历史的表恢复方案
要实现快速恢复表到指定版本,同时保留原表完整的Time Travel历史,可采用以下优化方案:
方案一:保留交换后的原表归档
无需删除CLONE + SWAP生成的恢复表,而是将其重命名为历史归档表,后续直接从该归档表回溯更早版本:
-- 克隆指定时间点的表版本 CREATE TABLE my_table_restore CLONE my_table AT(OFFSET => -3600); -- 交换完成快速恢复 ALTER TABLE my_table SWAP WITH my_table_restore; -- 将原表(已被改名的my_table_restore)重命名为归档表,保留完整历史 ALTER TABLE my_table_restore RENAME TO my_table_historical;
后续若需恢复更早版本,直接从my_table_historical执行CLONE AT或Time Travel查询即可,无需繁琐的UNDROP操作。
方案二:先备份完整历史再交换
先克隆原表的完整快照(包含全部Time Travel历史)作为备份,再执行交换恢复:
-- 备份原表完整历史 CREATE TABLE my_table_full_backup CLONE my_table; -- 克隆指定时间点版本用于恢复 CREATE TABLE my_table_restore CLONE my_table AT(OFFSET => -3600); -- 交换恢复 ALTER TABLE my_table SWAP WITH my_table_restore; -- 可按需删除临时恢复表 DROP TABLE my_table_restore;
该方案通过独立的备份表保存原表完整历史,恢复后的生产表若需回溯更早版本,直接从备份表操作即可。
补充优化:原地恢复保留历史(适配A/B测试需求)
若你可以接受稍慢的操作,且需要保留原表完整历史并支持A/B测试,可优化INSERT OVERWRITE流程:
-- 克隆原表用于恢复前后的A/B测试对比 CREATE TABLE my_table_ab_test CLONE my_table; -- 原地恢复原表到指定版本,保留原表Time Travel历史 INSERT OVERWRITE INTO my_table SELECT * FROM my_table AT(OFFSET => -3600);
这种方式下,原表的Time Travel历史会完整保留(包含恢复操作的前后版本),my_table_ab_test可用于数据差异验证。
内容的提问来源于stack exchange,提问作者aldredd
相关产品推荐
相关产品推荐

