重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 666|回复: 0
打印 上一主题 下一主题

[Oracle] Oracle数据库空间深度回收

[复制链接]
跳转到指定楼层
楼主
发表于 2025-8-24 21:32:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、空间占用深度诊断
1. 表空间使用分析
SELECT TABLESPACE_NAME, FILE_NAME,
       BYTES/1024/1024 AS SIZE_MB,
       (BYTES - (SELECT SUM(BYTES)
        FROM DBA_FREE_SPACE
        WHERE FILE_ID = df.FILE_ID))/1024/1024 AS USED_MB
FROM DBA_DATA_FILES df
ORDER BY SIZE_MB DESC;

关键指标:

• SIZE_MB
:数据文件总大小
• USED_MB
:实际使用空间
• 收缩条件:(SIZE_MB - USED_MB) > 总空间30%
且非系统表空间
2. 高水位线(HWM)检测
SELECT blocks, empty_blocks, num_rows
FROM user_tables
WHERE table_name = 'YOUR_TABLE';

HWM核心特性:

• INSERT操作推高HWM,DELETE不降低
• 全表扫描会读取HWM下所有块(含空块)
• TRUNCATE可重置HWM至0
注:Oracle 11g+推荐使用DBMS_STATS
收集统计信息,但HWM分析仍需ANALYZE TABLE

二、空间回收关键技术
1. 数据清理策略
对象类型
操作方案
优势
分区表
TRUNCATE PARTITION
秒级清理,立即释放空间
非分区大表
DELETE
+ COMMIT
(分批提交)
避免长事务锁表
索引碎片
ALTER INDEX ... REBUILD ONLINE;
在线操作,减少业务中断
2. HWM优化四大方案
方案对比:

技术
锁级别
空间需求
索引维护
适用场景
SHRINK SPACE
X (表级短锁)
无需额外空间
需手动/CASCADE
ASSM表空间
MOVE
X (长锁)
2倍表空间
需重建索引
非ASSM表空间
CTAS
DDL锁
2倍表空间
需重建
中小表迁移
DEALLOCATE
RX (行锁)

无需
回收未使用空间
操作示例:

-- SHRINK方案(需ASSM)
ALTER TABLE sales ENABLE ROW MOVEMENT;
ALTER TABLE sales SHRINK SPACE CASCADE;

-- MOVE方案(通用)
ALTER TABLE orders MOVE TABLESPACE users NOLOGGING PARALLEL 4;
ALTER INDEX orders_pk REBUILD PARALLEL 4;

3. 数据文件直接收缩
ALTER DATABASE DATAFILE '/oradata/users01.dbf' RESIZE 1024M;

注意事项:

• 目标尺寸 > 已用空间 + 10%(防ORA-03297)
• 收缩后需检查文件系统剩余空间
三、存储配置优化
1. 表空间智能配置
CREATE TABLESPACE app_data
  DATAFILE '/oradata/app01.dbf' SIZE 100M
  AUTOEXTEND ON NEXT 10M MAXSIZE 1G;

策略:小初始值 + 适度自动扩展,避免预分配闲置

2. 数据压缩技术
ALTER TABLE historical_data COMPRESS FOR OLTP;

压缩效率:

• 基础压缩(BASIC):2-4倍
• OLTP压缩:1.5-3倍
• 列式压缩(HCC):10倍+(Exadata专属)
四、自动化运维体系
1. 空间回收脚本
BEGIN
  FOR rec IN (SELECT file_id, file_name
              FROM dba_data_files
              WHERE tablespace_name='USERS')
  LOOP
    EXECUTE IMMEDIATE 'ALTER DATABASE DATAFILE '''||rec.file_name||''' RESIZE '||
                      ( (rec.bytes/1048576) - 100 ) ||'M';
  END LOOP;
END;

2. 空间监控预警
SELECT tablespace_name,
       ROUND(1 - (free_space / total_space), 2) * 100 AS used_pct
FROM (
  SELECT tablespace_name,
         SUM(bytes) total_space,
         SUM(NVL(bytes_free,0)) free_space
  FROM dba_free_space
  GROUP BY tablespace_name
) WHERE used_pct > 85; -- 设置85%阈值告警

最佳实践总结
1. 诊断先行:每月运行空间分析脚本,识别TOP10空间对象
2. 分层清理:
• 分区表:定期TRUNCATE旧分区
• 非分区表:SHRINK SPACE COMPACT(高峰)+ SHRINK SPACE(低谷)
3. 配置优化:启用OLTP压缩 + AUTOEXTEND增量扩展
4. 监控兜底:设置表空间使用率短信告警(阈值85%/95%)
关键提醒:生产环境大表操作需在维护窗口进行,SHRINK/MOVE可能引发统计信息失效,操作后需执行DBMS_STATS.GATHER_TABLE_STATS

通过系统化的空间诊断、精准的HWM优化及智能存储配置,可有效控制Oracle存储膨胀,显著降低备份成本,保障数据库高效运行。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2026-4-17 21:22 , Processed in 0.268018 second(s), 20 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表