一、关于c r o n
这两个任务都用到了Linux的后台服务 c r o n, c r o n是系统主要的调度进程,可以在无需人工干预的情况下运行作业。检查在某个用户下是否有任务执行用下面的命令,有则列出,无则显示no crontab for user。
1、没有crontab:
[root@nod1 ~]# crontab -l
no crontab for root
[root@nod1 ~]#
2、定义了crontab
[oracle@nod1 ~]$ crontab -l
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=oracle
HOME=/
# Export ECampus Data & Backup to the Tape Storage
30 1 * * * /u01/oraback/db_backup.sh
# Find the files while larger than 8M at 1am everyday
0 1 * * * echo "*************************************" >> /u01/oraback/log.find
1 1 * * * echo `date` >> /u01/oraback/log.find
2 1 * * * find /u01/app/oracle/product/10.1.0/db_1/ -size +8388608c -exec ls -l {} ; >> /u01/oraback/files.find
3、前提条件
要使用 c r o n服务,必须安装vixie-cron RPM软件包,而且必须在运行了crond服务的条件下。
检查软件包是否已安装:
[root@nod1 ~]# rpm -q vixie-cron
vixie-cron-4.1-36.EL4
[root@nod1 ~]#
要判定该服务是否在运行,使用/sbin/service crond status命令:
[root@nod1 ~]# service crond status
crond (pid 4516) is running...
[root@nod1 ~]#
如果服务没有启动,用/sbin/service crond start 命令启动。
二、任务定义的意义
1、监控大文件
为什么要监控大文件呢?其实主要的目的是想监控oracle数据库的日志文件的大小。Oracle的一些进程不会切换日志,当数据库运行了很长一段时间后,这些日志文件的大小就会变得很惊人。像前段时间的Portal,有2个日志文件甚至达到了7.5G和2.6G,这就导致了服务器的I/O消耗很大,影响服务的运行。
2、数据库备份
数据库备份的重要性就不冗述了。
三、用find命令监控大文件
Find命令的一般形式为:
find pathname -options [-print -exec -ok]。
这里对find命令的详细语法也不冗述。
下面就是查找大文件的命令:
find /u01/app/oracle/product/10.1.0/db_1/ -size +8388608c -exec ls -l {} ; >> /u01/oraback/files.find
意思是:查找$ORACLE_HOME下的文件大小大于8M的文件,并执行ls –l命令,将结果写到指定的监控日志文件中files.find中。
四、定时备份数据库,并存储到磁带库的脚本
脚本如下:
#文件名:db_backup.sh
#路径:/u01/oraback/
#定义shell中使用的变量
str=`date +'%Y%m%d'`
BACKUP_DIR=/u01/oraback
#运行Oracle用户的bash_profile,设置当前运行的一些环境变量
cd /home/oracle
. .bash_profile
#开始
echo "****************************************************************" >> $BACKUP_DIR/Backup.log
#用datapump命令导出znuel_dev的方案
expdp username/******** schemas=username directory=oraback dumpfile=$str.dmp logfile=$str.log
echo `date +'%Y%m%d %H:%M:%S'` "Step 1:EXPDP Finished!" >> $BACKUP_DIR/Backup.log
echo "Directory:$BACKUP_DIR" >>$BACKUP_DIR/Backup.log
echo "DumpFile: $BACKUP_DIR/$str.dmp" >> $BACKUP_DIR/Backup.log
echo "LogFile:$BACKUP_DIR/$str.log" >> $BACKUP_DIR/Backup.log
#压缩dmp和log文件
cd $BACKUP_DIR
tar -czvf $str.tar.gz $str.dmp $str.log
echo `date +'%Y%m%d %H:%M:%S'` "Step 2:Compress Finished!" >> $BACKUP_DIR/Backup.log
echo "File:$BACKUP_DIR/$str.tar.gz" >> $BACKUP_DIR/Backup.log
#备份压缩文件到磁带库
tar -rvf /dev/st0 $str.tar.gz
echo `date +'%Y%m%d %H:%M:%S'` "Step 3:Backup to Tape Storage Finished!" >> $BACKUP_DIR/Backup.log
#删除15天前的文件,即本地只备份15天的数据
find $BACKUP_DIR -name "*.dmp" -mtime +15 -exec rm {} ;
find $BACKUP_DIR -name "*.log" -mtime +15 -exec rm {} ;
find $BACKUP_DIR -name "*.tar.gz" -mtime +15 -exec rm {} ;
echo `date +'%Y%m%d %H:%M:%S'` "Step 4:Delete Expired Files Finished!" >> $BACKUP_DIR/Backup.log
echo `date +'%Y%m%d %H:%M:%S'` "All Step Finished!" >> $BACKUP_DIR/Backup.log
#End
五、定义crontab
在Oracle用户下用crontab –e命令创建定时任务:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=oracle
HOME=/
# Export ECampus Data & Backup to the Tape Storage
30 1 * * * /u01/oraback/db_backup.sh
# Find the files while larger than 8M at 1am everyday
0 1 * * * echo "*************************************" >> /u01/oraback/log.find
1 1 * * * echo `date` >> /u01/oraback/log.find
2 1 * * * find /u01/app/oracle/product/10.1.0/db_1/ -size +8388608c -exec ls -l {} ; >> /u01/oraback/files.find
定义完后:wq,crontab就会自动生成oracle用户的任务文件,存放在/var/spool/cron中的以用户名命令的文件中。
cron守护进程每分钟都检查/etc/crontab文件、etc/cron.d/目录、以及/var/spool/cron目录中的改变。如果发现了改变,它们就会被载入内存。这样,当某个crontab文件改变后就不必重新启动守护进程了。[@more@]