各位小伙伴,好久不见。前阵子忙于 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、如果分区表已经创建,统计信息未正常更新,对实际使用的影响。