110-Oracle中核心业务的年度分区表建立

各位小伙伴,好久不见。前阵子忙于 XC 改造,期间陆续遇到了不少问题,如服务突然宕机、数据丢失等,后续会陆续整理发出。

今天是 2025 年最后一个工作日,照例需要对核心业务表进行年度分区调整,这些表读写频繁,且包含大量 LOB 字段。实际上,在医疗、制造等行业中,按月、按季度分区的情况也十分常见。

本次操作将针对同一 schema 下的所有核心业务主表,统一实施按年分区。

由于涉及业务主表,操作必须避开业务高峰,务必提前与业务方充分确认。在保障系统稳定与业务连续性的前提下,本次操作已纳入周密变更计划,并将由专业 DBA 执行,以确保安全、可控。

步骤1.查看表空间数据文件的存放地址

sql 复制代码
select tablespace_name, file_id, file_name, 
round(bytes/(1024*1024),0) total_space 
from dba_data_files 
wheretablespace_name like 'MDC%'
order by tablespace_name; 
1.1查看表空间使用量--如果不够,需要新增datafile表dbf文件
sql 复制代码
SELECT
dt.tablespace_name AS "表空间名",
dt.status AS "状态",
dt.contents AS "类型",
ROUND(tsu.tablespace_size * 8 / 1024 / 1024, 2) AS "总空间(GB)",
ROUND(tsu.used_space * 8 / 1024 / 1024, 2) AS "已用空间(GB)",
ROUND((tsu.tablespace_size - tsu.used_space) * 8 / 1024 / 1024, 2) AS "剩余空间(GB)",
ROUND(tsu.used_percent, 2) AS "使用率(%)",
(SELECT LISTAGG(file_name, ', ') WITHIN GROUP (ORDER BY file_id)
FROM dba_data_files df
WHERE df.tablespace_name = dt.tablespace_name) AS "数据文件位置"
FROM
dba_tablespace_usage_metrics tsu
JOIN
dba_tablespaces dt ON tsu.tablespace_name = dt.tablespace_name
WHERE
dt.tablespace_name NOT IN ('SYSTEM', 'SYSAUX') -- 按需条件过滤条件
ORDER BY
tsu.used_percent DESC;

步骤2.创建表空间MDC2026,作为2026年分区的表空间,截止日期为2027-01-01

注意:创建表空间,要注意服务器的存储路径和存储空间,是否单独创建的dbf等情况,

数据文件保存路径,尽量复制查询数据文件保存的路径,不要手工手抖修改。

不建议自动扩展,同样是为了提高磁盘IO;

PS:也可以增加表空间数据文件(如果发现空间不足),这个下一个话题讨论。

sql 复制代码
CREATE TABLESPACE mdc2026
DATAFILE '+DATA/PRODCDB/22682AEAEE3444ABE0630B00060A7456/DATAFILE/mdc202601.dbf' SIZE 4G
AUTOEXTEND OFF
LOGGING ONLINE
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
BLOCKSIZE 8 K SEGMENT SPACE MANAGEMENT AUTO FLASHBACK ON;

--新建后新增dbf
alter tablespace MDC2026 add datafile '+DATA/PRODCDB/22682AEAEE3444ABE0630B00060A7456/DATAFILE/mdc202602.dbf' size 4G ;
alter tablespace MDC2026 add datafile '+DATA/PRODCDB/22682AEAEE3444ABE0630B00060A7456/DATAFILE/mdc202603.dbf' size 4G ;
alter tablespace MDC2026 add datafile '+DATA/PRODCDB/22682AEAEE3444ABE0630B00060A7456/DATAFILE/mdc202604.dbf' size 4G ;

步骤3.生成分区脚本

按照OWNER查询出对应schema下的所有主要业务表,拼接自动分区的脚本

sql 复制代码
select 'ALTER TABLE ' || (tab_par.table_name)||
       'ADD PARTITION DATE2026' || ' VALUES LESS THAN (TO_DATE(' || '''' ||
      '2027-1-1' || '''' || ',' || '''' || 'YYYY-MM-DD' || '''' || ')) ' ||
      'TABLESPACE MDC2026 ;'
  from(select distinct table_name
         from dba_tab_partitions
        where table_owner = 'HIT_MDC') tab_par;

步骤4.执行分区脚本并校验

直接复制查询出来的语句,执行

sql 复制代码
ALTER TABLE MDC_HIGH_GRADE_TASKADD PARTITION DATE2026 VALUES LESS THAN (TO_DATE('2027-1-1','YYYY-MM-DD')) TABLESPACE MDC2026 ;
ALTER TABLE MDC_RCD_OUT_RECORD_ITEMADD PARTITION DATE2026 VALUES LESS THAN (TO_DATE('2027-1-1','YYYY-MM-DD')) TABLESPACE MDC2026 ;
ALTER TABLE MDC_RCD_OUT_RESULT_ITEMADD PARTITION DATE2026 VALUES LESS THAN (TO_DATE('2027-1-1','YYYY-MM-DD')) TABLESPACE MDC2026 ;
ALTER TABLE MDC_RCD_IN_RECORD_DATAADD PARTITION DATE2026 VALUES LESS THAN (TO_DATE('2027-1-1','YYYY-MM-DD')) TABLESPACE MDC2026 ;
ALTER TABLE MDC_RCD_OUT_RECORD_ITEM2ADD PARTITION DATE2026 VALUES LESS THAN (TO_DATE('2027-1-1','YYYY-MM-DD')) TABLESPACE MDC2026 ;
ALTER TABLE MDC_SR_DATAADD PARTITION DATE2026 VALUES LESS THAN (TO_DATE('2027-1-1','YYYY-MM-DD')) TABLESPACE MDC2026 ;
ALTER TABLE MDC_MEDI_PATIENT_SIGN_RECORDADD PARTITION DATE2026 VALUES LESS THAN (TO_DATE('2027-1-1','YYYY-MM-DD')) TABLESPACE MDC2026 ;
ALTER TABLE MDC_RCD_IN_RECORD_ITEMADD PARTITION DATE2026 VALUES LESS THAN (TO_DATE('2027-1-1','YYYY-MM-DD')) TABLESPACE MDC2026 ;
ALTER TABLE MDC_RCD_IN_SERIES_HEADERADD PARTITION DATE2026 VALUES LESS THAN (TO_DATE('2027-1-1','YYYY-MM-DD')) TABLESPACE MDC2026 ;
ALTER TABLE MDC_RCD_IN_RECORDADD PARTITION DATE2026 VALUES LESS THAN (TO_DATE('2027-1-1','YYYY-MM-DD')) TABLESPACE MDC2026 ;
ALTER TABLE MDC_RCD_OUT_RECORD_LOGADD PARTITION DATE2026 VALUES LESS THAN (TO_DATE('2027-1-1','YYYY-MM-DD')) TABLESPACE MDC2026 ;
ALTER TABLE MDC_RCD_PATIENT_SIGNADD PARTITION DATE2026 VALUES LESS THAN (TO_DATE('2027-1-1','YYYY-MM-DD')) TABLESPACE MDC2026 ;
ALTER TABLE MDC_RCD_IN_RESULT_ITEMADD PARTITION DATE2026 VALUES LESS THAN (TO_DATE('2027-1-1','YYYY-MM-DD')) TABLESPACE MDC2026 ;
ALTER TABLE MDC_RECORD_FILEADD PARTITION DATE2026 VALUES LESS THAN (TO_DATE('2027-1-1','YYYY-MM-DD')) TABLESPACE MDC2026 ;
ALTER TABLE MDC_RCD_OUT_RECORD_DATAADD PARTITION DATE2026 VALUES LESS THAN (TO_DATE('2027-1-1','YYYY-MM-DD')) TABLESPACE MDC2026 ;
ALTER TABLE MDC_RCD_CA_SIGNADD PARTITION DATE2026 VALUES LESS THAN (TO_DATE('2027-1-1','YYYY-MM-DD')) TABLESPACE MDC2026 ;

步骤5.查询从前是否存在分区并校验新建分区是否存在

关于分区表的使用和优化,留下疑问,下次填坑:

1、分区表空间的规划,按照时间间隔进行分区, 是在原有的schema的原有表空间新增 DBF 文件,还是新建表空间且同时创建 DBF 文件,将间隔分区存入新的表空间的新dbf中,最佳实践是什么呢

2、如果分区表已经创建,统计信息未正常更新,对实际使用的影响。

相关推荐
Coder_Boy_4 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
helloworldandy4 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
数据知道6 小时前
PostgreSQL 故障排查:如何找出数据库中最耗时的 SQL 语句
数据库·sql·postgresql
qq_12498707536 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
枷锁—sha6 小时前
【SRC】SQL注入WAF 绕过应对策略(二)
网络·数据库·python·sql·安全·网络安全
Coder_Boy_6 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Gain_chance6 小时前
35-学习笔记尚硅谷数仓搭建-DWS层最近n日汇总表及历史至今汇总表建表语句
数据库·数据仓库·hive·笔记·学习
此生只爱蛋7 小时前
【Redis】主从复制
数据库·redis
马猴烧酒.7 小时前
【面试八股|JAVA多线程】JAVA多线程常考面试题详解
java·服务器·数据库
天天爱吃肉82188 小时前
跟着创意天才周杰伦学新能源汽车研发测试!3年从工程师到领域专家的成长秘籍!
数据库·python·算法·分类·汽车