分享一個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.pswp.cn/web/93348.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/93348.shtml
英文地址,請注明出處:http://en.pswp.cn/web/93348.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Flink Sql 按分鐘或日期統計數據量

一、環境版本 環境版本Flink1.17.0Kafka2.12MySQL5.7.33 【注意】Flink 1.13版本增加Cumulate Window&#xff0c;之前版本Flink Sql 沒有 Trigger 功能&#xff0c;長時間的窗口不能在中途觸發計算&#xff0c;輸出中間結果。比如每 10S 更新一次截止到當前的pv、uv。只能用T…

LeetCode 2460.對數組執行操作

給你一個下標從 0 開始的數組 nums &#xff0c;數組大小為 n &#xff0c;且由 非負 整數組成。 你需要對數組執行 n - 1 步操作&#xff0c;其中第 i 步操作&#xff08;從 0 開始計數&#xff09;要求對 nums 中第 i 個元素執行下述指令&#xff1a; 如果 nums[i] nums[i …

深入解析 @nestjs/typeorm的 forRoot 與 forFeature

nestjs/typeorm 是 NestJS 與 TypeORM 集成的官方模塊&#xff0c;提供了 forRoot() 和 forFeature() 兩個核心靜態方法用于配置數據庫連接和實體注冊。本文將深入解析這兩個方法的機制、使用場景和最佳實踐。 一、TypeOrmModule.forRoot() - 全局數據庫配置 forRoot() 方法用于…

關于simplifyweibo_4_moods數據集的分類問題

本來打算用情感分類數據集拿Transformer模型來練練手&#xff0c;發現訓練效果并不好。當我分析了這個數據集的標簽后發現問題了&#xff1a; 查看標簽的分布&#xff1a; import pandas as pd# 先直接讀取數據&#xff0c;不進行后續處理 data_file ~/data/simplifyweibo_4_m…

Custom SRP - Baked Light

https://catlikecoding.com/unity/tutorials/custom-srp/baked-light/本篇教程介紹將靜態光照烘焙到 light map 和 light prob 中.首先貼上我遇到的問題,希望遇到的同學幫忙解答:實踐本教程過程中,定義的 MetaPass 沒有效果, Unity 始終在使用默認的 meta pass,我使用的是 unit…

[Python]PTA:實驗2-3-1-for 求1到100的和

本題要求編寫程序&#xff0c;計算表達式 1 2 3 ... 100 的值。輸入格式&#xff1a;本題無輸入。輸出格式&#xff1a;按照以下格式輸出&#xff1a;sum 累加和代碼如下&#xff1a;x0 for i in range(1,101,1):xi print("sum {}".format(x))

【解決筆記】MyBatis-Plus 中無 selectList 方法

MyBatis-Plus 中無 selectList 方法的解決筆記 核心前提 MyBatis-Plus 的 BaseMapper 接口內置了 selectList 等基礎查詢方法&#xff0c;繼承該接口可直接使用&#xff0c;無需手動實現。 無 selectList 方法的兩種情況及解決方式 1. 未繼承 BaseMapper&#xff08;推薦方案&a…

一周學會Matplotlib3 Python 數據可視化-繪制箱線圖(Box)

鋒哥原創的Matplotlib3 Python數據可視化視頻教程&#xff1a; 2026版 Matplotlib3 Python 數據可視化 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 課程介紹 本課程講解利用python進行數據可視化 科研繪圖-Matplotlib&#xff0c;學習Matplotlib圖形參數基本設置&…

4.4 vue3生命周期函數

vue3生命周期函數生命周期鉤子名稱對比表階段Vue 2 選項式 APIVue 3 組合式 API說明創建前beforeCreateonBeforeCreate&#xff08;已廢棄&#xff09;Vue 3 中 setup() 替代創建完成createdsetup()&#xff08;替代&#xff09;setup 是入口&#xff0c;代替 beforeCreate 和 …

無腦整合springboot2.7+nacos2.2.3+dubbo3.2.9實現遠程調用及配置中心

簡介&#xff1a; 好久沒有寫博客了&#xff0c;最近辭職了有時間進行一次分享&#xff0c;今天我們主要是使用單體服務springboot整合nacos實現配置中心&#xff0c;然后整合dubbo來實現遠程的rpc調用。如下是本地案例架構圖&#xff0c;生產者和消費者的配置在nacos配置中心上…

騰訊位置商業授權微信小程序逆地址解析(坐標位置描述)

微信小程序JavaScript SDK 開發指南 逆地址解析(坐標位置描述) reverseGeocoder(options:Object) 本接口提供由坐標到坐標所在位置的文字描述的轉換&#xff0c;輸入坐標返回地理位置信息和附近poi列表。 注&#xff1a;坐標系采用gcj02坐標系 options屬性說明 屬性類型必填…

3D商品展示:技術狂歡下的普及困局

當微軟推出Copilot 3D——僅需一張照片即可生成可編輯的3D模型時&#xff0c;業界曾歡呼“建模門檻徹底消失”。然而技術的美好愿景卻撞上現實的銅墻鐵壁&#xff1a;當前電商平臺3D商品加載卡頓導致用戶跳出率超60%&#xff0c;企業3D化滲透率仍不足34%。絢爛的技術煙花下&…

(Arxiv-2025)Stand-In:一種輕量化、即插即用的身份控制方法用于視頻生成

Stand-In&#xff1a;一種輕量化、即插即用的身份控制方法用于視頻生成 paper是WeChat發布在Arxiv 2025的工作 paper title:Stand-In: A Lightweight and Plug-and-Play Identity Control for Video Generation Code&#xff1a;鏈接 圖1&#xff1a;給定一張參考圖像&#xff…

數據科學與爬蟲技術學習筆記

數據科學與爬蟲技術學習筆記 一、數據科學基礎庫 1. NumPy&#xff1a;數值計算的基石 NumPy 是 Python 科學計算的核心庫&#xff0c;專為數組和矩陣操作設計&#xff0c;能大幅簡化循環操作&#xff0c;提供豐富的數學函數。 核心優勢&#xff1a;高效處理同類型元素的多維…

學習嵌入式之硬件——I2C

一、I2C1.定義內部集成電路的簡稱&#xff0c;半雙工串行同步通信&#xff0c;是芯片和芯片之間的通信方式&#xff1b;通常只有一個主機&#xff0c;多個從機&#xff0c;采用主從應答的方式上圖所示是IIC的總線的使用場景&#xff0c;所有掛載在IIC總線上的設備都有兩根信號線…

使用websockt

封裝websocktHooksimport { ref, onMounted, onUnmounted } from vue;/*** webSocket的Hooks* param {string} websocket鏈接地址* */ export function useWebSocket(url: string) {// 核心狀態 const data: Ref<any> ref(null);//收到websocket返回的數據const socke…

Jmeter自定義腳本

目錄 log&#xff1a;輸出類 Label&#xff1a;你自定義的組件的名稱 FileName&#xff1a;添加的腳本文件的文件名 Parameters&#xff1a;你傳入的參數&#xff0c;是一個字符串 args&#xff1a;你傳入的參數&#xff0c;是一個數組 Parameters和args的異同&#xff1…

飛算 JavaAI 電商零售場景實踐:從訂單峰值到供應鏈協同的全鏈路技術革新

目錄 一、電商核心場景的技術攻堅 1.1 分布式訂單系統的事務一致性設計 1.1.1 TCC 模式下的訂單創建流程 1.1.2 訂單狀態機的可靠流轉 1.2 高并發秒殺系統的架構設計 1.2.1 多級限流與流量削峰 1.2.2 庫存防超賣機制 1.3 智能推薦與用戶行為分析 1.3.1 用戶行為實時采…

51單片機-51單片機介紹

51單片機介紹單片機簡介什么是單片機呢&#xff1f;單片機是一種集成電路芯片&#xff0c;采用超大規模集成電路技術將中央處理器&#xff08;CPU&#xff09;、隨機存儲器&#xff08;RAM&#xff09;、只讀存儲器&#xff08;ROM&#xff09;、多種I/O口、中斷系統、定時器/計…

8月AI面試工具測評:破解規模化招聘難題

金秋校招臨近&#xff0c;企業面臨“百萬簡歷涌入VS面試官團隊告急”的典型困境。傳統線下面試效率低下、標準參差&#xff0c;難以應對短時間內爆發式的人才篩選需求。AI面試工具憑借自動化與智能化特性成為破局關鍵&#xff0c;但市面上產品良莠不齊——究竟哪款能兼顧效率與…