windows2008下一个C盘数据库磁盘空间快不足了:

并且alert日志也提示了磁盘空间不足。

这是一个老库,库不大,业务小,所以基本没怎么关注。好在是虚机环境,处理灵活。
处理思路:
1.清理C盘的无用文件:
比如日志之类。推荐用TreeSize free工具,只管找到占用大的垃圾文件做清理。
能删的删了清理完,也就腾出2G空间,太少了。
2.直接扩容C盘:
发现磁盘灰色,无法扩容(关机后还是灰色,比较奇怪)–暂时先不考虑了

3.缩小数据库文件:
发现SYSAUX表空间占用最大,约20G,所以考虑清理awr数据,尝试收缩文件。
由于数据文件本身就一个,而且是默认自动增长,所以高水位基本就在文件末端。
对象位置都处在末端,对象太多,放弃考虑。
统计信息保留时间调整为7天:
SQL> exec dbms_stats.alter_stats_history_retention(7);
PL/SQL 过程已成功完成。
SQL> select dbms_stats.get_stats_history_retention from dual;
GET_STATS_HISTORY_RETENTION
---------------------------
7--默认是31
清理awr表数据:
SQL> col segment_name format a30
SQL> col owner format a10
SQL> col tablespace_name format a10
SQL> col segment_type format a15
SQL> select * from(select segment_name,owner,tablespace_name,bytes/1024/1024 "SIZE(MB)",segment_type from dba_segments where tablespace_name='SYSAUX' order by bytes desc) a where rownum<10;
SEGMENT_NAME OWNER TABLESPACE SIZE(MB) SEGMENT_TYPE
------------------------------ ---------- ---------- ---------- ---------------
WRH$_ACTIVE_SESSION_HISTORY SYS SYSAUX 5925 TABLE PARTITION
WRH$_SQLSTAT SYS SYSAUX 993 TABLE PARTITION
WRH$_LATCH SYS SYSAUX 949 TABLE PARTITION
WRH$_EVENT_HISTOGRAM_PK SYS SYSAUX 882 INDEX PARTITION
WRH$_EVENT_HISTOGRAM SYS SYSAUX 848 TABLE PARTITION
WRH$_SEG_STAT SYS SYSAUX 720 TABLE PARTITION
WRH$_ACTIVE_SESSION_HISTORY_PK SYS SYSAUX 640 INDEX PARTITION
WRH$_SYSSTAT_PK SYS SYSAUX 640 INDEX PARTITION
WRH$_LATCH_MISSES_SUMMARY SYS SYSAUX 612 TABLE PARTITION
已选择9行。
SQL> truncate table WRH$_ACTIVE_SESSION_HISTORY;
表被截断。
SQL> truncate table WRH$_LATCH;
表被截断。
SQL> truncate table WRH$_SQLSTAT;
表被截断。
SQL> truncate table WRH$_SEG_STAT;
表被截断。
SQL> truncate table WRH$_EVENT_HISTOGRAM;
表被截断。
找处在文件末端高水位的对象:
SQL> select file#,name from v$datafile;
FILE#
----------
NAME
--------------------------------------------------------------------------------
1
C:\ORACLE\ORADATA\KHGL\SYSTEM01.DBF
2
C:\ORACLE\ORADATA\KHGL\SYSAUX01.DBF
3
C:\ORACLE\ORADATA\KHGL\UNDOTBS01.DBF
FILE#
----------
NAME
--------------------------------------------------------------------------------
4
C:\ORACLE\ORADATA\KHGL\USERS01.DBF
SQL> select max(block_id) from dba_extents where file_id=2;
MAX(BLOCK_ID)
-------------
2530304
SQL> select 2530304*8/1024/1024 from dual;
2530304*8/1024/1024
-------------------
19.3046875
SQL> select * from (select extent_id,file_id,block_id,blocks,segment_name,segment_type,owner from dba_extents where tablespace_name='SYSAUX' order by block_id desc) where rownum<10;
EXTENT_ID FILE_ID BLOCK_ID BLOCKS SEGMENT_NAME
---------- ---------- ---------- ---------- ------------------------------
SEGMENT_TYPE OWNER
--------------- ----------
152 2 2530304 1024 WRH$_SYSSTAT
TABLE PARTITION SYS
89 2 2525184 1024 WRH$_SERVICE_WAIT_CLASS_PK
INDEX PARTITION SYS
156 2 2524160 1024 WRH$_SYSSTAT_PK
INDEX PARTITION SYS
EXTENT_ID FILE_ID BLOCK_ID BLOCKS SEGMENT_NAME
---------- ---------- ---------- ---------- ------------------------------
SEGMENT_TYPE OWNER
--------------- ----------
150 2 2513920 1024 WRH$_LATCH_MISSES_SUMMARY
TABLE PARTITION SYS
130 2 2511872 1024 WRH$_PARAMETER
TABLE PARTITION SYS
33 2 2511744 128 WRH$_TABLESPACE_STAT
TABLE PARTITION SYS
EXTENT_ID FILE_ID BLOCK_ID BLOCKS SEGMENT_NAME
---------- ---------- ---------- ---------- ------------------------------
SEGMENT_TYPE OWNER
--------------- ----------
145 2 2510720 1024 WRH$_PARAMETER_PK
INDEX PARTITION SYS
146 2 2509696 1024 WRH$_LATCH_MISSES_SUMMARY_PK
INDEX PARTITION SYS
119 2 2505600 1024 WRH$_SYSTEM_EVENT
TABLE PARTITION SYS
已选择9行。
SQL> truncate table WRH$_SYSSTAT;
表被截断。
SQL> select * from (select extent_id,file_id,block_id,blocks,segment_name,segment_type,owner from d
ba_extents where tablespace_name='SYSAUX' order by block_id desc) where rownum<10;
EXTENT_ID FILE_ID BLOCK_ID BLOCKS SEGMENT_NAME
---------- ---------- ---------- ---------- ------------------------------
SEGMENT_TYPE OWNER
--------------- ----------
89 2 2525184 1024 WRH$_SERVICE_WAIT_CLASS_PK
INDEX PARTITION SYS
150 2 2513920 1024 WRH$_LATCH_MISSES_SUMMARY
TABLE PARTITION SYS
130 2 2511872 1024 WRH$_PARAMETER
TABLE PARTITION SYS
EXTENT_ID FILE_ID BLOCK_ID BLOCKS SEGMENT_NAME
---------- ---------- ---------- ---------- ------------------------------
SEGMENT_TYPE OWNER
--------------- ----------
33 2 2511744 128 WRH$_TABLESPACE_STAT
TABLE PARTITION SYS
145 2 2510720 1024 WRH$_PARAMETER_PK
INDEX PARTITION SYS
146 2 2509696 1024 WRH$_LATCH_MISSES_SUMMARY_PK
INDEX PARTITION SYS
EXTENT_ID FILE_ID BLOCK_ID BLOCKS SEGMENT_NAME
---------- ---------- ---------- ---------- ------------------------------
SEGMENT_TYPE OWNER
--------------- ----------
119 2 2505600 1024 WRH$_SYSTEM_EVENT
TABLE PARTITION SYS
140 2 2503552 1024 WRH$_SERVICE_STAT_PK
INDEX PARTITION SYS
103 2 2498432 1024 WRH$_SYSTEM_EVENT_PK
INDEX PARTITION SYS
已选择9行。
SQL> truncate table WRH$_SERVICE_WAIT_CLASS;
表被截断。
SQL> truncate table WRH$_LATCH_MISSES_SUMMARY;
表被截断。
--没什么效果,对象太多,挪太费劲了。换思路。
SQL> alter database datafile 'C:\ORACLE\ORADATA\KHGL\SYSAUX01.DBF' resize 18240M
;
alter database datafile 'C:\ORACLE\ORADATA\KHGL\SYSAUX01.DBF' resize 18240M
*
第 1 行出现错误:
ORA-03297: 文件包含在请求的 RESIZE 值以外使用的数据
SQL> alter database datafile 'C:\ORACLE\ORADATA\KHGL\SYSAUX01.DBF' resize 19240M
;
alter database datafile 'C:\ORACLE\ORADATA\KHGL\SYSAUX01.DBF' resize 19240M
*
第 1 行出现错误:
ORA-03297: 文件包含在请求的 RESIZE 值以外使用的数据
4.新增磁盘F:给了80G足够
腾挪最大的SYSAUX数据文件20G到新磁盘路径下。

SQL> select file#,name from v$datafile;
FILE#
----------
NAME
--------------------------------------------------------------------------------
1
C:\ORACLE\ORADATA\KHGL\SYSTEM01.DBF
2
C:\ORACLE\ORADATA\KHGL\SYSAUX01.DBF
3
C:\ORACLE\ORADATA\KHGL\UNDOTBS01.DBF
FILE#
----------
NAME
--------------------------------------------------------------------------------
4
C:\ORACLE\ORADATA\KHGL\USERS01.DBF
SQL> alter tablespace SYSAUX offline;
表空间已更改。
--此时做文件拷贝操作:

由于SYSAUX offline了,所以此时涉及到该表空间的读写操作将会失败,但几乎不影响业务运行,不影响其它正常表空间的读写。
在alert日志有报错信息,待拷贝完成、数据文件rename和表空间 online后可恢复正常。

SQL> alter tablespace SYSAUX rename datafile 'C:\ORACLE\ORADATA\KHGL\SYSAUX01.DBF' to 'F:\oradata\khgl\SYSAUX01.DBF';
表空间已更改。
SQL> alter tablespace SYSAUX online;
表空间已更改。
SQL> select file#,name from v$datafile;
FILE#
----------
NAME
--------------------------------------------------------------------------------
1
C:\ORACLE\ORADATA\KHGL\SYSTEM01.DBF
2
F:\ORADATA\KHGL\SYSAUX01.DBF
3
C:\ORACLE\ORADATA\KHGL\UNDOTBS01.DBF
FILE#
----------
NAME
--------------------------------------------------------------------------------
4
C:\ORACLE\ORADATA\KHGL\USERS01.DBF
SQL> select online_status,status,file_name from dba_data_files;
ONLINE_ STATUS
------- ---------
FILE_NAME
--------------------------------------------------------------------------------
SYSTEM AVAILABLE
C:\ORACLE\ORADATA\KHGL\SYSTEM01.DBF
ONLINE AVAILABLE
F:\ORADATA\KHGL\SYSAUX01.DBF --此处看到已经在F盘了。
ONLINE AVAILABLE
C:\ORACLE\ORADATA\KHGL\UNDOTBS01.DBF
ONLINE_ STATUS
------- ---------
FILE_NAME
--------------------------------------------------------------------------------
ONLINE AVAILABLE
C:\ORACLE\ORADATA\KHGL\USERS01.DBF
SQL> select status,contents,tablespace_name from dba_tablespaces;
STATUS CONTENTS TABLESPACE
--------- --------- ----------
ONLINE PERMANENT SYSTEM
ONLINE PERMANENT SYSAUX
ONLINE UNDO UNDOTBS1
ONLINE TEMPORARY TEMP
ONLINE PERMANENT USERS
正常之后,删除原先C盘的SYSAUX文件即可。此时空间就释放出来了。

之前另外一个CASE的空间满处理思路与此不同,所以具体问题具体分析,灵活应对。
Oracle磁盘空间马上满了,3千多万的trc文件处理?
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




