之前数据库出现过被撑爆的问题,集成同事帮忙查看后确定是没有对$ORACLE_BASE/admin/$ORACLE_SID/adump目录的文件做定时清理。后续增加了清理这个目录的定时任务,学习的过程记录下。
-
关于$ORACLE_BASE/admin/$ORACLE_SID/adump目录
这个目录下存储的是审计文件,具体作用后续学习补充。 -
定时任务的格式和修改查看方式
基本格式 :
* * * * command
分 时 日 月 周 命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
通过crontab -e可以修改对应用户下的定时任务。
通过crontab -l可以查看对应用户下的定时任务。
也可通过/var/spool/cron查看对应用户下的文件,就是需要root权限。
修改完成crontab -e就会生效,问题是需要注意环境变量影响获取命令的路径,所以尽量使用全路径命令来执行。 -
关于定时任务中使用的查询文件并删除的命令行
在网络上查找资料普遍使用下面的命令
#!/bin/bash
#删除30天以前的日志数据 日志位于./logs 文件夹下
find ./logs/ -mtime +30 -name "*.log*" -exec rm -rf {} \;
但是在实际使用中,发现-exec在执行删除时,会把匹配到的文件名全部传入执行,但是参数会有长度限制,如果在大批量文件需要删除时,这样在find命令运行几分钟之后,就会出现溢出错误。所以需要使用-xargs参数,而xargs命令每次只获取一部分文件而不是全部,不像 -exec选项那样。
所以最后确定写的格式大概如下:
5 0 * * * /usr/bin/find $ORACLE_BASE/admin/$ORACLE_SID/adump -mtime +90 -name "*.aud" | xargs /usr/bin/rm -f "*.aud"
后续学习继续补充。
关于-exec参数的后记
接触到的某个脚本在删除大量数据时候使用了-exec数据,可能导致每次无法将文件夹下find到的文件都删除而导致了文件累积。而关于-exec {}参数的长度限制,是源于系统内核对于参数长度的限制,下面这个问答以及其链接内容可能更加清晰,附下:
What defines the maximum size for a command single argument?
所以按照上述内容看来,其实其他类似cp命令使用通配符传递参数的,也都可能会出现参数过长的问题。