在CentOS系统下实现MySQL自动全量备份

本文转载自:http://www.softeng.cn/?p=175,本文已获得作者授权,未经作者同意,不可转载。

前言

在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=$(echo $SQL_STRING | mysql -Bs)

#package name
ZIP_NAME="mysql_"$DATE".tar.gz"

#remove backup of the database before 15 days
find $BACKUP_ROOT/$BACKUP_DIR -name "mysql_*.tar.gz" -type f -mtime +15 -exec rm {} \;

for DBNAME in $DBS
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=utf8 $DBNAME > $BACKUP_ROOT/$DATA_DIR/$SQL_FILE
done

#Use tar to package all sql files
cd $BACKUP_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
fi

echo "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天之前的压缩包等几个知识点,解决了这些问题,自动化备份就变的简单的多了。

你可能感兴趣的:(服务器,centos,mysql,数据库,备份)