现象:
数据库出现故障,连接时报错进程不足。
ORA-00020: maximum number of processes (2000) exceeded
分析及处理:
查看数据库进程 发现大约1800个LOCAL=NO进程,此时已经无法进入数据库查询信息。
使用os命令kill掉一些进程以释放资源 --head 取前10条
ps -ef|grep LOCAL=NO|grep -v grep|awk '{print $2}'|head|xargs kill -9
此时进入数据库报错发生改变:
ORA-09925: Unable to create Audit trail file
Linux-x86_64 Error:28 :no space left on device
此时查看df -h空间尚可,并未使用达90%以上。后向大婶儿求教,方知原因在何处。
原来,是inode满了,而并非磁盘空间满了
通常在数据库检查中,我们都是使用df -h查看磁盘空间的使用情况,往往不会单独再去查询inode信息,而此时就可能因为小文件过多导致在磁盘空间未满的情况下出现inode满的故障。
$ df -i (该信息非故障时信息)
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/rootvg-lvroot
6553600 683367 5870233 11% /
tmpfs 66112911 275 66112636 1% /dev/shm
/dev/sdbu2 65536 22 65514 1% /boot
/dev/sdbu1 0 0 0 - /boot/efi
/dev/mapper/rootvg-lvhome
1310720 106 1310614 1% /home
/dev/mapper/rootvg-lvopt
655360 49 655311 1% /opt
/dev/mapper/rootvg-lvvar
1310720 3272 1307448 1% /var
想想,几百万的文件是多么的恐怖!
解决的方案更是简单,删就完了。
查看u01目录下的inode数量
# find /u01 -xdev -printf '%h\n' | wc -l
6424976
递归查询某目录下所有文件夹的inod数量
for i in /u01/app/oracle/*; do echo $i; find $i |wc -l; done
最终发现是aud文件导致,此时删除aud文件就能解决故障。
无法正常删除文件
$ rm -rf *
-bash: /bin/rm: Argument list too long
使用
ls | xargs -n 10 rm -fr ls
命令解释为:输出所有的文件名(用空格分割) xargs就是将ls的输出,每10个为一组(以空格为分隔符)
删除文件后,空间释放,数据库恢复正常。
可以使用下面命令批量删除 LOCAL=NO进程
ps -ef |grep LOCAL=NO|grep -v grep|awk '{print $2}' |xargs kill -9