1 功能介绍
脚本名 bakrec_mysql.sh
脚本存放路径 保证统一
备份路径 须根据具体服务器的分区情况,放到一个剩余空间较大的分区.
备份目录名 统一为backupdb
各个参数说明如下:
-a: backup all database #全库备份
-e: backup each database#分库备份
-d: backup single/multi database#备份指定的一个库或者多个库
-t: backup single/multi table of single database#备份一个库下面的一个表或者多个表
-b: backup binlog#备份binlog日志,备份过程,每次记录最后的二进制文件号,将之前范围内的binlog打包(bz2格式),放在$DIR_BACKUP目录下
-r: recover all database(!require password!)#恢复全库,为保安全,恢复时需要输入密码
-o: recover single database/talbe,you should be designation database name(!require password!)#恢复单库或单表,恢复时需要输入密码
-p: create connect mysql password#创建连接mysql的密码文件,存放位置$DIR_MySQL/etc目录下,权限是600
-s: configuration rsyncd#创建rsyncd服务(因backup机上有rsyncd服务,故不需要在每台DB server上创建rsyncd服务)
If you want ceate a rsyncd, you should enter 'bakrec_mysql.sh -s cet'
If you want restart rsyncd, you should enter 'bakrec_mysql.sh -s rst'
-c: sync to backup center#同步到backup机
2 备份策略 2.1 分库备份
在脚本的LIST_EXCLUDE_DB='(test|information_schema|performance_schema)'可以过滤不备份的数据库.
备份路径 根据服务器具体分区情况而定
备份目录名统一 backupdb
关于是否打开binlog的函数解释
function backup()
{
read_pwd
LOGBIN_STATUS=`$CMD_MYSQL -u$USER -p$PASSWD -N -s -e "SHOW VARIABLES LIKE 'log_bin'" | gawk '{print $2}'`
if [ $LOGBIN_STATUS = "ON" ]; then
MASTER='--master-data=2'
else
MASTER=' '
fi
}
这个函数的功能是检测MySQL服务器有没有打开binlog日志,如果打开,则在备份的时候添加--master-data=2这个参数,否则不添加.
分库备份在脚本中的实现函数为backup_each
function backup_each()
{
backup
for db in $($CMD_MYSQL -u$USER -p$PASSWD -N -s -e "SHOW DATABASES"|egrep -v $LIST_EXCLUDE_DB)
do
$CMD_MYSQLDUMP -u$USER -p$PASSWD -x -R $MASTER $db --databases |gzip >$HOSTNAME.$db.$TIME.sql.gz
done
# delete 7 days ago
for db in $($CMD_MYSQL -u$USER -p$PASSWD -N -s -e "SHOW DATABASES"|egrep -v $LIST_EXCLUDE_DB)
do
if [ ! -f $HOSTNAME.$db.$TIME_7.sql.gz ]; then
echo
else
rm $HOSTNAME.$db.$TIME_7.sql.gz -f
fi
done
}
功能说明:
依次备份除列表之外的所有库,在本机会自动删除7天之前的备份
2.2 binlog备份
binlog备份在脚本中的实现函数为backup_binlog
function backup_binlog()
{
if [ -s $DIR_BACKUP/mysql-bin.queue ]; then
read POS < $DIR_BACKUP/mysql-bin.queue
cd $DIR_DATA
tar -jcvf $DIR_BACKUP/$TIME_YM/$HOSTNAME.$POS.$TIME.bz2 `gawk -F'/' '{print $2}' $BINLOG_NAME.index |sed -n "/$POS/,//p"`
cd -
if [ -f $DIR_BACKUP/$TIME_YM/$HOSTNAME.$POS.$TIME_7.bz2 ]; then
rm $DIR_BACKUP/$TIME_YM/$HOSTNAME.$POS.$TIME_7.bz2 -f
fi
fi
# write last pos
gawk -F'/' '{print $2}' $DIR_DATA/$BINLOG_NAME.index | tail -n 1 >$DIR_BACKUP/mysql-bin.queue
}
逻辑如下:
1,如果检测到$DIR_BACKUP/mysql-bin.queue这个文件,并且文件大小大于0个字节.则读取这个文件内容,并付给变量POS,然后执行tar –jcvf命令,并删除7天之前的备份,否则直接执行gawk命令.
2,gawk命令的意思是把当前binlog日志的编号记录到$DIR_BACKUP/mysql-bin.queue文件内.
2.3 推到备份机
实现功能代码如下
c)
rsync -czrpt --password-file=$DIR_BIN/bakrec_mysql.password $DIR_BACKUP/$TIME_YM [email protected]::backup/$HOSTNAME
result_status
;;
rsync参数的意思如下:
c: 打开校验开关,强制对文件传输进行校验
z: 对备份的文件在传输时进行压缩处理(节省网络带宽,消耗本机CPU)
r: 对子目录以递归模式处理
p: 保持文件权限
t: 保持文件时间信息
同步的目录$DIR_BACKUP/$TIME_YM
backup主机IP地址192.168.0.1
result_status函数功能,如果该语句执行失败,则发送邮件给db-request
2.4 backup机设置
在backup机上面修改rsync配置,添加模块backup上面的配置如下
uid = root
gid = root
max connections = 10
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
[backupdb.cn5]
path = /backup
hosts allow = *
hosts deny = *
ignore errors
read only = no
list = no
auth users = user
secrets file = ****/password
说明
password为rsync连接的密码文件,格式
user:password
权限600
3 使用说明 3.1 定义变量
根据服务器情况,可能会修改如下变量
DIR_MYSQL='/usr/local/mysql'
DIR_BACKUP="/tmp/backup"
对于rpm安装,或者非常规的安装,可能还需要修改
CMD_MYSQLDUMP="$DIR_MYSQL/bin/mysqldump"
CMD_MYSQL="$DIR_MYSQL/bin/mysql"
3.2 创建MySQL密码文件
执行脚本,加-p参数,自动创建$DIR_MYSQL/etc/passwordfile文件,输入密码,脚本会自动写入该文件
# bash bakrec_mysql.sh -p
Please enter MySQL(user=root)'s password:
验证密码文件创建成功与否,以及权限600
# ls -l $FILE_PASSWD
查看密码文件内容
# cat $FILE_PASSWD
3.3 创建rsync密码文件
权限600
3.4 测试备份与推送
bash –x 脚本名 测试的参数
可以看到脚本的执行过程.
-c参数是将备份目录内容,推送到backup机
3.5 crontab设置
crontab执行脚本出错总结:
1) 脚本本身问题
2) 脚本执行权限问题
3) 脚本名字拼写问题,指定了错误的脚本名
4) 遗漏了脚本中需要的密码文件
5) 备份的目录不存在