前言
在Linux操作系统上实现MySQL的自动备份,主要需要两个资料,一个是MySQL数据库备份所需要的脚本,一个是crontab这样的定时任务执行程序。这个脚本可以是任何语言的,只要最终能够将MySQL数据库,导出成SQL文件或者其他你需要的文件即可,而定时任务执行程序,可以是Linux下常用的crontab,也可以是其他定时任务程序。
本文是以shell脚本及crontab定时任务为基础,实现的MySQL数据库定时自动全量备份。其功能具体描述为:
+ 实现当前Linux服务器上MySQL服务器里的所有库的全量数据+结构备份;
+ 实现备份脚本只保留近15天,15天以前的备份脚本自动删除;
+ 实现每天在指定的时间开始进行备份工作。
准备工作
使用如下命令安装crontab(已安装的可以跳过)
yum install -y vixie-cron crontabs
创建mysql备份文件的存放路径
mkdir -p /alidata/backup/databases
mkdir -p /alidata/backup/databases/mysql
这里的路径可以根据实际情况修改,但是如果修改了这里的路径,也需要修改下面备份脚本里的路径。这里的路径只需要具有root权限就可以了。
MySQL备份脚本
下面先贴出本文所需要使用的MySQL备份脚本
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/alidata/server/mysql/bin:/root/bin:~/bin
export PATH#current datetime
DATE=(date -d ‘+0 days’ +%Y%m%d%H%M)#backup directory
BACKUP_ROOT=/alidata/backup/databases
BACKUP_DIR=mysql
DATA_DIR=mysql_DATE#get all database name
SQL_STRING=”SELECT SCHEMA_NAME AS db FROM information_schema.SCHEMATA WHERE SCHEMA_NAME NOT IN (‘mysql’, ‘information_schema’, ‘performance_schema’);”DBS=(echoSQL_STRING | mysql -Bs)
#package name
ZIP_NAME=”mysql_”DATE”.tar.gz”#remove backup of the database before 15 days
findBACKUP_ROOT/BACKUP_DIR -name “mysql_*.tar.gz” -type f -mtime +15 -exec rm {} \;for DBNAME inDBS
do
echo “backup “DBNAME;
if [ ! -d{BACKUP_ROOT}/{DATA_DIR} ]; then
mkdir -p{BACKUP_ROOT}/{DATA_DIR}
fi
SQL_FILE=DBNAME-DATE”.sql”
/alidata/server/mysql-5.6.21/bin/mysqldump –default-character-set=utf8DBNAME > BACKUP_ROOT/DATA_DIR/SQL_FILE
done#Use tar to package all sql files
cdBACKUP_ROOT
tar -czvPf BACKUP_DIR/ZIP_NAME DATA_DIR#After the success of the package to delete sql file
if [? = 0 ]; then
rm -rf BACKUP_ROOT/DATA_DIR
fiecho “mysql backup finished!”
下面对上面的备份用脚本进行解释。
首先,可以看到,在脚本开始时,对系统变量PATH进行了重新的复制和导入,这是因为使用crontab执行脚本时,不像是平时人工使用ssh连接登录CentOS系统那样,因为没有登录动作,所以没有用户,所以就没有了系统变量,这样在命令中涉及到的一个命令,可能会变为未定义的命令,无法执行,所以,这里先定义环境变量。这里需要说明,每台电脑的环境变量都不尽相同,所以可以使用
echo $PATH
命令进行查看,然后将其结果,复制到这个位置上,替换这个脚本中的内容;
第二,可以看到整个脚本中,并未出现MySQL的用户名和密码,这是因为本文所描述的情况中,使用的是MySQL 5.6的版本,在5.6的版本中,若将MySQL的用户名、密码在脚本中输入和执行,会被警告为不安全的做法,所以需要将备份所需要的用户名和密码存放在MySQL的配置文件,即my.cnf文件中,具体形式如下
[mysql]
user=root
password=123456[mysqldump]
user=root
password=123456
其中,mysql的部分是mysql命令所使用的用户名和密码,mysqldump的部分是mysqldump命令所使用的用户名和密码,这里一定要这样分开写清楚,否则会被提示为没有权限;
第三,这个脚本的大致流程是,查询到所有的数据库名称,然后使用dump命令导出每个数据库的结构和数据,将其放在一个临时文件夹中(临时文件夹的名字为:mysql_+年月日时分秒),当所有的数据库都导出完毕后,将这个临时文件打包并放入预先准备好的文件夹中。在上述过程中,还有一个漏掉的逻辑就是,找到修改时间已经超过15天的压缩包,并将其删除。
总体来说,这个脚本还是非常好理解的。
设置定时任务
假设我们现在做备份的是一台正在上线使用的服务器,我们通过分析服务器的访问情况后,得到每天凌晨的2:30至3:30之间是访问量最低的时间段,那我们就需要在这段时间内完成数据库的备份。接下来使用crontab实现这个功能,首先使用
crontab -e
命令打开定时任务列表,类似于使用vim编辑文本,我们设置每天的2:35开始进行数据库备份,则具体内容如下:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/# For details see man 4 crontabs
# Example of job definition:
# .—————- minute (0 – 59)
# | .————- hour (0 – 23)
# | | .———- day of month (1 – 31)
# | | | .——- month (1 – 12) OR jan,feb,mar,apr …
# | | | | .—- day of week (0 – 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,f ri,sat
# | | | | |
# * * * * * user-name command to be executed
35 2 * * * /root/backup_mysql.sh
其中35代表执行的分钟,2代表执行的小时,后面的*代表每天每月每周,后面的内容是要执行的脚本所存放的路径,这里是将脚本存放在root用户的home目录下,即/root目录,这里具体可以查看crontab相关的资料文档。
至此,我们完成了,每天凌晨2:35分自动备份当前服务器上除mysql、information_schema、performance_schema以外,所有MySQL数据库的操作。
总结
本文的重点还是自动备份脚本,其中需要注意如何获取当前MySQL服务器中的所有数据库;如何在配置文件中配置mysql命令及mysqldump命令所使用的用户名和密码;如何实现删除15天之前的压缩包等几个知识点,解决了这些问题,自动化备份就变的简单的多了。