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