在Linux服务器环境维护中,通常会mysqldump命令来备份数据库,通常命令如下
mysqldump -uusername -ppassword --databases databasename > dumpfilename
基于上述命令,我们可以将导出的sql文件进行压缩和管理,编写为shell脚本后,整体shell脚本如下
BakDir=/opt/mysql-back/database-back
LogFile=/opt/mysql-back/mysql_buckup.log
Date=`date +%Y%m%d`
Begin=`date +"%Y年%m月%d日 %H:%M:%S"`
cd $BakDir
DB=test
DumpFile=$DB$Date.sql
GZDumpFile=$DB-$Date.sql.tar.gz
# 检查备份目录是否存在
if [ -d "$BakDir" ]
then echo "[INFO]开始执行数据库备份程序....."
else mkdir $BakDir
fi
# 进入指定目录开始执行备份逻辑 -- 在使用crontab执行命令时,会因为绝对路径问题导致导出数据为null,需在mysql绝对路径下执行
# 下面的/opt/mysql/bin为我这边的mysql安装目录的bin目录
# 执行备份命令
echo "[INFO] /opt/mysql/bin/mysqldump -uroot -p123456 --databases $DB > $DumpFile" >> $LogFile
/opt/mysql/bin/mysqldump -uroot -p123456 --databases $DB > $DumpFile
mv $DumpFile $BakDir
cd $BakDir
# 对备份数据进行压缩
echo "[INFO] tar czvf $GZDumpFile $DumpFile" >> $LogFile
tar czvf $GZDumpFile $DumpFile
# 删除备份的sql文件
echo "[INFO] rm $DumpFile" >> $LogFile
rm $DumpFile
# 备份 备份的sql文件到指定目录
echo "[INFO] mv $GZDumpFile $BakDir" >> $LogFile
mv $GZDumpFile $BakDir
Last=`date +"%Y年%m月%d日 %H:%M:%S"`
echo 开始:$Begin 结束:$Last $GZDumpFile 执行成功 >> $LogFile
#清理备份,保留30天的备份
find $BakDir/* -mtime +30 -exec rm {} \;
echo "[INFO]备份任务执行结束....."
上述脚本大概分为以下几个部分:
1、首先我们通过mysqldump命令将数据库备份下来,按照当前日期进行命名;
2、然后将数据库备份文件移动到指定位置
3、对数据库备份文件进行文件压缩并删除备份文件
4、清理一个月前的备份文件,任务执行结束;
就这样,shell脚本就编写完成了,直接使用sh命令去执行,数据库成功备份并压缩到指定目录;
接下来我们就需要使用定时任务,让定时任务去执行备份数据库的脚本;这里呢,采用crontab来指定这个定时任务,cron是一个linux下 的定时执行工具,可以在无需人工干预的情况下运行作业。
查看cron表达式的一些基本命令
service crond start //启动服务
service crond stop //关闭服务
service crond restart //重启服务
service crond reload //重新载入配置
service crond status //查看服务状态
我们需要确保服务是开启的,如果不是,开启一下即可;查看crontab配置方式命令如下:vim /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
如上,cron表达式的一些简单说明,基于这里,我们可以实现一些简单的cron表达式(稍微复杂一点的我不会...)
1 3 * * * /opt/mysql-back/mysql_buckup.sh
上面这个表达式的意思是,每天凌晨3点零1分执行脚本mysql_buckup.sh;
了解了cron表达式后,我们开始添加一个cron执行计划;命令如下
crontab -e
# 按a进行编辑,输入
1 3 * * * /opt/mysql-back/mysql_buckup.sh
# 然后wq保存,可以通过crontab -l查看已配置的定时任务
crontab -l
完成crontab任务计划配置后,我们这边只需要重新加载一下配置文件即可,命令是service crond reload;
这样就可以实现定时执行任务了;下图为我这边近几日的执行结果
在这个过程中,有遇到一些坑,那就是使用crontab执行定时任务,导出的sql文件内容为空;后来改成了在mysql安装的路径的bin目录下执行的,解决这个问题;另外,还可以通过配置mysql的全局环境变量,也可以解决这个问题;