应用场景:利用linux定时任务+shell脚本实现数据库冷备
1、创建shell脚本#!/bin/bash
#数据库用户名
DB_USER='root'
#数据库密码
DB_PASSWD='xxxx'
#数据库名,可以定义多个数据库,中间以空格隔开,如:test test1 test2
DB_NAME=(dbname1 dbname2)
#备份时间
CURRENT_BACKUP_TIME=`date +%Y%m%d%H%M%S`
#日志备份路径
LOG_PATH='/data/mysql/backup/backup_log'
#数据备份路径
DATA_PATH='/data/mysql/backup/backup_data'
#日志记录头部
echo ”备份时间为$CURRENT_BACKUP_TIME,备份数据库 $DB_NAME 开始” >> $LOG_PATH/mysql_backup_log.log
#正式备份数据库
for DB in ${DB_NAME[@]};do
source=`mysqldump -u$DB_USER -p$DB_PASSWD $DB > $DATA_PATH/$DB-$CURRENT_BACKUP_TIME.sql` 2>> $LOG_PATH/mysql_backup_log.log;
#备份成功以下操作
if [ "$?" == 0 ];then
cd $DATA_PATH
#为节约硬盘空间,将数据库压缩
tar zcf $DB-$CURRENT_BACKUP_TIME.tar.gz $DB-$CURRENT_BACKUP_TIME.sql > /dev/null
#删除原始文件,只留压缩后文件
rm -f $DATA_PATH/$DB-$CURRENT_BACKUP_TIME.sql
echo “数据库 $DB 备份成功!!” >> $LOG_PATH/mysql_backup_log.log
#删除90天之前的备份
find $DATA_PATH -name $DB-*.tar.gz -type f -mtime +90 -exec rm -rf {} \; > /dev/null 2>&1echo "数据库 $DB 30天之前的备份数据被删除!!" >> $LOG_PATH/mysql_backup_log.log
else
#备份失败则进行以下操作
echo “数据库 $DB 备份失败!!” >> $LOG_PATH/mysql_backup_log.log
fi
done
注:该shell脚本不会自动创建目录,找不到目录会报错。手动执行一次刚创建的shell脚本,确保脚本没问题,在该脚本目录下执行命令:“./xxx.sh”,如果在windows上创建的脚本放到linux执行不了,可参考
2、利用crontab定时执行
原理很简单,就是利用cron表达式将编写好的脚本放到crontab中定时执行;
centos7可能安装了,执行命令看看有没有cat /etc/crontab文件,如果没安装可以用以下命令安装:yum install vixie-cron
yum install crontabs
执行 "vi /etc/crontab"修改crontab文件,在文件后面将脚本加到定时任务中:[root@iZj6c16ov8zzwm2ai5giarZ ~]# vi /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
0 12 * * * root /opt/soft/mysql_backup.sh #每天12点执行数据库备份
修改后不用重启,自动生效,crontab会每分钟检查一次配置文件。
3、centos7下crontab常用命令
/bin/systemctl start crond.service #启动
/bin/systemctl stop crond.service #停止
/bin/systemctl restart crond.service #重启
/bin/systemctl reload crond.service #重新加载
要让crontab开机自动启动,编辑/etc/rc.d/rc.local,在文件最后加上/bin/systemctl start crond.service即可
查看执行昌:tail -f /var/log/cron
查看当前用户的crontab,输入 crontab -l;
编辑crontab,输入 crontab -e
删除crontab,输入 crontab -r
添加任务例子crontab -e
0 */1 * * * command
0 */2 * * * command
查询任务是否加了:crontab -l -u root #查看root用户
0 */1 * * * command
0 */2 * * * command
基本格式 :
* * * * * command
分 时 日 月 周 命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
4、开启crontab邮件记录
如果定时任务执行了但却没得到应有的结果,可以配置邮件记录查看具体原因
修改配置:
vim /etc/postfix/main.cf
发现配置为:
inet_interfaces = localhost
inet_protocols = all
改为:
inet_interfaces = all
重启:
centos7
systemctl restart postfix.service
centos6
service postfix restart
等待crontab再次执行任务,然后查看日志:
tail -f /var/spool/mail/root
如果maill 有日志的时候,也会在控制台弹出这样的提示:
您在 /var/spool/mail/root 中有邮件
根据邮件内容的错误修改,就能正常执行crontab的任务了