表原子替换
Doris 支持对两个 OLAP 表执行原子替换操作,通过一次 ALTER TABLE 语句完成表名互换或整表替换,避免传统「先删后导」方式带来的数据查询空窗期。
适用场景
当业务需要重写一张表的全部数据,但又不希望出现「数据为空」的中间状态时,可使用表原子替换。
| 场景 | 推荐做法 |
|---|---|
| 整表重写(如离线全量回灌) | 使用 CREATE TABLE LIKE 建立新表 → 导入新数据 → 原子替换旧表 |
| 仅替换某个分区 | 参考 临时分区 |
| 需要保留旧表用于回滚 | 使用 swap = true,旧表数据被换到新表名下 |
| 替换后无需保留旧表 | 使用 swap = false,旧表直接删除 |
操作步骤
以「使用新数据替换旧表 tbl1」为例,标准流程如下:
-
基于旧表结构创建新表:
CREATE TABLE tbl2 LIKE tbl1; -
将新数据导入新表
tbl2。 -
执行原子替换:
ALTER TABLE tbl1 REPLACE WITH TABLE tbl2
[PROPERTIES('swap' = 'true')]; -
根据
swap参数确认替换结果(详见下文)。
语法说明
ALTER TABLE [db.]tbl1 REPLACE WITH TABLE tbl2
[PROPERTIES('swap' = 'true')];
含义:将表 tbl1 替换为表 tbl2。swap 参数控制替换后旧表的处理方式。
swap 参数行为对照
| swap 取值 | 替换后 tbl1 的数据 | 替换后 tbl2 的状态 | 典型用途 |
|---|---|---|---|
true(默认) | 原 tbl2 的数据 | 保留,且包含原 tbl1 的数据(两表互换) | 需要保留旧数据用于回滚或对比 |
false | 原 tbl2 的数据 | 被删除,无法恢复 | 仅需新数据,无需保留旧表 |
实现原理
替换操作本质上是把多步 DDL 合并为一个原子操作,对外表现为瞬时切换。
-
当
swap = true:- 将表 B 重命名为表 A。
- 将表 A 重命名为表 B。
-
当
swap = false:- 删除表 A。
- 将表 B 重命名为表 A。
由于上述步骤在元数据层面以原子事务执行,外部查询不会观察到中间状态。
注意事项
- 替换操作仅支持两张 OLAP 表 之间,不支持其他表类型。
- 系统 不会校验两张表的表结构是否一致,需由用户自行保证 schema 兼容性。
- 当
swap = false时,被替换的旧表会被直接删除,无法恢复,请谨慎使用。 - 替换操作 不会改变权限设置,因为权限基于表名进行检查,替换后新表自动继承原表名上的权限。
FAQ
Q1:替换过程中正在执行的查询会受影响吗?
A:替换是元数据层面的原子操作,已发起的查询会在原表数据上完成;新查询将命中替换后的数据。
Q2:两张表的列、索引、分区不一致可以替换吗?
A:可以,系统不校验结构一致性,但建议保持 schema 兼容,否则下游查询和应用可能因列名/类型变化而失败。
Q3:替换后能否恢复原表数据?
A:当 swap = true 时,原表数据保留在原 tbl2 表名下,可恢复;当 swap = false 时,原表已被删除,无法恢复。
Q4:可以对分区做原子替换吗?
A:可以,请使用 临时分区 功能进行分区级别的原子覆盖写。
相关文档
- 临时分区:分区级别的原子覆盖写方案
CREATE TABLE LIKE:基于现有表结构快速创建新表