您的位置:首页 > 数据库 > MySQL

xtrabackup增量备份mysql +MHA

2016-07-28 21:02 507 查看
http://blog.csdn.net/yanggd1987/article/category/2214421
https://www.centos.bz/2013/09/innobackupex-auto-backup-with-shell/

之前我们提到过xtrbackup备份mysql的几种方式:完整备份、增量备份、部分备份等,但是在实际生产环境中用到最多的还是增量备份,下面我们就来写一个脚本。

此脚本在https://www.centos.bz/2013/09/innobackupex-auto-backup-with-shell/基础上重新修改。

[html] view plain copy

#!/bin/bash

#

#

#note:周日作完整备份,其它时间增量备份;每次增量备份后,都将incr_basedir打包压缩;若是本周最后一次增量备份,则备份完成后将本次备份内容直接打包压缩

#每次备份的日志都会将其移动到本次备份目录中,如:0_innobackupex.log表示全备,1_innobackupex.log表示第一次增备

#由于服务器空间有限,每周的做完整备份前会将上周的所有备份删除

#由于压缩是对绝对路径进行压缩,因此在使用tar命令进行压缩或解压时,都是用P参数或使用tar -C

#如果脚本停止或出错请到back_dir下查看日志,若此次备份没有问题,会将本次打印的日志转移到备份目录下

#定义相关变量

backup_base=/data/mysqlbak

full_backup_dir=$backup_base/mysql_full_backup

incr_backup_dir=$backup_base/mysql_incr_backup

sub_incr_dir=$(date +%w)

user=test

password=test

defaults_file=/etc/my.cnf

#include_db="centos.*|mysql.*"

error_lock_file=$backup_base/error.locked

backup_dir=$backup_base/log

#innobackupex性能参数

iops=400

mem=1GB

thread=4

#相关函数

#检查命令是否执行成功

if_sucess(){

local command="$1"

$command

if [ $? -ne 0 ];then

echo "error."

touch $error_lock_file

exit 1

fi

}

#检查是否存在锁文件,如果存在就退出。

check_locked(){

if [ -f "$error_lock_file" ];then

echo "error_lock_file found"

exit 1

fi

}

#压缩上次备份完整或增量备份

compress_old_backup(){

if_sucess "tar czPf ${incr_base_dir}.tar.gz $incr_base_dir"

if_sucess "mv ${incr_base_dir}.tar.gz $backup_base/old"

rm -rf $incr_base_dir

}

#程序从这里开始

check_locked

mkdir -p $full_backup_dir $incr_backup_dir $backup_base/old $backup_base/log

#输入日志相关

backup_log=${backup_dir}/${sub_incr_dir}_innobackupex.log

exec 100> $backup_log

exec 1>&100

exec 2>&1

echo ""

echo ""

echo "################$(date +%Y%m%d-%H:%M) start ##################"

#周日就作完整备份,其它时间增量备份;每次增量备份后,都将basedir打包压缩;若是本周最后一次增量备份,则备份完成后将本次备份内容直接打包压缩

if [ $sub_incr_dir -eq 0 ];then

#删除上周完成的所有备份

echo "################$(date +%Y%m%d-%H:%M) remove old backup ###################"

rm -rf $backup_base/old/*

echo "################$(date +%Y%m%d-%H:%M) start full backup ###############"

full_date=$(date +%Y%m%d%H%M)

if_sucess "/usr/bin/innobackupex --user=$user --password=$password --defaults-file=$defaults_file --no-timestamp --throttle=$iops --use-memory=$mem --parallel=$thread $full_backup_dir/full${sub_incr_dir}_$full_date"

echo "incr_base_dir=$full_backup_dir/full${sub_incr_dir}_$full_date" > $backup_base/incr_base_dir.txt

#转移日志到此次备份目录下

if_sucess "mv $backup_log $full_backup_dir/full${sub_incr_dir}_$full_date"

else

#获取增量备份的basedir目录

[ -f "$backup_base/incr_base_dir.txt" ] && incr_base_dir=$(sed -n '$p' $backup_base/incr_base_dir.txt | awk -F= '{print $2}') || exit 1

echo "################$(date +%Y%m%d-%H:%M) start incremental backup ###############"

incr_date=$(date +%Y%m%d%H%M)

if_sucess "/usr/bin/innobackupex --user=$user --password=$password --defaults-file=$defaults_file --throttle=$iops --use-memory=$mem --incremental --parallel=$thread $incr_backup_dir/incr${sub_incr_dir}_${incr_date} --no-timestamp --incremental-basedir=$incr_base_dir"

echo "incr_base_dir=$incr_backup_dir/incr${sub_incr_dir}_${incr_date}" >> $backup_base/incr_base_dir.txt

#转移日志到此次备份目录下

if_sucess "mv $backup_log $incr_backup_dir/incr${sub_incr_dir}_${incr_date}"

echo "################$(date +%Y%m%d-%H:%M) start compress $incr_base_dir ###############"

[ -d "$incr_base_dir" ] && compress_old_backup

#若是本周最后一次增量备份,则备份完成后将备份内容直接打包压缩

[ $sub_incr_dir -eq 6 ] && . $backup_base/incr_base_dir.txt && compress_old_backup

fi

exec 100>&-

#将本地备份同步到异地

echo "################$(date +%Y%m%d-%H:%M) stop ##################"

echo ""

echo ""

echo "################$(date +%Y%m%d-%H:%M) rsync start ##################"

/usr/bin/rsync -avz --password-file=/etc/rsync.pas $backup_base/old/ test@X.X.X.X::mysqlbak/

echo "################$(date +%Y%m%d-%H:%M) rsync stop ##################"

要点:

1.xtrabackup虽然支持异地备份,但是无法同时实现增量备份,因为增量备份需要的incremental_basedir在异地,因此我们需要通过rsync同步

2.xtrabackup增量备份无法启用流压缩,原因同样需要incremental_basedir,因此我们脚本中每次会保留增量备份需要的incremental_basedir,使用完后再将其压缩

3.为避免xtrabackup备份过程影响mysql服务器性能并加快备份过程,需要设置相关参数,具体情况根据服务器资源来设定。

4.为方便查看打印日志,我们通过exec来记录日志,最后不要忘记关闭exec的文件描述符

实验过程中,200多个G 的数据库完整备份需要30分钟左右完成,增量备份只需10分钟左右完成。

最后,在备份完成后我们可以查看xtrabackup_info,如下:

[html] view plain copy

uuid = 1703dbc2-7cce-11e5-b351-b82a72d5ba07

name =

tool_name = innobackupex

tool_command = --user=xtrabak --password=... --defaults-file=/etc/my.cnf --throttle=400 --use-memory=1GB --incremental --parallel=4 /data/mysqlbak/mysql_incr_backup/incr3_201510280101 --no-timestamp --incremental-basedir=/data/mysqlbak/mysql_incr_backup/incr2_201510270101

tool_version = 1.5.1-xtrabackup

ibbackup_version = xtrabackup version 2.2.9 based on MySQL server 5.6.22 Linux (x86_64) (revision id: )

server_version = 5.6.22-log

start_time = 2015-10-28 01:01:01

end_time = 2015-10-28 01:13:49

lock_time = 27

binlog_pos = filename 'mysql-bin.000711', position 721836584

innodb_from_lsn = 1021734207515

innodb_to_lsn = 1025349925630

partial = N

incremental = Y

format = file

compact = N

compressed = N

encrypted = N

来查看本次备份的start_tiime,end_time以及lock_time,为什么会有lock_time呢?

因此innobackupex先会备份innodb引擎的数据库,此过程不会锁表;然后再全库锁表,备份myisam引擎的数据库,因此会有一个lock_time;从info信息中还可以得到其他可用信息。另innobackupex的全库锁表时也可能会导致整个备份过程很长。

版权声明:本文为博主原创文章,未经博主允许不得转载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: