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、如果分区表已经创建,统计信息未正常更新,对实际使用的影响。

相关推荐
倔强的石头_1 天前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou642 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤3 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
爱可生开源社区4 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1774 天前
《从零搭建NestJS项目》
数据库·typescript
加号35 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏5 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐5 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再5 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip
tryCbest5 天前
数据库SQL学习
数据库·sql