交换Snowflake表前是否需要先暂停运行在原表上的定时任务?
结论
必须在交换表前暂停定时任务,交换完成验证无误后再恢复任务运行,核心原因如下:
- 避免数据不一致:如果定时任务在swap执行前后的极短时间内触发,写入
original_table的新数据会随swap操作被转移到back_up_table中,导致这部分数据丢失,同时你原本备份的历史数据也会被污染。 - 避免操作冲突:swap操作需要持有两张表的排他锁,如果定时任务正在运行中持有
original_table的锁,会直接导致swap执行失败,反之也可能造成定时任务报错中断。
推荐操作流程
- 暂停目标定时任务
ALTER TASK <你的定时任务名称> SUSPEND;
- 确认无正在运行的任务实例,避免有已触发的任务还在执行
SELECT * FROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY( SCHEDULED_TIME_RANGE_START=>DATEADD('hour',-1,CURRENT_TIMESTAMP()), RESULT_LIMIT => 100 )) WHERE NAME = '<你的定时任务名称>' AND STATE = 'EXECUTING';
- 执行表交换操作
ALTER TABLE original_table SWAP WITH back_up_table;
- 验证交换结果,可对比两张表的行数、最新数据时间、核心字段统计值等,确认交换符合预期
- 恢复定时任务运行
ALTER TASK <你的定时任务名称> RESUME;
额外注意
如果操作的表关联了多个定时任务、或者任务是DAG链路的一部分,需要暂停所有对original_table有读写操作的相关任务,再执行swap操作。
内容的提问来源于stack exchange,提问作者Deepika reddy
相关产品推荐
相关产品推荐

