--ref
oracle占用的磁盘空间自动增长导致数据库当机
源文档 <http://topic.csdn.net/u/20091013/12/01efb6a6-957e-495d-a7e8-1da5ec85e3af.html>
可能是日志文件或跟踪文件产生过多导到磁盘空间增长,可以到目录%ORACLE_BASE%\admin\%ORACLE_SID%下面找找,看看bdump,udump及cdump下面的文件
--错误描述
做一个大的update导致undo暴涨,具体:
xxd@ETMCDB> update big_table set temporary = decode(temporary,'N','Y','N');
update big_table set temporary = decode(temporary,'N','Y','N')
*
ERROR at line 1:
ORA-30036: unable to extend segment by 8 in undo tablespace 'UNDOTBS1'
其他连接断开,试图重新连接显示错误提示如下:
Error:28 No Space On Device
一些有用的shell @20110530加入
node1*orcl-/u01/app/oracle/admin/orcl/bdump >cd orcl/
node1*orcl-/u01/app/oracle/admin/orcl/bdump >du -sh *
2.5M adump
9G bdump
4.0K cdump
4.0K dpdump
8.0K pfile
524M udump
这里就找到了bdump文件夹,然后进入删除
node1*orcl-/u01/app/oracle/admin/orcl/bdump >find . -name *.trc -exec rm{}
node1*orcl-/u01/app/oracle/admin/orcl/bdump >ls *.trc| xargs -n 10 rm -fr ls
如果遇到/bin/rm: Argument list too long错误则需要一点一点的删除
node1*orcl-/u01/app/oracle/admin/orcl/bdump >rm -f orcl_j000_2*.trc
--解决方法
很简单找出占磁盘的文件就是arch,flash back空间或/var/log,arch清除
1.找出路径
sys@ETMCDB> show parameters archive
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
archive_lag_target integer 0
log_archive_config string
log_archive_dest string
log_archive_dest_1 string LOCATION=/u01/app/oracle/flash_recovery_area/ORCL
2.到/u01/app/oracle/flash_recovery_area/ORC下清除
node1*orcl-/u01/app/oracle/flash_recovery_area/ORCL/archivelog >du -h --max-depth=1
有时磁盘满的情况下是进不去RMAN的,所以要手工删除.
node1*orcl-/u01/app/oracle/flash_recovery_area/ORCL >rm -rf archivelog/
然后到RMAN中删除
rman target sys/<password> nocatalog
rman>crosscheck archivelog all
rman>delete expired archivelog all
--问题总结
[root@oracle ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/cciss/c0d0p2 31G 14G 16G 46% /
/dev/cciss/c0d0p1 97M 11M 81M 12% /boot
none 1014M 0 1014M 0% /dev/shm
不要只分一个'/'区,如果有个‘/opt’,也不至于把系统撑爆,类似以下:
/dev/vg00/lvol3 262144 181520 80040 69% /
/dev/vg00/lvol1 314736 84360 198896 30% /stand
/dev/vg00/lvol8 4718592 1056280 3633752 23% /var
/dev/vg00/lvol7 2654208 1435160 1209576 54% /usr
/dev/vg00/lvol4 1540096 1028512 508264 67% /tmp
/dev/vg00/lvol9 10485760 4948670 5365096 48% /oracle
/dev/vg00/lvol6 94208000 7317328 86211936 8% /opt
/dev/vg00/lvol5 163840 2480 160104 2% /home
/dev/vg00/lv_arch 51216384 51112984 102632 100% /arch
--延伸问题
1.归档满撑爆磁盘且shutdown
immediate命令无法关闭数据库:
归档目录已经全部删除了,但是归档目录的大小还是100%,且执行shutdown immediate挂死
同时alertlog中也在不断的报错:
ORA-16014: log 2 sequence# 28801 not archived, no available destinations
ORA-00312: online log 2 thread 1: '/dev/vg_audit01/rredo_128m_02'
ORA-00312: online log 2 thread 1: '/dev/vg_audit01/rredo_128m_12'
ORA-00312: online log 2 thread 1: '/dev/vg_audit01/rredo_128m_22'
Mon Sep 1 10:28:55 2008
问题原因:引起该问题的主要原因,就是在/arch目录下,使用了rm *命令来删除归档,但是当前正好有归档进程(arch)正在写出,rm后文件系统的句柄无法释放,因此空间也没有释放。
此时我们用shutdown
immediate命令无法关闭数据库,这是因为,在现在的状态下,arch已经被撑爆,所有组的redolog均为非inactive状
态,shutdown immediate需要做checkpoint,checkpoint会将dirty buffer中的东西写入到db
buffer,lgwr的触发条件之一就是dbwr进程写db
file,此时,lgwr发现所有的redolog都是非inactive状态,都不能写,继续寻求arch切出,以期待能写redolog。而此时
arch目录爆满,因此就报上述的错了。
sys@ETMCDB> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------
1 1 187 104857600 2 YES ACTIVE 13693650 16-NOV-09
2 1 188 104857600 2 NO CURRENT 13696640 16-NOV-09
3 1 186 104857600 2 YES ACTIVE 13689184 16-NOV-09
最安全的方法是在rman中用delete input删除了。或者在删除归档的时候不要全部删除,要留最后一个归档。RMAN 删除归档日志:
RMAN> delete noprompt archivelog until time "sysdate -3";
RMAN> run{
crosscheck backup;
delete noprompt obsolete;
delete noprompt expired backup;
}
--END--