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

相关推荐
李兆龙的博客10 小时前
问津集 #26:Lakebase——Postgres 的版本化页面存储、数据库分支与计算弹性
数据库
倔强的石头_12 小时前
聊聊金仓KFS:一款把数据同步软件做扎实的产品
数据库
闲云野鹤在人间12 小时前
MySQL|从理论、安装、备份到主从复制、MHA高可用详解
linux·运维·数据库·mysql·云计算
禾小西12 小时前
Redis:从两大维度和三大主线建立知识体系
数据库·redis·缓存
禾小西13 小时前
Redis 数据结构:快速的 Redis 有哪些慢操作?
数据结构·数据库·redis
数据库小学妹13 小时前
数据共享交换平台选型:交换方式对比与避坑指南
数据库·信创·数据同步·数据交换平台·政务数据共享·数据共享交换平台·数据库底座
loong_XL15 小时前
决策模型做内容安全检测:从踩坑到上线
数据库·安全·jev·决策模型
这个DBA有点耶15 小时前
数据库双轨并行实战:全量并行策略、增量延迟控制、双向回切与一致性校验
数据库·架构·dba
adinnet202616 小时前
保单、赔付与渠道问数:保险经营数据如何实现按需查询
大数据·数据库·人工智能
云贝贝贝16 小时前
PostgreSQL 分区表:从设计到运维,大表不再卡
运维·数据库·postgresql