MySQL + crontab 定时备份数据库

摘要:在生产环境中什么最重要?如果我们服务器的硬件坏了可以维修或者换新, 软件问题可以修复或重新安装, 但是如果数据没了呢?就问你怕不怕? 所以, 为了在数据丢失之后能够恢复数据, 我们就需要定期的备份数据。

工作原理

工作原理其实很简单,就是编写一个备份的 shell 脚本,然后利用 crontab 工具增加一定时任务,然后就可以实现指定时间的备份数据库工作。


准备工作

安装 crontab 工具

[root@host ~]# yum -y install vixie-cron
[root@host ~]# yum -y install crontabs


步骤如下

1、创建备份目录。

[root@iZ2ze3bc56k6c6h3fil2zgZ /]# cd /home/
[root@iZ2ze3bc56k6c6h3fil2zgZ home]# mkdir mysql_backup
[root@iZ2ze3bc56k6c6h3fil2zgZ home]# cd mysql_backup/


2、创建备份数据库 shell 脚本。

[root@iZ2ze3bc56k6c6h3fil2zgZ mysql_backup]# vim mysql_backup.sh


3、编写内容后保存退出,记得对这个shell脚本增加可执行权限。

#!/bin/bash

mysql_backup_path=/home/mysql_backup/`date +%Y-%m-%d`;

mkdir -p $mysql_backup_path;
chmod 500 $mysql_backup_path;

mysqldump -uxxxxxx -pxxxxxx dbname | gzip > $mysql_backup_path'/mysql_backup_'`date +%Y-%m-%d`.sql.gz


4、执行下这个mysql_backip.sh文件,看看是否可以备份成功。

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

有一个 wanning 报错,意思是在命令行使用密码可能不安全,其实这样并不影响导出和备份,也会导出成功。

[root@iZ2ze3bc56k6c6h3fil2zgZ mysql_backup]# ll
total 8
dr-x------ 2 root root 4096 Jan 18 10:57 2019-01-18
-rwx------ 1 root root  349 Jan 18 10:56 mysql_backup.sh
[root@iZ2ze3bc56k6c6h3fil2zgZ mysql_backup]# cd 2019-01-18/
[root@iZ2ze3bc56k6c6h3fil2zgZ 2019-01-18]# ll
total 28
-rw-r--r-- 1 root root 26720 Jan 18 10:57 mysql_backup_2019-01-18.sql.gz

但是既然有 wanning 我们就来解决下吧,如果没有报错或者不解决直接执行下一步。

打开mysql的官方文档:https://dev.mysql.com/doc/refman/5.7/en/password-security-user.html

翻了下文档大致意思是:

当您运行客户端程序以连接到 MySQL 服务器时,不建议以将其公开给其他用户发现的方式指定您的密码。此处列出了运行客户端程序时可用于指定密码的方法,以及每种方法的风险评估。简而言之,最安全的方法是让客户端程序提示输入密码或在受适当保护的选项文件中指定密码。以这种方式输入密码比在命令行中指定密码更安全,因为其他用户看不到密码。但是,这种输入密码的方法仅适用于以交互方式运行的程序。如果要从非交互式运行的脚本调用客户端,则无法从键盘输入密码。在某些系统上,您甚至可能会发现脚本的第一行被读取并被解释(错误地)作为您的密码。

找到问题所在,解决方案如下:

将密码存储在选项文件中。找到你的 my.cnf 文件中的 [client] 部分添加你的密码,点击保存退出,这里修改完后没有必要重启 MySQL 服务

[client]
password=xxxxxx

然后编辑 mysql_backup.sh 文件,根据官网的文档提示,将刚才的导出语句替换为这样,点击保存退出

#!/bin/bash
.
.
.
mysqldump --defaults-file=/etc/my.cnf dbname | gzip > $mysql_backup_path'/mysql_backup_'`date +%Y-%m-%d`.sql.gz

然后再来执行下这个 mysql_backip.sh 文件,报错解决

[root@iZ2ze3bc56k6c6h3fil2zgZ mysql_backup]# ./mysql_backup.sh 
[root@iZ2ze3bc56k6c6h3fil2zgZ mysql_backup]#

我的 MySQL 版本是 5.7 的,后来网上翻了一波,说的是 MySQL5.6 不允许直接在 mysqldump 命令里面输入用户名、密码执行导出,但是允许在 my.conf 里面直接配置好 mysqldump 的用户密码,在执行 mysqldump 命令的时候无需显示输入用户密码了。看见这个我还找了一个 MySQL5.5 版本的试了下,确实 MySQL5.5 版本是可以支持命令里面输入用户名,密码导出的。

不管怎么样,这样测试后导出成功,而且没有报错,这样就大功告成了,直接下一步


5、查看导出目标文件夹,导出数据正常,那就是证明这个 shell 没有问题。

[root@iZ2ze3bc56k6c6h3fil2zgZ mysql_backup]# ll
total 8
dr-x------ 2 root root 4096 Jan 18 11:02 2019-01-18
-rwx------ 1 root root  248 Jan 18 11:02 mysql_backup.sh
[root@iZ2ze3bc56k6c6h3fil2zgZ mysql_backup]# cd 2019-01-18/
[root@iZ2ze3bc56k6c6h3fil2zgZ 2019-01-18]# ll
total 28
-rw-r--r-- 1 root root  8741 Jan 18 11:02 mysql_backup_2019-01-18.sql.gz


6、对这个 shell 脚本增加一个定时任务,每天凌晨 1 点定时备份下数据库。

[root@iZ2ze3bc56k6c6h3fil2zgZ mysql_backup]# crontab -e
0 1 * * * /home/mysql_backup/mysql_backup.sh > /dev/null 2>&1


参考:

crontab_百度百科

结束语:感谢您对本网站文章的浏览,欢迎您的分享和转载,但转载请说明文章出处。
Top