分享一个Oracle表空间自动扩容与清理脚本

news/2025/10/31 17:51:29/文章来源:https://www.cnblogs.com/liuziyi1/p/19180852

分享一个Oracle表空间自动扩容与清理脚本

一、基础环境准备(首次执行)

-- 1. 创建表空间监控表(存储使用率、容量等信息)
create table monitor_tablespace_rate (tbs_name varchar2(50),        -- 表空间名total_gb number,              -- 总容量(GB)used_gb number,               -- 已使用(GB)free_gb number,               -- 剩余空间(GB)rate number,                  -- 使用率(%)maxextend_gb number,          -- 最大可扩展容量(GB)last_check_time date default sysdate  -- 最后检查时间
);
comment on table monitor_tablespace_rate is '表空间使用率监控表';-- 2. 创建审计日志清理记录表(跟踪清理操作)
create table audit_clean_log (clean_time date default sysdate,  -- 清理时间aud_size_before number,           -- 清理前AUD$表大小(GB)aud_size_after number,            -- 清理后AUD$表大小(GB)clean_result varchar2(100)        -- 清理结果
);
comment on table audit_clean_log is 'AUD$表清理日志';-- 3. 创建AWR快照清理记录表
create table awr_clean_log (clean_time date default sysdate,  -- 清理时间dbid number,                      -- 数据库IDmin_snap_id number,               -- 清理的最小快照IDmax_snap_id number,               -- 清理的最大快照IDclean_count number,               -- 清理的快照数量clean_result varchar2(100)        -- 清理结果
);
comment on table awr_clean_log is 'AWR快照清理日志';

二、核心存储过程(自动扩容+清理)

-- 创建存储过程:自动扩容表空间+清理审计日志及AWR快照
create or replace procedure proc_tbs_auto_manage
as-- 扩容相关变量v_tbs_name varchar2(50);v_rate number;v_file_name varchar2(200);v_new_file_name varchar2(200);v_file_num number;v_sql varchar2(500);-- 清理相关变量v_aud_size_before number;  -- AUD$表清理前大小(GB)v_aud_size_after number;   -- 清理后大小(GB)v_dbid number;             -- 数据库IDv_min_snap_id number;      -- 最小快照IDv_max_snap_id number;      -- 最大快照IDv_snap_count number;       -- 快照数量
begin-- ---------------------------- 步骤1:更新表空间监控数据-- --------------------------truncate table monitor_tablespace_rate;insert into monitor_tablespace_rate(tbs_name, total_gb, used_gb, free_gb, rate, maxextend_gb)select d.tablespace_name as tbs_name,round(d.tot_gb, 2) as total_gb,round(d.tot_gb - f.free_gb, 2) as used_gb,round(f.free_gb, 2) as free_gb,round((d.tot_gb - f.free_gb)/d.max_gb * 100, 2) as rate,  -- 使用率(%)round(d.max_gb, 2) as maxextend_gbfrom (-- 表空间总容量及最大可扩展容量select tablespace_name,sum(bytes)/(1024*1024*1024) as tot_gb,  -- 总容量(GB)sum(decode(maxbytes, 0, bytes, maxbytes))/(1024*1024*1024) as max_gb  -- 最大可扩展容量from dba_data_files group by tablespace_name) dleft join (-- 表空间剩余空间select tablespace_name,sum(bytes)/(1024*1024*1024) as free_gb  -- 剩余空间(GB)from dba_free_space group by tablespace_name) f on d.tablespace_name = f.tablespace_namewhere d.tablespace_name not like '%UNDO%'  -- 排除UNDO表空间and d.tablespace_name not like '%TEMP%';  -- 排除临时表空间-- ---------------------------- 步骤2:自动扩容表空间(使用率>85%时)-- --------------------------for tbs in (select tbs_name, rate from monitor_tablespace_rate where rate > 85) loopv_tbs_name := tbs.tbs_name;v_rate := tbs.rate;-- 获取该表空间现有数据文件信息(用于生成新文件名)select max(file_id), max(file_name) into v_file_num, v_file_name from dba_data_files where tablespace_name = v_tbs_name;-- 生成新数据文件路径(在原路径后加序号,如原路径/data/ts1.dbf→/data/ts1_2.dbf)v_file_num := v_file_num + 1;v_new_file_name := substr(v_file_name, 1, instr(v_file_name, '.', -1)) || v_file_num || '.dbf';-- 执行扩容:新增1GB数据文件,开启自动扩展v_sql := 'alter tablespace ' || v_tbs_name || ' add datafile ''' || v_new_file_name || '''' || ' size 1G autoextend on next 500M maxsize unlimited';execute immediate v_sql;-- 输出日志dbms_output.put_line('['||to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')||'] '||v_tbs_name||' 扩容成功,新增文件:'||v_new_file_name);end loop;-- ---------------------------- 步骤3:清理SYSTEM表空间AUD$审计表(大小>5GB时)-- ---------------------------- 检查AUD$表当前大小(GB)select nvl(sum(bytes)/(1024*1024*1024), 0) into v_aud_size_before from dba_segments where segment_name = 'AUD$' and owner = 'SYS';if v_aud_size_before > 5 then  -- 阈值:超过5GB则清理-- 11g+推荐使用DBMS_AUDIT_MGMT清理(避免直接TRUNCATE)begin-- 初始化清理(若未初始化)dbms_audit_mgmt.init_cleanup(audit_trail_type => dbms_audit_mgmt.audit_trail_aud_std,default_cleanup_interval => 24);-- 执行清理dbms_audit_mgmt.clean_audit_trail(audit_trail_type => dbms_audit_mgmt.audit_trail_aud_std,use_last_arch_timestamp => false);-- 记录清理后大小select nvl(sum(bytes)/(1024*1024*1024), 0) into v_aud_size_after from dba_segments where segment_name = 'AUD$' and owner = 'SYS';-- 写入清理日志insert into audit_clean_log(aud_size_before, aud_size_after, clean_result)values(v_aud_size_before, v_aud_size_after, '清理成功');dbms_output.put_line('['||to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')||'] AUD$表清理完成,清理前:'||v_aud_size_before||'GB,清理后:'||v_aud_size_after||'GB');exceptionwhen others theninsert into audit_clean_log(aud_size_before, aud_size_after, clean_result)values(v_aud_size_before, 0, '清理失败:'||sqlerrm);dbms_output.put_line('['||to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')||'] AUD$表清理失败:'||sqlerrm);end;end if;-- ---------------------------- 步骤4:清理SYSAUX表空间AWR快照(保留最近7天,删除更早的)-- ---------------------------- 获取数据库IDselect dbid into v_dbid from v$database;-- 获取7天前的快照ID范围select min(snap_id), max(snap_id), count(1) into v_min_snap_id, v_max_snap_id, v_snap_countfrom dba_hist_snapshot where dbid = v_dbid and end_interval_time < sysdate - 7;  -- 保留最近7天if v_snap_count > 0 then  -- 存在需清理的快照begin-- 删除指定范围的AWR快照dbms_workload_repository.drop_snapshot_range(low_snap_id => v_min_snap_id,high_snap_id => v_max_snap_id,dbid => v_dbid);-- 写入清理日志insert into awr_clean_log(dbid, min_snap_id, max_snap_id, clean_count, clean_result)values(v_dbid, v_min_snap_id, v_max_snap_id, v_snap_count, '清理成功');dbms_output.put_line('['||to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')||'] AWR快照清理完成,共清理'||v_snap_count||'个快照(ID范围:'||v_min_snap_id||'-'||v_max_snap_id||')');exceptionwhen others theninsert into awr_clean_log(dbid, min_snap_id, max_snap_id, clean_count, clean_result)values(v_dbid, v_min_snap_id, v_max_snap_id, v_snap_count, '清理失败:'||sqlerrm);dbms_output.put_line('['||to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')||'] AWR快照清理失败:'||sqlerrm);end;end if;commit;
end;
/

三、定时任务配置(自动化执行)

-- 1. 创建定时任务:每小时执行一次存储过程
variable jobno number;
begindbms_job.submit(job => :jobno,what => 'proc_tbs_auto_manage;',  -- 执行的存储过程next_date => sysdate,  -- 首次执行时间:立即执行interval => 'sysdate + 1/24'  -- 执行频率:每小时一次);commit;
end;
/-- 2. 查看定时任务状态(记录Job号,用于后续管理)
select job, next_date, next_sec, failures, broken 
from user_jobs 
where what = 'proc_tbs_auto_manage;';-- 示例输出(Job号为123):
-- JOB        NEXT_DATE          NEXT_SEC      FAILURES B
-- ---------- ------------------ ------------- ---------- -
-- 123        2024-08-16 15:30:00 15:30:00      0          N-- 3. 手动执行任务(测试用)
begindbms_job.run(123);  -- 替换为实际Job号commit;
end;
/-- 4. 暂停定时任务
begindbms_job.broken(123, true);  -- 替换为实际Job号commit;
end;
/-- 5. 重启定时任务
begindbms_job.broken(123, false);  -- 替换为实际Job号dbms_job.run(123);commit;
end;
/-- 6. 删除定时任务(如需停用)
begindbms_job.remove(123);  -- 替换为实际Job号commit;
end;
/

四、脚本说明与扩展建议

  1. 功能说明

    • 自动监控表空间使用率,当使用率超过85%时,自动新增1GB数据文件并开启自动扩展;
    • 定期清理SYSTEM表空间中超过5GB的AUD$审计表(11g+安全清理);
    • 定期清理SYSAUX表空间中超过7天的AWR快照,保留近期性能数据。
  2. 扩展建议

    • 根据实际环境调整阈值(如扩容阈值85%、AUD$清理阈值5GB、AWR保留7天);
    • 新增邮件告警功能(通过UTL_MAIL),在扩容或清理失败时通知管理员;
    • 对临时表空间(TEMP)单独添加监控与扩容逻辑(参考数据文件逻辑,使用dba_temp_files);
    • 定期备份清理日志表(audit_clean_log、awr_clean_log),避免日志表过大。
  3. 注意事项

    • 执行脚本需SYSDBA权限;
    • 新增数据文件路径需确保数据库用户有写入权限;
    • 清理操作前建议备份关键数据(如AUD$表、AWR快照)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/952068.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

精密封装,“芯”系未来:哲讯科技SAP解决方案引领芯片封装产业智造升级

精密封装,“芯”系未来:哲讯科技SAP解决方案引领芯片封装产业智造升级当今芯片已成为全球科技竞争的制高点。作为芯片制造至关重要的后端环节——芯片封装,其地位正从传统的“保护与连接”向“功能集成与性能提升”…

2025年市场上卷饼机厂家排行榜:权威推荐与选择指南

摘要 随着2025年食品机械市场的快速发展,卷饼机行业迎来技术革新和需求增长,厂家竞争日益激烈。本文基于行业数据和用户反馈,为您呈现2025年市场上卷饼机厂家的前十名推荐榜单,并提供详细表单供参考,帮助用户高效…

2025年市场上​ 烤鸭饼机工厂推荐榜:揭秘行业领先的烤鸭饼机制造商选择指南

摘要 2025年烤鸭饼机行业预计将持续增长,受餐饮自动化和全球化趋势驱动,设备需求聚焦于高效、智能和定制化解决方案。本榜单基于市场调研、用户反馈和技术评估,为食品加工企业提供参考表单,帮助选择可靠的烤鸭饼机…

2025年市场上烙馍机生产厂家推荐:深度解析领先企业与技术创新

摘要 2025年烙馍机行业预计将迎来快速增长,受餐饮自动化和健康饮食趋势驱动,市场规模有望扩大15%以上。技术创新聚焦于智能化、节能环保和定制化生产。本文基于行业数据和用户反馈,整理出排名前十的烙馍机厂家推荐榜…

关于taichislam生成拓扑图过于密集

我想用这个项目来构建一个拓扑地图,然而最后得到的效果并不好,生成的拓扑图很密集,并且连接过于密集,我想知道是否我的设置出了问题,从而导致了这样的结果,期待得到回复这与文章中的较为稀疏的拓扑地图并不相同

Python文件路径 _ 文件在哪里,代码咋知道

Python文件路径 _ 文件在哪里,代码咋知道复制绝对路径

《代码大全2》-----1

《代码大全2》最核心的价值,在于它将编程从“编写代码”提升到了“软件构建”的高度。这不仅仅是语义的差别,而是根本性的思维转变。“码农”埋头实现功能,而“建筑师”会先审视蓝图。这本书就是那份最全面的蓝图。…

递延所得税、所得税费用执行《小企业会计准则》、《企业会计准则》

递延所得税、所得税费用执行《小企业会计准则》、《企业会计准则》去年(24年)亏损(利润总额)80万元,今年盈利100万元,税率25%账务处理;《小企业会计准则》24年,确认所得税费用 无; 净利润-80万元; 借:利润分…

【脚本】一键完成MySQL任意版本的安装部署

【脚本】一键完成MySQL任意版本的安装部署#!/bin/bash set -euo pipefail exec > >(tee -i mysql_install.log) exec 2>&1echo "-----------------------------开始MYSQL安装----------------------…

关于反外挂

红护滚出去。其实藤子在这方面做的已经很好了,应该说算是世界独一家的,包括和各大硬件厂商比如英特尔之类的合作,线下真实,你去看市面上其他 FPS 哪个能做到这一步的?至于洲的外挂猖獗,大概几个点。 对局外挂多很…

10/31

今日无事发生,万圣节快乐

GreenPlum - How to change column type?

GreenPlum - How to change column type?在 Greenplum(基于 PostgreSQL)中,可以使用 ALTER TABLE ... ALTER COLUMN ... TYPE 来修改表中字段的类型。 下面是详细说明和常见示例 👇🧩 基本语法ALTER TABLE 表名…

The Motor Car 2

全文原句: A 1993 study by the European Federation for Transport and Environment found that car transport is seven times as costly as rail travel in terms of the external social costs it entails — con…

elasticseach集群添加prometheus监控

elastic集群监控配置 我的集群是普通的版本 并不是pod 因为业务量不稳定时高时低 配置越复杂维护程度越高,企业招聘就越难。 并没有去grafana上去配置数据源信息 图形界面之类的东西 我们的目的是想给这个在以前的…

智驭增长,睿见未来:哲讯科技,以SAP Business One铸就成长型企业的数字脊梁

在当今这个瞬息万变的商业世界里,每一个雄心勃勃的成长型企业都面临着同样的核心课题:如何在混乱的数据中建立秩序?如何在繁杂的业务中洞察本质?又如何在不确性的市场中预见未来?答案,已然清晰——数字化转型已非…

2025年叠步楼梯公司排名前十推荐:选购指南与行业洞察

摘要 叠步楼梯作为一种解构主义设计元素,近年来在建筑和室内设计行业中迅速崛起,通过错位或重叠的设计创造出动态视觉效果,不仅提升空间美感,还巧妙利用下方空间实现多功能区域。行业数据显示,2025年全球定制楼梯…

【干货】一键生成MySQL配置文件

【干货】一键生成MySQL配置文件关键代码如下: <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="…

系统运维面试题

基础 选择6块1T硬盘做完raid50后,可供使用内存有多大? 解析: raid50备份方案为两组RAID5组成RAID0,做raid 5阵列所有磁盘容量必须一样大,当容量不同时,会以最小的容量为准。 最好硬盘转速一样,否则会影响性能,而…

2025 年隔音门厂家最新推荐榜,技术实力与市场口碑深度解析,精选适配多场景的优质品牌

据建筑装饰协会 2024 年度声学建材测评报告显示,国内隔音门市场合格率仅为 78.3%,超两成产品存在隔音量不达标、密封性能差等问题。为帮助消费者与企业精准筛选优质产品,本次推荐榜以 “技术参数 + 实际应用 + 售后…

ELK日志收集分析工具解析

@目录1、工作当中日志的重要性2、日志收集的工具有那些Solr与es的对比与选型ElasticSearch vs Solr总结3、elk简单介绍4、倒排查询原理5、数据的分类6、es用户场景Elasticsearch简介7、部署es的方法8、和es交互的方式8…