Oracle数据库表空间占用过大的解决办法
生活随笔
收集整理的這篇文章主要介紹了
Oracle数据库表空间占用过大的解决办法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近調接口的時候接口訪問歷史表報錯:
檢查之后發現表空間滿了,隨后把相應表空間進行了擴展,順帶總結了Oracle檢查&調整表空間的sql語句如下: --查看某張表的表空間 select table_name,tablespace_name from user_tables where TABLE_NAME='表名';
--查詢表空間的使用情況 SELECT UPPER(F.TABLESPACE_NAME)"表空間名",D.TOT_GROOTTE_MB "表空間大小(M)",D.TOT_GROOTTE_MB-F.TOTAL_BYTES "已使用空間(M)",TO_CHAR(ROUND((D.TOT_GROOTTE_MB-F.TOTAL_BYTES)/D.TOT_GROOTTE_MB*100,2),'990.99')||'%'"使用比",F.TOTAL_BYTES "空閑空間(M)",F.MAX_BYTES "最大塊(M)"FROM(SELECT TABLESPACE_NAME,ROUND(SUM(BYTES)/(1024*1024),2)TOTAL_BYTES,ROUND(MAX(BYTES)/(1024*1024),2)MAX_BYTESFROM SYS.DBA_FREE_SPACEGROUP BY TABLESPACE_NAME)F,(SELECT DD.TABLESPACE_NAME,ROUND(SUM(DD.BYTES)/(1024*1024),2)TOT_GROOTTE_MBFROM SYS.DBA_DATA_FILES DDGROUP BY DD.TABLESPACE_NAME)DWHERE D.TABLESPACE_NAME=F.TABLESPACE_NAMEORDERBY1;
--查詢某個用戶的默認表空間和默認臨時表空間 select username,default_tablespace,temporary_tablespace from dba_users where username='用戶名';
-- 查詢某個用戶下所有表使用的表空間 select owner,table_name,tablespace_name from dba_tables where owner='用戶名';
--查詢某個表空間下面的所有表 select * from all_tables where tablespace_name='表空間名'
--檢查表空間數據文件占用 selectb.file_name 物理文件名,b.tablespace_name 表空間,b.bytes/1024/1024大小M,(b.bytes-sum(nvl(a.bytes,0)))/1024/1024 已使用M,substr((b.bytes-sum(nvl(a.bytes,0)))/(b.bytes)*100,1,5) 利用率 from dba_free_space a,dba_data_files b where a.file_id=b.file_id group by b.tablespace_name,b.file_name,b.bytes order by b.tablespace_name;
--增加表空間 1、先查看一下數據文件存放位置:select * from dba_data_files; 2、登錄服務器查看相關目錄下是否有足夠的空間? df -h ----css_app02.dbf 表示這是css_app表空間的其中一份存儲文件. 表空間存儲文件命名方式:表空間名01.dbf,表空間名02.dbf .....表空間名0N.dbf? ? 3、拓展表空間的兩種方法: 方法一:? 給表空間增加數據文件: --增加固定大小的文件,不允許數據文件自動增長 alter tablespace 表空間名 add? datafile ‘/mnt/disk/oracle/CSS_APP02.dbf’size 30720M? autoextend off; --新增數據文件,并且允許數據文件自動增長 alter tablespace 表空間名 add? datafile ‘/mnt/disk/oracle/CSS_APP02.dbf’size 30720M? autoextend on next 50M maxsize 5G;
--新增數據文件,并且允許數據文件自動增長(無限制) alter tablespace 表空間名 add? datafile ‘/mnt/disk/oracle/CSS_APP02.dbf’size 30720M? autoextend on next 50M maxsize unlimited;
方法二: 改變已存在的數據文件的大小: alter datdabase datafile??‘/mnt/disk/oracle/CSS_APP01.dbf’ resize 30720M;
--系統表空間過大的情況 1、system表空間過大(使用率95%以上) a、檢查aud$表大小 --查看數據庫表大小SQL select bytes,owner,segment_name from dba_segments where segment_type='TABLE' order by bytes desc;--查看aud$表大小SQL select bytes,owner,segment_name from dba_segments where segment_type='TABLE' and segment_name = 'AUD$'; b、如果aud$過大,清理(導出aud$表之后,使用truncate清理) c、如果出現aud$表為空。但是system表空間的使用率照樣達到99%的情況,建議增加數據文件
2、sysaux表空間過大(使用率95%以上) a、修改統計信息的保存時間 select dbms_stats.get_stats_history_retention from dual; --檢查統計信息保存時間(默認應該是31天)exec dbms_stats.alter_stats_history_retention(7); ?--如果31天將其改為7天 select dbms_stats.get_stats_history_retention from dual; ?--驗證是否修改成功 b、刪除AWR報告快照
? ? ? ? 補充:Oracle 10g中快照會保留7天,11g的快照保留8天,超出會自動刪除。AWR快照可以從其他數據庫導入,而這部分數據會保存時間極長。有時候也會遇到自動快照不能自動收集,而手工創建的快照又可以成功,對于這種情況就需要把以前的快照清理掉。
? ? ? ? ? 刪除AWR有兩種方式進行刪除:dbms_workload_repository,dbms_swrf_internal。dbms_workload_repository可以刪除本地和其他數據庫的快照,可以選擇不同的快照來進行刪除;dbms_swrf_internal只能對其他數據庫的快照來進行操作,會把所有的快照直接干掉。
? 使用dbms_workload_repository包刪除: select dbid, retention from dba_hist_wr_control;select min(snap_id), max(snap_id)from dba_hist_snapshot where dbid = '得到的dbid值';exec dbms_workload_repository.drop_snapshot_range('得到的min(snap_id)值','得到的max(snap_id)值','得到的dbid值');select * from dba_hist_snapshot where dbid = '得到的dbid值';使用dbm_swrf_internal包刪除: select dbid, retention from dba_hist_wr_control;select min(snap_id), max(snap_id)from dba_hist_snapshot where dbid = '得到的dbid值';exec dbms_swrf_internal.unregister_database('得到的dbid值');select * from dba_hist_snapshot where dbid = '得到的dbid值';
檢查之后發現表空間滿了,隨后把相應表空間進行了擴展,順帶總結了Oracle檢查&調整表空間的sql語句如下: --查看某張表的表空間 select table_name,tablespace_name from user_tables where TABLE_NAME='表名';
--查詢表空間的使用情況 SELECT UPPER(F.TABLESPACE_NAME)"表空間名",D.TOT_GROOTTE_MB "表空間大小(M)",D.TOT_GROOTTE_MB-F.TOTAL_BYTES "已使用空間(M)",TO_CHAR(ROUND((D.TOT_GROOTTE_MB-F.TOTAL_BYTES)/D.TOT_GROOTTE_MB*100,2),'990.99')||'%'"使用比",F.TOTAL_BYTES "空閑空間(M)",F.MAX_BYTES "最大塊(M)"FROM(SELECT TABLESPACE_NAME,ROUND(SUM(BYTES)/(1024*1024),2)TOTAL_BYTES,ROUND(MAX(BYTES)/(1024*1024),2)MAX_BYTESFROM SYS.DBA_FREE_SPACEGROUP BY TABLESPACE_NAME)F,(SELECT DD.TABLESPACE_NAME,ROUND(SUM(DD.BYTES)/(1024*1024),2)TOT_GROOTTE_MBFROM SYS.DBA_DATA_FILES DDGROUP BY DD.TABLESPACE_NAME)DWHERE D.TABLESPACE_NAME=F.TABLESPACE_NAMEORDERBY1;
--查詢某個用戶的默認表空間和默認臨時表空間 select username,default_tablespace,temporary_tablespace from dba_users where username='用戶名';
-- 查詢某個用戶下所有表使用的表空間 select owner,table_name,tablespace_name from dba_tables where owner='用戶名';
--查詢某個表空間下面的所有表 select * from all_tables where tablespace_name='表空間名'
--檢查表空間數據文件占用 selectb.file_name 物理文件名,b.tablespace_name 表空間,b.bytes/1024/1024大小M,(b.bytes-sum(nvl(a.bytes,0)))/1024/1024 已使用M,substr((b.bytes-sum(nvl(a.bytes,0)))/(b.bytes)*100,1,5) 利用率 from dba_free_space a,dba_data_files b where a.file_id=b.file_id group by b.tablespace_name,b.file_name,b.bytes order by b.tablespace_name;
--增加表空間 1、先查看一下數據文件存放位置:select * from dba_data_files; 2、登錄服務器查看相關目錄下是否有足夠的空間? df -h ----css_app02.dbf 表示這是css_app表空間的其中一份存儲文件. 表空間存儲文件命名方式:表空間名01.dbf,表空間名02.dbf .....表空間名0N.dbf? ? 3、拓展表空間的兩種方法: 方法一:? 給表空間增加數據文件: --增加固定大小的文件,不允許數據文件自動增長 alter tablespace 表空間名 add? datafile ‘/mnt/disk/oracle/CSS_APP02.dbf’size 30720M? autoextend off; --新增數據文件,并且允許數據文件自動增長 alter tablespace 表空間名 add? datafile ‘/mnt/disk/oracle/CSS_APP02.dbf’size 30720M? autoextend on next 50M maxsize 5G;
--新增數據文件,并且允許數據文件自動增長(無限制) alter tablespace 表空間名 add? datafile ‘/mnt/disk/oracle/CSS_APP02.dbf’size 30720M? autoextend on next 50M maxsize unlimited;
方法二: 改變已存在的數據文件的大小: alter datdabase datafile??‘/mnt/disk/oracle/CSS_APP01.dbf’ resize 30720M;
--系統表空間過大的情況 1、system表空間過大(使用率95%以上) a、檢查aud$表大小 --查看數據庫表大小SQL select bytes,owner,segment_name from dba_segments where segment_type='TABLE' order by bytes desc;--查看aud$表大小SQL select bytes,owner,segment_name from dba_segments where segment_type='TABLE' and segment_name = 'AUD$'; b、如果aud$過大,清理(導出aud$表之后,使用truncate清理) c、如果出現aud$表為空。但是system表空間的使用率照樣達到99%的情況,建議增加數據文件
2、sysaux表空間過大(使用率95%以上) a、修改統計信息的保存時間 select dbms_stats.get_stats_history_retention from dual; --檢查統計信息保存時間(默認應該是31天)exec dbms_stats.alter_stats_history_retention(7); ?--如果31天將其改為7天 select dbms_stats.get_stats_history_retention from dual; ?--驗證是否修改成功 b、刪除AWR報告快照
? ? ? ? 補充:Oracle 10g中快照會保留7天,11g的快照保留8天,超出會自動刪除。AWR快照可以從其他數據庫導入,而這部分數據會保存時間極長。有時候也會遇到自動快照不能自動收集,而手工創建的快照又可以成功,對于這種情況就需要把以前的快照清理掉。
? ? ? ? ? 刪除AWR有兩種方式進行刪除:dbms_workload_repository,dbms_swrf_internal。dbms_workload_repository可以刪除本地和其他數據庫的快照,可以選擇不同的快照來進行刪除;dbms_swrf_internal只能對其他數據庫的快照來進行操作,會把所有的快照直接干掉。
? 使用dbms_workload_repository包刪除: select dbid, retention from dba_hist_wr_control;select min(snap_id), max(snap_id)from dba_hist_snapshot where dbid = '得到的dbid值';exec dbms_workload_repository.drop_snapshot_range('得到的min(snap_id)值','得到的max(snap_id)值','得到的dbid值');select * from dba_hist_snapshot where dbid = '得到的dbid值';使用dbm_swrf_internal包刪除: select dbid, retention from dba_hist_wr_control;select min(snap_id), max(snap_id)from dba_hist_snapshot where dbid = '得到的dbid值';exec dbms_swrf_internal.unregister_database('得到的dbid值');select * from dba_hist_snapshot where dbid = '得到的dbid值';
總結
以上是生活随笔為你收集整理的Oracle数据库表空间占用过大的解决办法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【MyEclips】“Could not
- 下一篇: Oracle序列小结