MySQL在Linux自动定时备份功能

  • 发布时间:2017年11月3日 13:28
  • 作者:杨仕航

最近比较忙,写博客少了。现在项目上线,稍微闲下来把一些很用的经验总结书写分享给大家。

这次项目开发用到的数据库是MySQL数据库。数据是相当重要的、无价的。一旦数据丢失,可能会丢失造成很大的损失。所以我们需要给它定时备份。备份方法可以查看MySQL官网的文档。它官网提供了几种方法。而我这个项目使用的MySQL版本是非企业版,只能手动备份。它没有提供自动定时备份功能。

简单查阅资料,决定使用mysqldump + crontab的方式实现定时备份。


mysqldump是MySQL导出数据库数据的命令;crontab是Linux定时执行任务的命令。所以我们可以写一段Linux脚本,该脚本把MySQL数据库中的数据导出到指定文件。再将该脚本交给crontab定时执行。


mysqldump导出数据库数据一般在命令行书写的格式如下:

mysqldump -u root -p 数据库名称 > 导出文件名.sql


再输入对应的数据库用户密码即可导出数据库到指定位置。而我们需要写成Linux脚本,需要让脚本可以直接导出,无需手动输入密码。那么mysqldump书写格式如下:

mysqldump -u root --password=对应的密码 数据库名称 > 导出文件名.sql


当然,这种明文写密码的方式,Linux会发出警告。所以最好不要用数据库的root用户,得使用有操作该数据库权限的对应子用户。一旦该脚本文件泄露了,也只是泄露了子用户的信息。


另外,假如我每隔1小时备份一次,1天会产生24个备份文件。这24个备份文件不能名字重复,才能同时保留。所以我们生成备份文件名还需不同。不同文件名的问题好处理,可以依据时间创建文件。这些关键点都理清了,才看得懂我即将要给大家写的Linux脚本。


先找个文件夹专门用于存放脚本和备份文件。我在~目录创建backups文件夹,该文件夹用于存放相关备份的脚本。进入backups文件夹,在backups文件夹内创建data。该data文件夹专门用于存放备份文件。

cd ~
mkdir backups
cd backups
mkdir data


执行vim命令创建脚本文件:

vim auto_backup.sh


写入如下Linux脚本代码:

#!/bin/bash
date_str=$(date +%Y%m%d_%H%M%S)
cd ~/backups
mysqldump -u 数据库用户名 --password=数据库密码 数据库名称 > data/backup_$date_str.sql
echo backup_$date_str.sql OK


再退出保存(Esc退出编辑,输入:wq退出并保存)。其中第2行命令是根据日期和时间得到一个字符串并保存为变量。在导出的时候,文件名使用该变量则可实现备份文件名不同。第4行命令的用户名什么可自行填写。

我们在给该文件添加执行权限:

chmod +x auto_backup.sh


测试该脚本看是否可以正常执行:

./auto_backup.sh


若正常执行,会输出一句类似“backup_20171103_091200.sql OK”的信息,并在data文件夹中有个sql文件。若执行有误,检查看看用户名和密码之类的信息是否正确,以及是有执行导出的权限。


成功执行后,我们可以开始设置定时任务实现定时备份。

一般Linux会预装cron或crond。可以使用service命令查看是否有cron或crond服务:

service cron status
# 或者
service crond status


若存在对应服务,会显示该服务的运行状态。若这两个都没有,先安装其一。怎么安装我这里就不赘述,可自行查找。下面我以cron为例讲解。

同样在~/backups目录,创建一个cron计划任务文件:

vim auto_backup.cron


写入如下内容:

0 * * * * ~/backups/auto_backup.sh


并保存退出。该语句意思是每小时的0分时刻,执行auto_backup.sh脚本。

这句语句是crontab的语法。共6个参数,分别是 分、时、天、月、星期几、要执行的命令。

最后一个参数很直白,相信一下就能看懂。而前面5个参数需要理解它们的写法。

它们都有取值范围,分别如下:

分:0-59

时:0-23

天:1-31

月:1-12

星期几:0-7(其中0和7都代表星期天)


上面的*号也等同于它们全部的值。例如分钟写个*号,代表0-59。

所以上面的0 * * * *,表示全部月份,全部天数,全部星期几,全部小时的0分时刻执行一次。即每到0分时刻执行一次。

若写成* * * * *,表示全部月份,全部天数,全部星期几,全部小时,全部分钟执行一次。即每分钟执行一次。

既然*代表全部范围,* * * * *也可以写成 0-59 * * * *。这里也引出短横线的用法,0-59表示从0到59,那么我也可以写0-5。0-5 * * * *,表示每到0,1,2,3,4,5分的时刻都执行一次。

同样,0-5 * * * *,可以写成 0,1,2,3,4,5 * * * *。如此一来,有引出逗号的用法。

当然,逗号的写法是最自由,也是最长的写法。我可以写0,2,4 * * * *,在0分、2分和4分时刻执行一次命令。

若我想在偶数分钟都执行一次,用逗号的写法就很麻烦。我们可以用另外一种写法:0-59/2 * * * *,表示每隔2分钟执行一次。

看懂这些规则之后,你可以自行设置自动备份的时间。


回到刚刚的auto_backup.cron文件。我们再把这个计划任务加入执行列表并输出日志到指定文件:

crontab ~/backups/auto_backup.cron > ~/backups/auto_backup.log


还要重启cron服务,才能生效:

service cron restart


到这里已经完成MySQL自动定时备份功能了。

还有几个细节要说明一下:

1、查看任务:crontab -l

2、删除任务:crontab -r

3、还原数据:进入MySQL,用source命令可以使用sql文件还原数据

上一篇:django-ckeditor后台富文本编辑器

下一篇:Django查询对比其他字段

评论列表

智慧如你,不想发表一下意见吗?

新的评论

清空