Oracle 19C实测:重命名分区表后又重命名分区索引,分区索引会失效吗?DBA必看避坑指南!

问题描述

Oracle 19C 环境下将分区表重命名后,再将表上的分区索引重命名后,分区索引会失效吗?


**很多时候不能想当然的认为会还是不会!

毕竟都是生产环境,要测试后才算数!

客户看了你的测试记录,也敢在生产环境做变更。

本文提供一个思路:那就是任何运维场景都能用测试用例先模拟一次。**

模拟测试

测试环境:Oracle 19.3 单机

1. 创建测试数据

sql 复制代码
-- 创建分区表
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
SELECT
    ROWNUM 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 检查分区情况

sql 复制代码
-- 查看分区数量
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 创建索引

sql 复制代码
-- 创建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 检查索引有效性

sql 复制代码
-- 查询所有相关索引状态
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          USABLE

27 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 重命名分区表和分区索引

sql 复制代码
-- 重命名表
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     USABLE

27 rows selected.

-- 检查分区索引中是否有 不可用的UNUSABLE

sql 复制代码
-- 查询某个用户下的有 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;

扩展:检查某个用户的所有索引状态

sql 复制代码
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 19cDBA_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分区索引。

相关推荐
king_harry2 小时前
window server2008下Oracle 配置dblink查询 MySQL 数据
数据库·mysql·oracle·odbc·dblink
chde2Wang2 小时前
hbase启动报错-keeperErrorCode
大数据·数据库·hbase
清平乐的技术专栏2 小时前
HBase Shell常用命令
大数据·数据库·hbase
Zhen (Evan) Wang2 小时前
SQL Server Service Broker启用详解以及常见问题
数据库·sqlserver
马克学长2 小时前
SSM文创产品推荐系统设计与实现95ml5(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·ssm 框架·高校学生管理数字化·ssm 框架应用·商品分类与信息管理
hzk的学习笔记2 小时前
Redisson 的 Watchdog 机制
数据库·redis·分布式·缓存
罗光记2 小时前
夜晚的梦
数据库·其他·百度·新浪微博·segmentfault
韩立学长2 小时前
基于Springboot的智慧管网灌溉系统i1agupa7(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
一 乐2 小时前
高校教务|教务管理|基于springboot+vue的高校教务管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·教务管理