昨天做了MySQL数据库的备份基本操作的实验,今天试一下MySQL数据库的定时自动备份。

  大概思路就是,首先为备份文件单独创建一个目录,然后再目录下创建Shell脚本里写上执行数据库备份的命令,并且给这个Shell脚本添加可执行的权限,最后给这个Shell脚本添加到crond计划任务,让它每天定时执行。

1、首先进入home目录,创建一个mysqlBackup的目录,然后进入这个目录

mysql定时备份到远程服务器 mysql定时备份数据库_Shell

 

  2、创建一个.sh后缀的文件,

mysql定时备份到远程服务器 mysql定时备份数据库_Shell_02

 

 3、编辑Shell脚本,备份所有数据库到/home/mysqlBackup目录下,并命名为Back_年月日_时分秒.sql

mysql定时备份到远程服务器 mysql定时备份数据库_数据库_03

 

  4、为备份文件添加X执行操作,并且我取消了同组、其他用户的读权限,因为脚本里面有数据库密码=..=

mysql定时备份到远程服务器 mysql定时备份数据库_mysql定时备份到远程服务器_04

 

  5、执行一下康康

mysql定时备份到远程服务器 mysql定时备份数据库_数据库_05


 成功了

6、下面删俩库,拿这个恢复备份测试一下

当前状态:

mysql定时备份到远程服务器 mysql定时备份数据库_mysql定时备份到远程服务器_06

 

 把两测试用的库删了

mysql定时备份到远程服务器 mysql定时备份数据库_Shell_07

 

 恢复备份

mysql定时备份到远程服务器 mysql定时备份数据库_mysql定时备份到远程服务器_08

 

但是这里报错了,我又试了一下手工备份,发现是可以恢复的

 

mysql定时备份到远程服务器 mysql定时备份数据库_mysql定时备份到远程服务器_09

 

 

 这个问题花了我半天时间,最后发现原因是出在了脚本上,脚本里面的sql语句是将密码直接写在了参数-p 后面,而之前的操作都是-p后面没有输入密码通过后面密码出入窗输入的。

下面对比一下不直接输入密码和直接输入密码生成的两个文件a.sql和b.sql

mysql定时备份到远程服务器 mysql定时备份数据库_数据库_10

 

下面图片可以明显看出来a.sql文件文件大小为849000+,而b.sql只有203

 

mysql定时备份到远程服务器 mysql定时备份数据库_数据库_11

 

 所以想要用.sh完成备份数据库就需要解决脚本与服务器输入数据库密码这个交互的过程,我觉得用expect这个工具应该也是可以实现的,但我搜了一波别人是怎解决的发现,发现好像别人的脚本里都是将一些数据库的信息赋值给了变量,然后调用变量来备份的,然后我修改了一下Shell脚本。

 

mysql定时备份到远程服务器 mysql定时备份数据库_sql_12

 

 

 这次执行也报错了

mysql定时备份到远程服务器 mysql定时备份数据库_mysql定时备份到远程服务器_13

 

 原因是因为在MySQL5.6之后版本的数据库的安全机制,大概意思就是在命令行使用密码可能不安全,所以这个也是用不了的。

 解决这个问题需要修改数据库的my.cnf配置文件

mysql定时备份到远程服务器 mysql定时备份数据库_数据库_14

 

 这样备份数据库可以使用:

mysqldump --defaults-extra-file=/etc/my.cnf --all-databases > bak.sql

还原备份也可以用:

mysql --defaults-extra-file=/etc/my.cnf < bak.sql;

其实回复备份呢,输密码也无所谓了

mysql定时备份到远程服务器 mysql定时备份数据库_sql_15

 

 

 然后再编辑一个.sh脚本

mysql定时备份到远程服务器 mysql定时备份数据库_sql_16

 

 添加权限执行一下

mysql定时备份到远程服务器 mysql定时备份数据库_mysql定时备份到远程服务器_17

mysql定时备份到远程服务器 mysql定时备份数据库_sql_18

 这次测试一下能不能还原,添加一个数据库

mysql定时备份到远程服务器 mysql定时备份数据库_数据库_19

 

进行备份

mysql定时备份到远程服务器 mysql定时备份数据库_sql_20

 

 删除测试的数据库

mysql定时备份到远程服务器 mysql定时备份数据库_数据库_21

 

 用不输入密码的方式试一下能不能恢复备份

mysql定时备份到远程服务器 mysql定时备份数据库_sql_22

  这样被删除的数据库就已经恢复了

 7、将Shell脚本添加到计划任务

首先看一下crond的状态,发现是开着的

mysql定时备份到远程服务器 mysql定时备份数据库_数据库_23

 

 然后编辑/etc/crontab这个文件,将shell脚本添加到配置文件中

mysql定时备份到远程服务器 mysql定时备份数据库_mysql定时备份到远程服务器_24

 

 这个规则也比较简单

*    *    *    *    *    用户 脚本
*表示一个小时的第几分钟,可以输入0-59
    *表示一天的第几个小时,可以输入0-23
        *表示一个月的第几天,可以输入1-31
                *表示一年的第几个月,可以输入1-12
                    *表示星期几,可以输入0-6,0或者7表示周日
 
0    2    *    *    *    用户    脚本    //表示每天两点执行
0    2    *    *    7    用户    脚本    //表示每周日两点执行
0    2    10,20,30    *    *    用户    脚本    //表示每周月10号、20号、30号执行
*/1  *    *    *    *    用户    脚本    //每分钟执行一次
0    *    *    *    *    用户    脚本    //表示每天整点执行

然后星期几的那个和与月日感觉不是很搭,还是看自己需要吧

 

下面试一下,先把备份删了,然后定个时试执行备份脚本

mysql定时备份到远程服务器 mysql定时备份数据库_mysql定时备份到远程服务器_25

 

 现在是38,定个40看看

mysql定时备份到远程服务器 mysql定时备份数据库_数据库_26

 

 诶,成功了

mysql定时备份到远程服务器 mysql定时备份数据库_数据库_27

 

总结一下就是

1、将密码写在数据库配置文件my.cnf中(或许还有其他更好的办法)

2、使用Shell脚本编写备份语句,并且给这个shell脚本可以执行的权限

3、通过crond计划任务,定时执行Shell脚本 

但是这样会不会不符合数据保密性呢?