Linux定时压缩备份Mysql数据库并自动删除之前备份数据

项目中数据库很重要,偶尔也会发生一些突发状况造成数据库瘫痪甚至奔溃的情况。为了能及时恢复减少损失,数据的备份就显得很重要了。由于数据库资源在各个时间段使用情况不同,为了不影响业务的正常运行的同时,所以尽量选在数据库相对较闲的时候进行自动备份。日积月累,备份就多了,所以还要能自动删除时间比较长的备份。下面进入正题。

1、创建备份目录

[root@ZhOu usr]# mkdir databak

2、进入备份目录,新建脚本dataBackUp.sh

[root@ZhOu usr]# cd databak
[root@ZhOu databak]# pwd
/usr/databak
[root@ZhOu databak]# vi dataBackUp.sh

加入以下代码:

#!/bin/bash

dir=/usr/databak    --目标路径

now_date=$(date +%Y%m%d%H%M)   --当前日期,年月日时分。注意:date和+之间要有空格

--获取10天前的日期,也可以使用date -d '10 days ago' +%Y%m%d。注意:-10和-day中间不能有空格。
last_date=$(date -d -10-day +%Y%m%dH%M)  

mysqldump -uroot -proot  ad_sq | gzip > $dir/ad_sq_$now_date.sql.gz   --备份并压缩文件

rm -f $dir/ad_sq_$last_date.sql.gz   --删除旧文件

有一点需要注意,有些直接使用mysqldump时提示找不到命令,是因为没有配置环境变量的原因。需要在etc/profile中添加mysql的环境变量,在上一篇博文Mysql5.7.15安装配置中介绍过,不再赘述。或者把mysqldump的完整路径加上也可以解决。

3、给脚本赋权:

[root@ZhOu databak]# chmod +x dataBackUp.sh
[root@ZhOu databak]# ll
total 4
-rwxr-xr-x 1 root root 213 Sep 11 20:57 dataBackUp.sh

4、先执行脚本测试一下:

[root@ZhOu databak]# ./dataBackUp.sh 
mysqldump: [Warning] Using a password on the command line interface can be insecure.

提示mysqldump: [Warning] Using a password on the command line interface can be insecure.
这是因为直接把密码暴露出来了,系统发出的警告。所以dump的时候,应该写mysqldump -uroot -p ad_sq | gzip > ad_sq.sql.gz,然后会提示输入密码:

[root@ZhOu databak]# mysqldump -uroot -p ad_sq | gzip > ad_sq.sql.gz
Enter password: 

但是由于我们是在脚本中写的,自然不能这样做了,所以要加到mysql的配置文件my.cnf中去。

[root@ZhOu databak]# vi /etc/my.cnf 

然后加入下面代码,这样以后再使用mysqldump的时候,就不需要再写用户名和密码了。其他命令也是同样的道理。

[mysqldump]
 user=root
 password=root

这里写图片描述

脚本中就可以改为:

#!/bin/bash

dir=/usr/databak
now_date=$(date +%Y%m%d%H%M)
last_date=$(date -d -20-day +%Y%m%d%H%M)

mysqldump  ad_sq | gzip > $dir/ad_sq_$now_date.sql.gz

rm -f $dir/ad_sq_$last_date.sql.gz

执行一下,结果如下:
这里写图片描述

5、添加脚本到定时任务中去:

[root@ZhOu databak]# crontab -e

*/1 * * * * /usr/databak/dataBackUp.sh --确保实验,先每分钟执行一次

6、满以为大功告成,结果却出了意外,如下图:
这里写图片描述
从图中可以看出,第一个是手工执行脚本后的结果,大小大约6M。后面几个任务自动执行的,大小只有20bytes!明显没有导出数据!

7、分析原因,思路:
1)试了下把脚本中的mysqldump ad_sq | gzip > $dir/ad_sq_$now_date.sql.gz换成 /usr/mylocal/mysql/bin/mysqldump ad_sq | gzip > $dir/ad_sq_$now_date.sql.gz,也就是mysqldump的完整路径,crontab和手工执行结果都是成功的,这样写没问题;
2)如果是mysqldump ad_sq | gzip > $dir/ad_sq_$now_date.sql.gz这样的,手工执行时可以的,自动执行却是失败的。不甘心,上网找原因,原来是环境变量的锅!手动执行某个任务时,是在当前shell环境下进行的,程序当然能找到环境变量,而系统自动执行任务调度时,是不会加载任何环境变量的。因此,就需要在crontab文件中指定任务运行所需的所有环境变量,这样系统执行任务调度时就没有问题了。

#!/bin/bash

source /etc/profile  --这里很重要

dir=/usr/databak
now_date=$(date +%Y%m%d%H%M)
last_date=$(date -d -20-day +%Y%m%d%H%M)

mysqldump  ad_sq | gzip > $dir/ad_sq_$now_date.sql.gz

rm -f $dir/ad_sq_$last_date.sql.gz

7、修改好之后,再次等待结果,搞定!
这里写图片描述

8、根据数据库情况,修改定时任务规则。

总结:
mysqldump有很多种导出条件设置,实际中可以根据需要导出需要的表或者满足条件的数据,这里做的是整个数据库备份。关于压缩的数据,可以gunzip解压。实验达到了预期的效果,虽然中间不是很顺利,但是错误中学到了更多的东西,之所以拿出来分享一下,是希望大家引以为戒。不足之处,希望大家指出。

http://www.xuebuyuan.com/1122682.html
http://www.jb51.net/LINUXjishu/151805.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章