一个脚本引发的血案-oracle 数据库生成大量的aud文件,磁盘inode被消耗光

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG数据库运维(如安装迁移,性能优化、故障应急处理等)
公众号:老苏畅谈运维
欢迎关注本人公众号,更多精彩与您分享。

1、adump目录下大量aud文件

事情的起因是一个客户的监控告警,/u01目录的inode使用率100%,经过排查发现是oracle数据库的audit_file_dest目录(/u01/app/oracle/admin/ora11g/adump)有大量的.aud文件,这些文件单个文件小,但是数量众多,导致占用了大量inode空间。
为了尽快恢复,先把adump目录下.aud文件先删除掉

cd /u01/app/oracle/admin/ora11g/adump
rm -rf *

屏幕显示:-bash: /bin/rm: Argument list too long

说明文件太多,无法一次性删除,使用下面的命令分批次删除:
ls | xargs -n 10 rm -fr ls

[oracle@ora11g:/u01/app/oracle/admin/ora11g/adump]$ ls | xargs -n 10 rm -fr ls
[oracle@ora11g:/u01/app/oracle/admin/ora11g/adump]$ ls
ora11g_ora_30081_20240614152501554813143795.aud  ora11g_ora_30083_20240614152501582383143795.aud  ora11g_ora_30088_20240614152501703067143795.aud  ora11g_ora_30092_20240614152501852521143795.aud
ora11g_ora_30082_20240614152501568151143795.aud  ora11g_ora_30087_20240614152501690481143795.aud  ora11g_ora_30089_20240614152501716605143795.aud


2、查找生成大量aud文件的原因

前面先删除所有aud文件,释放了空间,只是一个临时解决方案,要找到根源,防止后续还会出现这个问题。

(1)检查了数据库,并未开通审计日志

SQL> show parameter audit   

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest 		     string	 /u01/app/oracle/admin/ora11g/a
						 dump
audit_sys_operations		     boolean	 FALSE
audit_syslog_level		     string
audit_trail			     string	 NONE

可以看到audit_trail为none,audit_sys_operations也是FALSE,数据库并未开通审计外部记录,为什么adump目录会生成那么多的dump文件?

(2)查看aud文件内容和生成时间
–查看aud都记录什么信息
$ strings ora11g_ora_31758_20240614153102295854143795.aud
Audit file /u01/app/oracle/admin/ora11g/adump/ora11g_ora_31758_20240614153102295854143795.aud
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORACLE_HOME = /u01/app/oracle/product/11.2.0/db
System name: Linux
Node name: ora11g
Release: 5.4.17-2102.201.3.el7uek.x86_64
Version: #2 SMP Fri Apr 23 09:05:55 PDT 2021
Machine: x86_64
VM name: VMWare Version: 6
Instance name: ora11g
Redo thread mounted by this instance: 1
Oracle process number: 31
Unix process pid: 31758, image: oracle@ora11g (TNS V1-V3)
Fri Jun 14 15:31:02 2024 +08:00
LENGTH : ‘153’
ACTION :[7] ‘CONNECT’
DATABASE USER:[1] ‘/’
PRIVILEGE :[6] ‘SYSDBA’
CLIENT USER:[6] ‘oracle’
CLIENT TERMINAL:[0] ‘’
STATUS:[1] ‘0’
DBID:[9] ‘260591189’
You have new mail in /var/spool/mail/oracle

[oracle@ora11g:/u01/app/oracle/admin/ora11g/adump]$ ls -lrt

image.png

可以看到这些文件记录是sysdba登录相关记录,而且生成时间都是有规律的,每分钟都会生成,怀疑是不是有什么定时任务执行时候产生的呢?

(3)查看系统的crontab

[oracle@ora11g:/u01/app/oracle/admin/ora11g/adump]$ crontab -l
* * */1 * * /home/oracle/scripts/del_arch.sh
00 04 * * * /home/oracle/scripts/dbbackup_lv0.sh

发现crontab有一个定时删除归档的脚本,该脚本内容如下:

[oracle@ora11g:/u01/app/oracle/admin/ora11g/adump]$ cat /home/oracle/scripts/del_arch.sh
#!/bin/bash
source ~/.bash_profile
rman target / nocatalog msglog /home/oracle/scripts/del_arch.log <<EOF
crosscheck archivelog all;
delete noprompt archivelog until time 'sysdate-7';
EOF

脚本内容相对简单,就是定时删除七天前的归档日志,询问客户,脚本是他们自己部署的,之前遇到过归档爆满的情况。只是这个脚本执行太频繁了,按照这个设置,就是每分钟执行一次。先把这个脚本先注释掉,观察aud文件是否还生成,发现注释后,aud生成后没那么频繁了。

那这个脚本为什么会导致生成aud文件呢?那是因为每次sysdba或者sysoper权限登录都会写入一个audit trail文件或者在现有的trail文件后面添加登录信息,而这个并不受audit_trail参数限制,audit_trail是显示是否启用审计和审计内容存储的具体位置。另外audit_sys_operations该参数默认为false,但是sysdba和sysoper登录还是会记录audit到相应的audit trail文件的,只是不记录之后sysdba操作的信息,而如果设置true,还会记录之后sysdba或者sysoper操作记录到audit trail中。

有关audit_sys_operations参数解释:

AUDIT_SYS_OPERATIONS enables or disables the auditing of top-level operations, which are SQL statements directly issued by users when connecting with SYSDBA or SYSOPER privileges. (SQL statements run from within PL/SQL procedures or functions are not considered top-level.) The audit records are written to the operating system's audit trail. The audit records will be written in XML format if the AUDIT_TRAIL initialization parameter is set to xml or xml, extended.
On UNIX platforms, if the AUDIT_SYSLOG_LEVEL parameter has also been set, then it overrides the AUDIT_TRAIL parameter and SYS audit records are written to the system audit log using the SYSLOG utility.

所以说可以关闭审计,但是sysdba或者sysoper登录记录audit trail却无法禁掉。

3、后续处理

既然已经定位是脚本的原因,当然建议客户没必要执行那么频繁,改成一天执行一次足够了。另外它只能减少aud产生,并不能完全禁止产生,所以还是要用脚本定时去清理adump目录下这些aud文件比较稳妥。

清理的脚本如下:

$ cat del_aud.sh 
#!/bin/bash
#delete aud
for i in $(ps -ef|grep ora_smon|grep -v grep|awk '{print $NF}'|cut -c 10-)
do
  find /u01/app/oracle/admin/$i/adump -name "*.aud" -mtime +7  -exec rm -rf {} \;
done

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老苏畅谈运维

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值