当前位置: 首页 > news >正文

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 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分区索引。

http://www.dtcms.com/a/581844.html

相关文章:

  • 网页设计网站建设流程平面设计师上的网站
  • 和网站用户体验相关的文章抖音代运营服务合同
  • 如何解决VMware虚拟机中Linux系统终端不显示ens33 inet IP地址的问题
  • 大酒店网站源代码信用信息公示网官网
  • 广告模板在哪个网站好自媒体seo是什么意思
  • 关于打不开pycharm的解决方法(一)
  • SQL RIGHT JOIN:深入解析及实例应用
  • 深圳附近建站公司网站建设工具公司
  • Fastapi 进阶二:Fastapi中间件
  • 力扣540. 有序数组中的单一元素
  • 无锡网站推广¥做下拉去118cr广告策划方案范例模板
  • 滑动窗口统计量构建从原始Tick到LSTM输入序列的数据转换框架
  • 农业网站建设的特点是大连开发区凯旋国际
  • 智能时代技术融合之道:大模型、微服务与数据安全的系统化实践
  • LeetCode 418 - 屏幕可显示句子的数量
  • 每日两题day36
  • LLM(大语言模型)
  • Solidity 与 x402 协议
  • 逆变器之SPWM调制
  • Java基础——常用算法5
  • Qt数据可视化实战:饼图、线图与表格的完整指南
  • qq代挂网站建设ps怎么做网站的广告条
  • 两个显示器鼠标方向调整
  • window server2008下Oracle 配置dblink查询 MySQL 数据
  • 软件数据库测试:【数据库质量保障:从单元测试到性能优化】
  • Windows安装Mujoco
  • vue3切换路由时页面空白问题解决办法
  • 时尚网站设计案例网站建设与网站主机的选择
  • 只买域名不建网站手机网站页面模板
  • Via安卓纯净版浏览器 v6.7.1去广解锁高级版