oracle11g根据date字段类型的分区表转换为自动分区表

oracle11g存在字段date类型的range分区(按月划分分区表),由于早期是从oracle9i迁移到oracle11g,历史的分区表都是人工新增分区,先要改为自动分区,减少漏加分区导致的异常

1.查看当前用户下存在的分区表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//查看当前用户分区表及分区策略
SELECT p.table_name AS 表名,
decode(p.partitioning_key_count, 1, '主分区') AS 分区类型,
p.partitioning_type AS 分区类型,
p.column_name AS 分区键,
decode(nvl(q.subpartitioning_key_count, 0),
0,
'无子分区',
1,
'子分区') AS有无子分区,
q.subpartitioning_type AS 子分区类型,
q.column_name AS 子分区键
FROM (SELECT a.table_name,
a.partitioning_type,
b.column_name,
a.partitioning_key_count
FROM user_part_tables a, user_part_key_columns b
WHERE a.table_name = b.NAME
AND b.object_type = 'TABLE') p,
(SELECT a.table_name,
a.subpartitioning_type,
b.column_name,
a.subpartitioning_key_count
FROM user_part_tables a, user_subpart_key_columns b
WHERE a.table_name = b.NAME
AND a.subpartitioning_key_count <> 0
AND b.object_type = 'TABLE') q
WHERE p.table_name = q.table_name(+)
ORDER BY 5, 4, 1;

2.查看当前用户下存在的自动分区表

select distinct(table_name) from user_tab_partitions where interval = 'YES';

3.存在max分区

3.1查看max分区是否存在数据

select * from ZS_KKXX_JYLS partition(PART_202202);

3.2存在数据则数据备份出来

create table ZS_KKXX_JYLS_bak_20220122 as select * from ZS_KKXX_JYLS partition(PART_202202);

3.3删除max分区

alter table ZS_KKXX_JYLS drop PARTITION (PART_202202);

3.4设置自动月度自动添加分区

alter table ZS_KKXX_JYLS SET INTERVAL (NUMTOYMINTERVAL(1,'MONTH'));

3.5在线重建索引(只有max分区有数才需重建)

alter index PK_ZS_KKXX_JYLS  rebuild  online;

3.6max分区的数据导入分区表

insert into ZS_KKXX_JYLS select * from ZS_KKXX_JYLS_bak_20220122;

4.不存在max分区

4.1设置月度自动添加分区

alter table ZS_KKXX_JYLS SET INTERVAL (NUMTOYMINTERVAL(1,'MONTH'));