Oracle表空间使用率过大问题处理方法
一、 查看Oracle数据库内表空间使用情况
SELECT a.tablespace_name "表空间名", total "表空间大小", free "表空间剩余大小", (total - free) "表空间使用大小", total/(1024*1024*1024) "表空间大小(G)", free/(1024*1024*1024) "表空间剩余大小(G)", (total - free)/(1024*1024*1024) "表空间使用大小(G)", ROUND((total - free) / total, 4) * 100 "使用率 %" FROM (SELECT tablespace_name, SUM(bytes) free FROM DBA_FREE_SPACE GROUP BY tablespace_name) a, (SELECT tablespace_name, SUM(bytes) total FROM DBA_DATA_FILES GROUP BY tablespace_name) b WHERE a.tablespace_name = b.tablespace_name;
二、 system表空间过大(使用率95%以上)
1) 检查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$';
2) 如果aud$过大,清理之
导出aud$表后,用truncate清理
3) 如果出现aud$表为空,system表空间使用率照样达到99%,建议增加数据文件
a) 增加数据文件示例语句
批注:增加的表空间大小自己拟定
alter tablespace system add datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SGTMS\SYSTEM02.DBF' size 50M autoextend on
b) 查询验证文件已成功添加
select * from dba_data_files;
三、 sysaux表空间(使用率95%以上)
1) 修改统计信息保存时间
a) 检查统计信息保存时间(默认应该是31天)
select dbms_stats.get_stats_history_retention from dual;b) 如果31天将其改为7天
exec dbms_stats.alter_stats_history_retention(7);c) 验证是否修改成功
select dbms_stats.get_stats_history_retention from dual;
2) 删除AWR报告快照
批注:Oracle 10g中快照会保留7天,11g的快照保留8天,超出会自动删除。AWR快照可以从其他数据库导入,而这部分数据会保存时间极长。有时候也会遇到自动快照不能自动收集,而手工创建的快照又可以成功,对于这种情况就需要把以前的快照清理掉。
删除AWR有两种方式进行删除:dbms_workload_repository,dbms_swrf_internal。dbms_workload_repository可以删除本地和其他数据库的快照,可以选择不同的快照来进行删除;dbms_swrf_internal只能对其他数据库的快照来进行操作,会把所有的快照直接干掉。
a) 使用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值';
b) 使用dbms_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值';
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。