故障现象
巡检中发现数据库alert日志中报错
ORA-48180 caught while writing to trace file “/u01/app/oracle/diag/rdbms/orcl/orcl1/trace/orcl1_ckpt_3331280.trc”
IBM AIX RISC System/6000 Error:1 Not owner
原因排查
检查日志文件权限,发现 /u01/app/oracle/diag/rdbms/orcl/orcl1/trace/orcl1_ckpt_3331280.trc 权限为 -rw-r–r-- root:system
可以确定为日志文件权限原因导致ORACLE进程无权限对日志进行写操作。到此基本可以关闭问题了。但是作为DBA不可以放过任何一个数据库的报错,必须找到问题根源,到底是什么原因导致权限变更的。
1、有用户手动变更文件权限 (有可能 查到是谁,打死)
2、有Oracle日志进程运行的权限是root(一般不太可能 ps -ef可以查看)
3、。。。
检查整个目录后发现权限为root的trc文件,偶尔出现。没有固定的进程特征。但是内容均被清空,只有一个字符 1 ,创建时间也为 17:00 。突然想起来,之前同事部署了自动清理trace目录下日志的脚本,是用root用户执行的。
同事部署的脚本如下
crontab -l
0 17 * * * sh find /u01/app/oracle/diag/rdbms/orcl/orcl1/trace/ -mtime +1 -name “orcl*” -exec rm -rf {} ;
0 17 * * * sh del.sh
cat del.sh
for b in ‘find /u01/app/oracle/diag/rdbms/orcl/orcl1/trace/ -mmin +60 -name “orcl*”’
do
echo “1” > $b
done
看起来两个自动执行的任务没什么问题,一个是清空60分钟前日志的(12C的数据库 有个日志暴增的BUG,要打补丁,所以曲线救国),一个是rm 删除一天前日志的。但是问题就在这两个脚本中。
1、删除的脚本并不会更改权限
2、清空日志的追加 > 符 也不会更改用户权限。但是追加符如果文件不存在的话会重新创建文件。
到这问题就有眉目了。经过验证原因是 日志文件被rm任务删除了后,追加脚本又重新创建了文件。并且权限为root:system
因为两个命令同时执行,find命令同时获取trace目录内文件,清空的是60分钟前的 (包含删除的文件),删除的是1天前的,难免就有文件在清空之前被删除。然后再去执行清空命令时就会重新创建一个同名的属主为root用户日志文件,等到Oracle进程要再次写入该日志文件时就会报错 ora-48180和IBM Not owner。
解决办法
有两种
1、更改脚本执行的用户,将两个脚本均改为Oracle用户执行
2、更改脚本执行顺序,先执行追加清空脚本,清空脚本执行结束再执行rm删除命令