跳到主要内容

表原子替换

Doris 支持对两个 OLAP 表执行原子替换操作,通过一次 ALTER TABLE 语句完成表名互换或整表替换,避免传统「先删后导」方式带来的数据查询空窗期。

适用场景

当业务需要重写一张表的全部数据,但又不希望出现「数据为空」的中间状态时,可使用表原子替换。

场景推荐做法
整表重写(如离线全量回灌)使用 CREATE TABLE LIKE 建立新表 → 导入新数据 → 原子替换旧表
仅替换某个分区参考 临时分区
需要保留旧表用于回滚使用 swap = true,旧表数据被换到新表名下
替换后无需保留旧表使用 swap = false,旧表直接删除

操作步骤

以「使用新数据替换旧表 tbl1」为例,标准流程如下:

  1. 基于旧表结构创建新表:

    CREATE TABLE tbl2 LIKE tbl1;
  2. 将新数据导入新表 tbl2

  3. 执行原子替换:

    ALTER TABLE tbl1 REPLACE WITH TABLE tbl2
    [PROPERTIES('swap' = 'true')];
  4. 根据 swap 参数确认替换结果(详见下文)。

语法说明

ALTER TABLE [db.]tbl1 REPLACE WITH TABLE tbl2
[PROPERTIES('swap' = 'true')];

含义:将表 tbl1 替换为表 tbl2swap 参数控制替换后旧表的处理方式。

swap 参数行为对照

swap 取值替换后 tbl1 的数据替换后 tbl2 的状态典型用途
true(默认)原 tbl2 的数据保留,且包含原 tbl1 的数据(两表互换)需要保留旧数据用于回滚或对比
false原 tbl2 的数据被删除,无法恢复仅需新数据,无需保留旧表

实现原理

替换操作本质上是把多步 DDL 合并为一个原子操作,对外表现为瞬时切换。

  • swap = true

    1. 将表 B 重命名为表 A。
    2. 将表 A 重命名为表 B。
  • swap = false

    1. 删除表 A。
    2. 将表 B 重命名为表 A。

由于上述步骤在元数据层面以原子事务执行,外部查询不会观察到中间状态。

注意事项

  • 替换操作仅支持两张 OLAP 表 之间,不支持其他表类型。
  • 系统 不会校验两张表的表结构是否一致,需由用户自行保证 schema 兼容性。
  • swap = false 时,被替换的旧表会被直接删除,无法恢复,请谨慎使用。
  • 替换操作 不会改变权限设置,因为权限基于表名进行检查,替换后新表自动继承原表名上的权限。

FAQ

Q1:替换过程中正在执行的查询会受影响吗?

A:替换是元数据层面的原子操作,已发起的查询会在原表数据上完成;新查询将命中替换后的数据。

Q2:两张表的列、索引、分区不一致可以替换吗?

A:可以,系统不校验结构一致性,但建议保持 schema 兼容,否则下游查询和应用可能因列名/类型变化而失败。

Q3:替换后能否恢复原表数据?

A:当 swap = true 时,原表数据保留在原 tbl2 表名下,可恢复;当 swap = false 时,原表已被删除,无法恢复。

Q4:可以对分区做原子替换吗?

A:可以,请使用 临时分区 功能进行分区级别的原子覆盖写。

相关文档

  • 临时分区:分区级别的原子覆盖写方案
  • CREATE TABLE LIKE:基于现有表结构快速创建新表