首批通过分布式安全可靠测评,为关键业务系统打造
分区交换
更新时间:2026-04-09 19:31:44
OceanBase 数据库的分区交换功能主要用来实现快速将数据导入分区表,达到数据高效加载的目的,即通过全量旁路导入的方式将数据快速导入新建非分区表中,然后利用分区交换功能将非分区表中的数据快速导入分区表中,加快现有分区表增量数据导入的性能。
建议将分区交换功能作为增量旁路导入的备选方案。例如,基于分区交换功能来导入分区表 A 的增量数据,具体操作步骤如下:
- 在表 A 上创建一个空的新分区 P。
- 新建一张结构与表 A 完全相同的非分区表 B,并通过旁路导入将增量数据导入至表 B。
- 利用分区交换功能,将表 A 中的新分区 P 与表 B 进行互换。
使用限制及注意事项
不支持数据校验,即必须指定
WITHOUT VALIDATION,用户需要自行保证交换数据的有效性。分区表和非分区表的表级和列级属性要求一一对应。
分区表和非分区表的约束要求完全相同,且当前版本不支持两表存在外键约束。
分区表的局部索引表和非分区表的索引表要求一一对应。
只支持
INCLUDING INDEXES的行为(Oracle 模式须明确指定INCLUDING INDEXES),局部索引对应分区的数据也会参与交换,局部索引在交换后保持交换前的可用状态。不支持
UPDATE GLOBAL INDEXES,因此全局索引在交换成功后都会是 Unusable 状态(无效状态)。当前的分区交换功能建议只作为增量旁路导入的临时替换功能。有关增量旁路导入的信息,参见 旁路导入概述。
当使用一级分区表与非分区表交换数据时:
- 一级分区必须是 Range 分区。
不支持二级分区表的一级分区与非分区表交换数据。
当使用二级分区表的二级分区与非分区表交换数据时:
- 对一级分区类型没有要求,不过二级分区必须是 Range 分区。
语法
ALTER TABLE partition_table_name
EXCHANGE PARTITION partition_name
WITH TABLE non_partition_table_name
INCLUDING INDEXES
WITHOUT VALIDATION;
参数解释
| 参数 | 描述 |
|---|---|
| partition_table_name | 指定分区表名称。 |
| partition_name | 指定分区名称。 |
| non_partition_table_name | 指定非分区表名称。 |
使用说明
当前分区交换功能实现一张分区表的一个分区和非分区表做数据交换,主要作为增量旁路导入功能的临时替换工具,其中分区表和非分区表通常特性如下:
- 分区表(partitioned table):包含历史数据的分区表,通常数据量较大。
- 非分区表(non-partitioned table):包含增量数据。
分区交换功能的使用须极为小心,因为不当操作可引起数据不符合原表分区键的条件,进而触发连锁错误。因此,在执行分区交换时,该按照以下步骤来判断分区表与非分区表是否能够进行分区交换。
使用
SHOW CREATE TABLE语句查询分区表的分区键以及目标分区信息。查询非分区表的数据,判断非分区表的数据是否满足目标分区分区键数据范围要求。其中
table_name为要查询的表名。SHOW CREATE TABLE table_name;通过查询结果,保证分区表和非分区表符合上述 使用限制及注意事项。
在进行分区交换之前,至少需要确保以下条件符合要求。
属性 要求 是否在同一租户下 是 是否在同一个 Schema 下 是 是否同一表组(TableGroup) 是 是否同一表空间(TableSpace) 是 使用的字符集格式是否一致 是 表类型是否一致 是,要求都是用户表,即 USER_TABLE主键数量是否一致 是 行存储格式是否一致 是 列格式和列的相对顺序是否一致 是 是否都是自增列 是 列的默认值、生成列表达式是否一致 是 加密方式是否一致 是 列存格式是否一致 是 索引格式、状态和数量是否一致 是,分区表的局部索引需要和非分区表的索引一一对应 索引表名是否一致 否 约束格式、包含的列是否一致 是 使用分区交换的语法进行分区交换,交换之后,分区表指定分区的数据会迁移到非分区表上,非分区表的数据会迁移到分区表的指定分区上。分区表的全局索引状态为 Unusable。
示例
创建分区表
tbl1_r。CREATE TABLE tbl1_r (col1 INT PRIMARY KEY, col2 VARCHAR2(50)) PARTITION BY RANGE(col1) (PARTITION p0 VALUES LESS THAN(10), PARTITION p1 VALUES LESS THAN(20), PARTITION p2 VALUES LESS THAN(30) );创建非分区表
tbl1。CREATE TABLE tbl1 (col1 INT PRIMARY KEY, col2 VARCHAR2(50));向表
tbl1中插入数据。INSERT INTO tbl1 VALUES(1, 'a1'),(2, 'a2');返回结果如下:
Query OK, 2 rows affected Records: 2 Duplicates: 0 Warnings: 0执行分区表
tbl1_r的分区p0与非分区表tbl1进行分区交换。ALTER TABLE tbl1_r EXCHANGE PARTITION p0 WITH TABLE tbl1 INCLUDING INDEXES WITHOUT VALIDATION;查看分区表
tbl1_r的分区p0的数据。SELECT * FROM tbl1_r PARTITION(p0);返回结果如下:
+------+------+ | COL1 | COL2 | +------+------+ | 1 | a1 | | 2 | a2 | +------+------+ 2 rows in set