作者介绍:老苏,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
可以看到这些文件记录是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