概念描述
Oceanbase Oracle模式不支持分区表的split partition
,如果需要对分区表进行拆分,常规方法是先删除MAX分区然后再add partition
,再把MAX分区也add上,但是这种拆分分区的方式不适合复合分区的场景,比如列表+时间的复合RANGE分区,分区里有多个部分地市的MAX分区,这样就不能通过删除中间的MAX分区再add partition
。
Oceanbase 提供一个隐含参数_enable_add_between_range_partitions
,可以强制在两个分区之间add partition
,但是数据不会像Oracle的split partition
一样可以自动迁移到新分区中。
测试验证
- 创建一个测试分区表,此分区表是列表+时间的复合RANGE分区表
DROP TABLE DBMT.TABLEA PURGE;
CREATE TABLE DBMT.TABLEA
( "REGION" NUMBER(5,0) DEFAULT 991 NOT NULL,
"ID" VARCHAR2(512) NOT NULL,
"CREATE_TIME" DATE DEFAULT SYSDATE NOT NULL
)
PARTITION BY RANGE ("REGION","CREATE_TIME")(
PARTITION "PART_991_202306" VALUES LESS THAN (991, TO_DATE(' 2023-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
PARTITION "PART_991_202307" VALUES LESS THAN (991, TO_DATE(' 2023-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
PARTITION "PART_991_MAX" VALUES LESS THAN (991, TO_DATE(' 3000-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
PARTITION "PART_992_202306" VALUES LESS THAN (992, TO_DATE(' 2023-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
PARTITION "PART_992_202307" VALUES LESS THAN (992, TO_DATE(' 2023-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
PARTITION "PART_992_MAX" VALUES LESS THAN (992, TO_DATE(' 3000-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')));
-- 创建一个全局索引
create index dbmt.idx_tablea_globle on dbmt.tablea(id);
-- 创建一个分区索引
create index dbmt.idx_tablea_local on dbmt.tablea(REGION) local;
复制
- Oceanbase 不支持
split partition
obclient [SYS]> ALTER TABLE DBMT.TABLEA SPLIT PARTITION PART_991_MAX AT (991, TO_DATE(' 2023-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) INTO (PARTITION PART_991_202308, PARTITION PART_991_MAX);
ORA-00600: internal error code, arguments: -4179, split partition not allowed
复制
- Oceanbase 隐含参数
_enable_add_between_range_partitions
默认是False
,add partition
命令会失败
MySQL [(none)]> select b.tenant_name,a.svr_ip,a.name,a.value,a.info
from oceanbase.__all_virtual_tenant_parameter_info a, oceanbase.__all_tenant b
where a.tenant_id=b.tenant_id and a.name = '_enable_add_between_range_partitions';
+-------------+---------------+--------------------------------------+-------+-------------------------------------------------+
| tenant_name | svr_ip | name | value | info |
+-------------+---------------+--------------------------------------+-------+-------------------------------------------------+
| test | 133.96.123.36 | _enable_add_between_range_partitions | True | enable add range partition at not last position |
| test | 133.96.123.37 | _enable_add_between_range_partitions | True | enable add range partition at not last position |
| test | 133.96.123.38 | _enable_add_between_range_partitions | True | enable add range partition at not last position |
+-------------+---------------+--------------------------------------+-------+-------------------------------------------------+
3 rows in set (0.036 sec)
复制
obclient [SYS]> alter table DBMT.TABLEA add partition PART_991_202308 VALUES LESS THAN (991, TO_DATE(' 2023-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'));
ORA-14074: partition bound must collate higher than that of the last partition
复制
- 插入一条测试数据,数据分布到PART_991_MAX分区中,并且这条数据也属于后面新添加的分区
obclient [SYS]> insert into DBMT.TABLEA values (991,'1',to_date('2023-08-02','YYYY-MM-DD'));
Query OK, 1 row affected (0.007 sec)
obclient [SYS]> commit;
Query OK, 0 rows affected (0.002 sec)
obclient [SYS]> select * from DBMT.TABLEA partition (PART_991_MAX);
+--------+----+---------------------+
| REGION | ID | CREATE_TIME |
+--------+----+---------------------+
| 991 | 1 | 2023-08-02 00:00:00 |
+--------+----+---------------------+
1 row in set (0.010 sec)
复制
- 在sys租户下修改参数,业务租户下添加分区
-- 修改参数
MySQL [(none)]> alter system set _enable_add_between_range_partitions = 'True' tenant='test';
-- 查看参数
MySQL [(none)]> select b.tenant_name,a.svr_ip,a.name,a.value,a.info
-> from oceanbase.__all_virtual_tenant_parameter_info a, oceanbase.__all_tenant b
-> where a.tenant_id = b.tenant_id and a.name = '_enable_add_between_range_partitions' and b.tenant_name = 'test';
+-------------+---------------+--------------------------------------+-------+-------------------------------------------------+
| tenant_name | svr_ip | name | value | info |
+-------------+---------------+--------------------------------------+-------+-------------------------------------------------+
| test | 133.96.123.37 | _enable_add_between_range_partitions | True | enable add range partition at not last position |
| test | 133.96.123.36 | _enable_add_between_range_partitions | True | enable add range partition at not last position |
| test | 133.96.123.38 | _enable_add_between_range_partitions | True | enable add range partition at not last position |
+-------------+---------------+--------------------------------------+-------+-------------------------------------------------+
3 rows in set (0.038 sec)
-- 添加分区
obclient [SYS]> alter table DBMT.TABLEA add partition PART_991_202308 VALUES LESS THAN (991, TO_DATE(' 2023-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'));
Query OK, 0 rows affected (0.079 sec)
-- 查看刚才插入的数据并没有自动迁移到新分区中
obclient [SYS]> select * from DBMT.TABLEA partition (PART_991_MAX);
+--------+----+-------------+
| REGION | ID | CREATE_TIME |
+--------+----+-------------+
| 991 | 1 | 02-AUG-23 |
+--------+----+-------------+
1 row in set (0.003 sec)
复制
- 加完分区后,建议将参数再改回False
MySQL [(none)]> alter system set _enable_add_between_range_partitions = 'False' tenant='test';
复制
- 加分区,索引不会失效
obclient [SYS]> select owner, table_name, index_name, status from dba_indexes where table_name='TABLEA';
+-------+------------+-------------------+--------+
| OWNER | TABLE_NAME | INDEX_NAME | STATUS |
+-------+------------+-------------------+--------+
| DBMT | TABLEA | IDX_TABLEA_GLOBLE | VALID |
| DBMT | TABLEA | IDX_TABLEA_LOCAL | VALID |
+-------+------------+-------------------+--------+
2 rows in set (0.024 sec)
复制
- 加分区,local index也会自动加分区
obclient [SYS]> select index_owner, index_name, partition_position pos, partition_name from dba_ind_partitions where index_name = 'IDX_TABLEA_LOCAL';
+-------------+------------------+-----+-----------------+
| INDEX_OWNER | INDEX_NAME | POS | PARTITION_NAME |
+-------------+------------------+-----+-----------------+
| DBMT | IDX_TABLEA_LOCAL | 1 | PART_991_202306 |
| DBMT | IDX_TABLEA_LOCAL | 2 | PART_991_202307 |
| DBMT | IDX_TABLEA_LOCAL | 3 | PART_991_202308 |
| DBMT | IDX_TABLEA_LOCAL | 4 | PART_991_MAX |
| DBMT | IDX_TABLEA_LOCAL | 5 | PART_992_202306 |
| DBMT | IDX_TABLEA_LOCAL | 6 | PART_992_202307 |
| DBMT | IDX_TABLEA_LOCAL | 7 | PART_992_MAX |
+-------------+------------------+-----+-----------------+
7 rows in set (0.023 sec)
复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
文章被以下合辑收录
评论
相关阅读
2025年3月国产数据库大事记
墨天轮编辑部
530次阅读
2025-04-03 15:21:16
OceanBase赋能百丽核心系统上线,护航双11流量洪峰
OceanBase数据库
214次阅读
2025-03-20 20:34:04
OceanBase 单机版发布,针对中小规模业务场景
通讯员
188次阅读
2025-03-28 12:01:19
从理论到实践:深入探索 OceanBase 原生分布式架构
shunwahⓂ️
174次阅读
2025-03-13 16:06:34
OceanBase CEO杨冰:2025年分布式数据库将迎来本地部署和国产升级的全面爆发
通讯员
161次阅读
2025-04-03 09:35:26
宁波市政府框采:优炫、南大通用、东方金信、金仓、达梦、OceanBase等多家数据库产品入围
通讯员
161次阅读
2025-03-10 12:30:06
OceanBase亮相「党政信息化产品技术选型供需对接会」,助力党政关键业务系统升级
OceanBase
155次阅读
2025-03-27 09:55:58
TP与AP共生之道:OceanBase 4.3.5 HTAP混合负载实战
shunwahⓂ️
123次阅读
2025-03-27 15:04:42
2025年4月中国数据库流行度排行榜:OB高分复登顶,崖山稳驭撼十强
墨天轮编辑部
117次阅读
2025-04-09 15:33:27
OceanBase首届合作伙伴峰会:携手伙伴共赢云和AI时代
OceanBase数据库
109次阅读
2025-03-26 15:29:59
TA的专栏
目录