Oracle 19C实测:重命名分区表后又重命名分区索引,分区索引会失效吗?DBA必看避坑指南!
问题描述
Oracle 19C 环境下将分区表重命名后,再将表上的分区索引重命名后,分区索引会失效吗?
**很多时候不能想当然的认为会还是不会!
毕竟都是生产环境,要测试后才算数!
客户看了你的测试记录,也敢在生产环境做变更。
本文提供一个思路:那就是任何运维场景都能用测试用例先模拟一次。**
模拟测试
测试环境:Oracle 19.3 单机
1. 创建测试数据
-- 创建分区表
CREATE TABLE WEWIN.MF_DETAIL_TMP (income_id NUMBER(12) PRIMARY KEY,customer_id NUMBER(8) NOT NULL,region_code VARCHAR2(10) NOT NULL,income_date DATE DEFAULT SYSDATE,amount NUMBER(12,2) CHECK (amount > 0),currency VARCHAR2(3) DEFAULT 'CNY'
)
PARTITION BY RANGE (income_date)
INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'))
(PARTITION p_init VALUES LESS THAN (TO_DATE('2025-11-01', 'YYYY-MM-DD'))
);-- 插入数据
INSERT /*+ APPEND */ INTO WEWIN.MF_DETAIL_TMP
SELECTROWNUM AS income_id,TRUNC(DBMS_RANDOM.VALUE(10000, 999999)) AS customer_id,CHR(65 + TRUNC(DBMS_RANDOM.VALUE(0, 26))) || CHR(65 + TRUNC(DBMS_RANDOM.VALUE(0, 26))) || LPAD(TRUNC(DBMS_RANDOM.VALUE(1, 100)), 3, '0') AS region_code,TO_DATE('2025-11-01', 'YYYY-MM-DD') + TRUNC(DBMS_RANDOM.VALUE(0, 730)) AS income_date, -- 2022-2023随机日期ROUND(DBMS_RANDOM.VALUE(10, 10000), 2) AS amount,DECODE(TRUNC(DBMS_RANDOM.VALUE(0, 5)), 0, 'USD', 1, 'EUR', 'CNY') AS currency
FROM (SELECT 1 FROM dual CONNECT BY LEVEL <= 10000);
COMMIT;-- 收集一次统计信息
EXEC DBMS_STATS.GATHER_TABLE_STATS (OWNNAME=>'WEWIN', TABNAME=>UPPER('MF_DETAIL_TMP'),METHOD_OPT=>'FOR ALL COLUMNS SIZE auto',ESTIMATE_PERCENT=>dbms_stats.auto_sample_size,DEGREE=>4,CASCADE=>TRUE,no_invalidate=>false);
1.2 检查分区情况
-- 查看分区数量
SELECT partition_name, high_value, num_rows
FROM dba_tab_partitions
WHERE table_name = 'MF_DETAIL_TMP';P_INIT TO_DATE(' 2025-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 0
SYS_P5957 TO_DATE(' 2027-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 400
SYS_P5958 TO_DATE(' 2026-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 433
SYS_P5959 TO_DATE(' 2027-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 429
SYS_P5960 TO_DATE(' 2026-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 391
SYS_P5961 TO_DATE(' 2026-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 431
SYS_P5962 TO_DATE(' 2026-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 427
SYS_P5963 TO_DATE(' 2025-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 442
SYS_P5964 TO_DATE(' 2026-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 395
SYS_P5965 TO_DATE(' 2026-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 465
SYS_P5966 TO_DATE(' 2027-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 422
SYS_P5967 TO_DATE(' 2026-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 417
SYS_P5968 TO_DATE(' 2026-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 422
SYS_P5969 TO_DATE(' 2027-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 428
SYS_P5970 TO_DATE(' 2026-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 387
SYS_P5971 TO_DATE(' 2027-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 428
SYS_P5972 TO_DATE(' 2027-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 403
SYS_P5973 TO_DATE(' 2027-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 441
SYS_P5974 TO_DATE(' 2026-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 412
SYS_P5975 TO_DATE(' 2027-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 400
SYS_P5976 TO_DATE(' 2027-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 382
SYS_P5977 TO_DATE(' 2027-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 397
SYS_P5978 TO_DATE(' 2026-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 422
SYS_P5979 TO_DATE(' 2027-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 394
SYS_P5980 TO_DATE(' 2026-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 432
1.3 创建索引
-- 创建GLOCAL全局分区索引
CREATE INDEX idx_region_code_g_part
ON WEWIN.MF_DETAIL_TMP (region_code)
GLOBAL PARTITION BY RANGE (region_code)
(PARTITION p_region_am VALUES LESS THAN ('N'),PARTITION p_region_nz VALUES LESS THAN (MAXVALUE)
);-- LOCAL分区索引(自动继承表分区)
CREATE INDEX idx_income_date_part ON WEWIN.MF_DETAIL_TMP (income_date) LOCAL;
1.4 检查索引有效性
-- 查询所有相关索引状态
SELECT index_name, partitioned, locality, status
FROM dba_indexes
WHERE table_name = 'MF_DETAIL_TMP';-- 查询分区索引信息
SELECT index_name, partitioning_type, locality, alignment
FROM dba_part_indexes
WHERE table_name = 'MF_DETAIL_TMP';
INDEX_NAME PARTITIONING_TYPE LOCALITY ALIGNMENT
------------------------------ ------------------ ------------ ------------------------
IDX_INCOME_DATE_PART RANGE LOCAL PREFIXED
IDX_REGION_CODE_G_PART RANGE GLOBAL PREFIXED-- 或者
COL index_name FOR A30
COL index_type FOR A10
COL partitioned FOR A10
COL locality FOR A10
COL alignment FOR A10
COL partitioning_type FOR A10 HEADING 'Part Type'
SELECT i.index_name, i.index_type, i.partitioned, p.locality, p.alignment, p.partitioning_type
FROM dba_indexes i
LEFT JOIN dba_part_indexes p ON i.index_name = p.index_name
WHERE i.table_name = 'MF_DETAIL_TMP';Index Name Type Partitione Locality Alignment Part Type
------------------------------ ---------- ---------- ---------- ---------- ----------
IDX_REGION_CODE_G_PART NORMAL YES GLOBAL PREFIXED RANGE
IDX_INCOME_DATE_PART NORMAL YES LOCAL PREFIXED RANGE
SYS_C005851 NORMAL NO-- 查询索引分区的信息
SELECT index_name, partition_name, status
FROM dba_ind_partitions
WHERE index_name IN (SELECT index_name FROM dba_indexes WHERE table_name = 'MF_DETAIL_TMP'
);
INDEX_NAME PARTITION_NAM STATUS
------------------------------ --------------- ---------------
IDX_INCOME_DATE_PART SYS_P2506 USABLE
IDX_INCOME_DATE_PART SYS_P2516 USABLE
IDX_INCOME_DATE_PART SYS_P2517 USABLE
IDX_INCOME_DATE_PART SYS_P2518 USABLE
IDX_INCOME_DATE_PART SYS_P2519 USABLE
IDX_INCOME_DATE_PART SYS_P2520 USABLE
IDX_INCOME_DATE_PART SYS_P2521 USABLE
IDX_INCOME_DATE_PART SYS_P2522 USABLE
IDX_INCOME_DATE_PART SYS_P2523 USABLE
IDX_INCOME_DATE_PART SYS_P2524 USABLE
IDX_INCOME_DATE_PART SYS_P2525 USABLE
IDX_INCOME_DATE_PART SYS_P2526 USABLE
IDX_INCOME_DATE_PART SYS_P2527 USABLE
IDX_INCOME_DATE_PART SYS_P2528 USABLE
IDX_INCOME_DATE_PART SYS_P2505 USABLE
IDX_REGION_CODE_G_PART P_REGION_NZ USABLE
IDX_INCOME_DATE_PART SYS_P2507 USABLE
IDX_REGION_CODE_G_PART P_REGION_AM USABLE
IDX_INCOME_DATE_PART SYS_P2508 USABLE
IDX_INCOME_DATE_PART SYS_P2509 USABLE
IDX_INCOME_DATE_PART SYS_P2510 USABLE
IDX_INCOME_DATE_PART SYS_P2511 USABLE
IDX_INCOME_DATE_PART SYS_P2512 USABLE
IDX_INCOME_DATE_PART SYS_P2513 USABLE
IDX_INCOME_DATE_PART SYS_P2514 USABLE
IDX_INCOME_DATE_PART SYS_P2515 USABLE
IDX_INCOME_DATE_PART P_INIT USABLE27 rows selected.col index_name for a30
SELECT index_name, partitioned, status
FROM dba_indexes
WHERE table_name = 'MF_DETAIL_TMP';
INDEX_NAME PARTIT STATUS
------------------------------ ------ ---------------
SYS_C005851 NO VALID
IDX_REGION_CODE_G_PART YES N/A << 分区索引在DBA_INDEXES中状态固定为NA
IDX_INCOME_DATE_PART YES N/A
1.5 重命名分区表和分区索引
-- 重命名表
ALTER TABLE WEWIN.MF_DETAIL_TMP RENAME TO MF_DETAIL;-- 重命名索引
ALTER INDEX WEWIN.IDX_REGION_CODE_G_PART RENAME TO IDX_REGION_CODE_G_PART_2;
ALTER INDEX WEWIN.IDX_INCOME_DATE_PART RENAME TO IDX_INCOME_DATE_PART_2;### 1.6 复核分区索引的有效性
```sql
COL index_name FOR A30
COL index_type FOR A10
COL partitioned FOR A10
COL locality FOR A10
COL alignment FOR A10
COL partitioning_type FOR A10 HEADING 'Part Type'
SELECT i.index_name, i.index_type, i.partitioned, p.locality, p.alignment, p.partitioning_type
FROM dba_indexes i
LEFT JOIN dba_part_indexes p ON i.index_name = p.index_name
WHERE i.table_name = 'MF_DETAIL';Index Name Type Partitione Locality Alignment Part Type
------------------------------ ---------- ---------- ---------- ---------- ----------
IDX_REGION_CODE_G_PART_2 NORMAL YES GLOBAL PREFIXED RANGE
IDX_INCOME_DATE_PART_2 NORMAL YES LOCAL PREFIXED RANGE
SYS_C005851 NORMAL NO-- 查询索引分区的信息
SELECT index_name, partition_name, status
FROM dba_ind_partitions
WHERE index_name IN (SELECT index_name FROM dba_indexes WHERE table_name = 'MF_DETAIL'
) order by 1,2;Index Name PARTITION_NAME STATUS
------------------------------ --------------- ---------------
IDX_INCOME_DATE_PART_2 P_INIT USABLE
IDX_INCOME_DATE_PART_2 SYS_P2505 USABLE
IDX_INCOME_DATE_PART_2 SYS_P2506 USABLE
IDX_INCOME_DATE_PART_2 SYS_P2507 USABLE
IDX_INCOME_DATE_PART_2 SYS_P2508 USABLE
IDX_INCOME_DATE_PART_2 SYS_P2509 USABLE
IDX_INCOME_DATE_PART_2 SYS_P2510 USABLE
IDX_INCOME_DATE_PART_2 SYS_P2511 USABLE
IDX_INCOME_DATE_PART_2 SYS_P2512 USABLE
IDX_INCOME_DATE_PART_2 SYS_P2513 USABLE
IDX_INCOME_DATE_PART_2 SYS_P2514 USABLE
IDX_INCOME_DATE_PART_2 SYS_P2515 USABLE
IDX_INCOME_DATE_PART_2 SYS_P2516 USABLE
IDX_INCOME_DATE_PART_2 SYS_P2517 USABLE
IDX_INCOME_DATE_PART_2 SYS_P2518 USABLE
IDX_INCOME_DATE_PART_2 SYS_P2519 USABLE
IDX_INCOME_DATE_PART_2 SYS_P2520 USABLE
IDX_INCOME_DATE_PART_2 SYS_P2521 USABLE
IDX_INCOME_DATE_PART_2 SYS_P2522 USABLE
IDX_INCOME_DATE_PART_2 SYS_P2523 USABLE
IDX_INCOME_DATE_PART_2 SYS_P2524 USABLE
IDX_INCOME_DATE_PART_2 SYS_P2525 USABLE
IDX_INCOME_DATE_PART_2 SYS_P2526 USABLE
IDX_INCOME_DATE_PART_2 SYS_P2527 USABLE
IDX_INCOME_DATE_PART_2 SYS_P2528 USABLE
IDX_REGION_CODE_G_PART_2 P_REGION_AM USABLE
IDX_REGION_CODE_G_PART_2 P_REGION_NZ USABLE27 rows selected.
– 检查分区索引中是否有 不可用的UNUSABLE
-- 查询某个用户下的有 UNUSABLE 不可用状态的分区索引
SELECT index_name, partition_name, status
FROM dba_ind_partitions
WHERE index_name IN (SELECT index_name FROM dba_indexes WHERE table_name = 'MF_DETAIL'
)
and status = 'UNUSABLE'
and index_owner='WEWIN'
order by 1,2;-- 查询某个用户下分区索引
set linesize 200
set pagesize 100
set trimout on
set trimspool on
col index_owner for a12
col index_name for a26
col partition_name for a22
SELECT index_name, partition_name, status
FROM dba_ind_partitions
WHERE index_name IN (SELECT index_name FROM dba_indexes WHERE table_name = 'MF_DETAIL')
order by 1,2;
扩展:检查某个用户的所有索引状态
set linesize 200
set pagesize 100
set trimout on
set trimspool on
col index_owner for a12
col index_name for a26
col partition_name for a22
SELECT index_owner,index_name,partition_name
FROM dba_ind_partitions
WHERE index_owner = 'WEWIN'
ORDER BY index_owner, index_name, partition_name;
WEWIN IDX_INCOME_DATE_PART_2 P_INIT
WEWIN IDX_INCOME_DATE_PART_2 SYS_P2505
WEWIN IDX_INCOME_DATE_PART_2 SYS_P2506
WEWIN IDX_INCOME_DATE_PART_2 SYS_P2507
WEWIN IDX_INCOME_DATE_PART_2 SYS_P2508
WEWIN IDX_INCOME_DATE_PART_2 SYS_P2509
WEWIN IDX_INCOME_DATE_PART_2 SYS_P2510
WEWIN IDX_INCOME_DATE_PART_2 SYS_P2511
WEWIN IDX_INCOME_DATE_PART_2 SYS_P2512
WEWIN IDX_INCOME_DATE_PART_2 SYS_P2513
WEWIN IDX_INCOME_DATE_PART_2 SYS_P2514
WEWIN IDX_INCOME_DATE_PART_2 SYS_P2515
WEWIN IDX_INCOME_DATE_PART_2 SYS_P2516
WEWIN IDX_INCOME_DATE_PART_2 SYS_P2517
WEWIN IDX_INCOME_DATE_PART_2 SYS_P2518
WEWIN IDX_INCOME_DATE_PART_2 SYS_P2519
WEWIN IDX_INCOME_DATE_PART_2 SYS_P2520
WEWIN IDX_INCOME_DATE_PART_2 SYS_P2521
WEWIN IDX_INCOME_DATE_PART_2 SYS_P2522
WEWIN IDX_INCOME_DATE_PART_2 SYS_P2523
WEWIN IDX_INCOME_DATE_PART_2 SYS_P2524
WEWIN IDX_INCOME_DATE_PART_2 SYS_P2525
WEWIN IDX_INCOME_DATE_PART_2 SYS_P2526
WEWIN IDX_INCOME_DATE_PART_2 SYS_P2527
WEWIN IDX_INCOME_DATE_PART_2 SYS_P2528
WEWIN IDX_REGION_CODE_G_PART_2 P_REGION_AM
WEWIN IDX_REGION_CODE_G_PART_2 P_REGION_NZ
结论
分区表的全局分区索引和本地分区索引都不会因为索引重命名而失效。
知识扩展
知识点1:
Oracle 19c中DBA_IND_PARTITIONS视图的STATUS字段有4种状态:
USABLE(可用)
UNUSABLE(不可用)
- 分区维护操作(SPLIT/MERGE/MOVE),直接路径加载(DIRECT PATH LOAD),索引分区被显式设置为UNUSABLE
INPROGRESS(进行中)
- 在线索引重建(REBUILD ONLINE),并行索引创建/重建
FAILED(失败)
- 索引重建过程中发生错误,存储空间不足导致重建失败,域索引操作失败
官方文档依据1. Oracle 19c Database Reference文档:“STATUS column of DBA_IND_PARTITIONS indicates whether the index partition is USABLE, UNUSABLE, INPROGRESS, or FAILED.”
知识点2
分区表上创建索引默认为LOCAL分区索引。
