xtrabackup2.4备份mysql5.7使用总结&使用innobackupex进行增量备份

分类:Mysql |

Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。

Xtrabackup有两个主要的工具:xtrabackup、innobackupex
  (1)xtrabackup只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表
  (2)innobackupex-1.5.1则封装了xtrabackup,是一个脚本封装,所以能同时备份处理innodb和myisam,但在处理myisam时需要加一个读锁


软件安装:

安装依赖:

yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL

wget ftp://rpmfind.net/linux/atrpms/el6-x86_64/atrpms/stable/libev-4.04-2.el6.x86_64.rpm

rpm -ivh libev-4.04-2.el6.x86_64.rpm


下载地址: https://www.percona.com/software/mysql-database/percona-xtrabackup

yum 安装xtrabackup:

yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
yum install percona-xtrabackup-24.x86_64


说明: 

1. 备份mysql5.1 请使用 Percona XtraBackup 2.0, 2.0+的版本不支持备份mysql5.1 参考: https://www.updateweb.cn/zwfec/item-246.html

2. 备份mysql5.7 请使用 Percona XtraBackup 2.4 


另如果需要主从数据同步:

用过 xtrabackup 工具的 innobackupex 脚本备份数据的人可能会注意到,
–apply-log 处理过的备份数据里有两个文件说明该备份数据对应的 binlog 的文件名和位置。但有时这俩文件说明的位置可能会不同。
经过实验和询问 Percona 公司,结论如下:
1 对于纯 InnoDB 操作,备份出来的数据中上述两个文件的内容是一致的
2 对于 InnoDB 和非事务存储引擎混合操作,xtrabackup_binlog_info 中所示的 position 应该会比 xtrabackup_pos_innodb 
所示的数值大。此时应以 xtrabackup_binlog_info 为准;而后者和 apply-log 时 InnoDB recovery log 中显示的内容是一致的,
只针对 InnoDB 这部分数据


主从命令:

change master to master_host='10.0.x.x',master_user='xxx',master_password='xxx',master_log_file='mysql-bin.000001',master_log_pos=99;


shell :


执行:

mkdir /srv/backup

以下文件放入 /srv/backup/



定时任务进行备份或还原

crontab_backup_full.sh : 每天凌晨进行全量备份

#!/bin/bash
backup_dir=/srv/backup
current_date_dir=$(date +%F)
cd $backup_dir

if [ ! -d $current_date_dir ];then
   mkdir $current_date_dir
fi
echo "正在备份中..."
data_dir=$backup_dir/$current_date_dir
./shell/backup_full.sh $data_dir/full 2>$data_dir/${current_date_dir}.log 1>$data_dir/${current_date_dir}.err.log
echo "备份结果:"
cat $data_dir/${current_date_dir}.log


history_del=$(date -d"6 days ago" +%Y-%m-%d)
rm -rf $backup_dir/$history_del


crontab_backup_incremental_1.sh  : 每天12:30 进行增量备份

#!/bin/bash
backup_dir=/srv/backup
current_date_dir=$(date +%F)
cd $backup_dir

echo "正在备份中..."
data_dir=$backup_dir/$current_date_dir
./shell/backup_cremental.sh $data_dir/1230 $data_dir/full 2>$data_dir/${current_date_dir}1230.log 1>$data_dir/${current_date_dir}1230.err.log
echo "备份结果:"
cat $data_dir/${current_date_dir}1230.log

crontab_backup_incremental_2.sh  : 每天19:30 进行增量备份

#!/bin/bash
backup_dir=/srv/backup
current_date_dir=$(date +%F)
cd $backup_dir

echo "正在备份中..."
data_dir=$backup_dir/$current_date_dir
./shell/backup_cremental.sh $data_dir/1930 $data_dir/1230 2>$data_dir/${current_date_dir}1930.log 1>$data_dir/${current_date_dir}1930.err.log
echo "备份结果:"
cat $data_dir/${current_date_dir}1930.log


restore_incremental.sh  :  完整增量还原时的处理方式

#!/bin/bash
backup_dir=/srv/backup
full_dir=$backup_dir/$1/full
full_first=$backup_dir/$1/$2
full_second=$backup_dir/$1/$3

if [ -z $1 ];then
    echo '请输入全量文件夹的名称: 如:2018-01-01'
    exit
fi
if [ -z $2 ];then
    echo '请输入第一个增量还原文件夹, 如:1230'
    exit
fi
if [ -z $3 ];then
    echo '请输入第二个增量还原文件夹, 如:1930'
    exit
fi
echo $full_dir

./shell/preparing_incremental_full.sh $full_dir
./shell/preparing_incremental.sh $full_dir $full_first
./shell/preparing_incremental.sh $full_dir $full_second
echo '数据已准备完成,请使restore.sh 进行还原'
echo '例: ./shell/restore.sh /srv/backup/2019-04-26/full /srv/db/mysql/data'


------------------------------------------------------------------ 全量 -----------------------------------------------------------------------------------------------

mkdir /srv/backup/shell

以下文件放入 /srv/backup/shell

backup_full.sh  # 全量备份时

#!/bin/bash
#basedir="/srv/backup_db"
if [ -z $1 ];then
    echo '请输备份文件的存放路径'
    exit
fi
innobackupex --defaults-file=/etc/my.cnf --socket=/tmp/mysql.sock --slave-info --user=root --no-timestamp $1

preparing_full.sh # 全量还原时准备工作

#!/bin/bash
#basedir="/srv/backup_db"
if [ -z $1 ]; then
    echo '请输入全量文件夹'
    exit
fi
  
innobackupex --apply-log $1


-------------------------------------------------------------------- 增量 ----------------------------------------------------------------------------------------------------------------------


backup_incremental.sh  # 增量备份

#!/bin/bash
#basedir="/srv/backup_db"
if [ -z $1 ]; then
    echo '第一个参数,请输入增量文件存放的文件夹'
    exit
fi
if [ -z $2 ]; then
    echo '第二个参数,请输入基于哪个备份为起始进行增量备份'
    exit
fi

innobackupex --defaults-file=/etc/my.cnf --socket=/tmp/mysql.sock --slave-info --user=root --no-timestamp --incremental $1 --incremental-basedir=$2


preparing_incremental_full.sh  # 增量备份还原:  对全量的基础数据的准备工作

#!/bin/bash
#basedir="/srv/backup_db"
if [ -z $1 ]; then
    echo '请输入全量文件夹'
    exit
fi
  
innobackupex --apply-log --redo-only $1


preparing_incremental.sh   # 增量备份还原:  对增量备份还原的准备工作

#!/bin/bash
#basedir="/srv/backup_db"
if [ -z $1 ]; then
    echo '第一个参数,基于哪个全量备份的文件夹'
    exit
fi
if [ -z $2 ]; then
    echo '第二个参数,请输入对哪个文件夹进行增量还原准备'
    exit
fi

innobackupex --defaults-file=/etc/my.cnf --socket=/tmp/mysql.sock --user=root --apply-log --redo-only $1 --incremental-dir=$2

-------------------------------------------------------------------- 还原 ----------------------------------------------------------------------------------------------------------------------

rstore.sh         # 数据还原, 适用于全量和增量 

#!/bin/bash
#basedir="/srv/backup_db"
if [ -z $1 ];then
    echo '第一个参数,请输还原文件的存放路径'
    exit
fi
if [ -z $2 ];then
   echo '第二个参数,请输入原mysql的数据存放路径'
   exit
fi
innobackupex --copy-back $1
chmod 755 $2 -R
chown mysql.mysql $2 -R
pgrep mysql|xargs kill -9
service mysqld start



--------------------------------------------------------------------


在使用innobackupex进行备份时,还可以使用--no-timestamp选项来阻止命令自动创建一个以时间命名的目录;如此一来,innobackupex命令将会创建一个BACKUP-DIR目录来存储备份数据。


补充: innobackup 常用参数说明(转载)

--defaults-file
同xtrabackup的--defaults-file参数

--apply-log
对xtrabackup的--prepare参数的封装

--copy-back
做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir ;

--remote-host=HOSTNAME
过ssh将备份数据存储到远程服务器上

--stream=[tar]
备份文件输出格式, tar时使用tar4ibd , 该文件可在XtarBackup binary文件中获得.如果备份时有指定--stream=tar, 则tar4ibd文件所处目录一定要在$PATH中(因为使用的是tar4ibd去压缩, 在XtraBackup的binary包中可获得该文件)。
在 使用参数stream=tar备份的时候,你的xtrabackup_logfile可能会临时放在/tmp目录下,如果你备份的时候并发写入较大的话 xtrabackup_logfile可能会很大(5G+),很可能会撑满你的/tmp目录,可以通过参数--tmpdir指定目录来解决这个问题。

--tmpdir=DIRECTORY
当有指定--remote-host or --stream时, 事务日志临时存储的目录, 默认采用MySQL配置文件中所指定的临时目录tmpdir

--redo-only --apply-log组,
强制备份日志时只redo ,跳过rollback。这在做增量备份时非常必要。

--use-memory=#
该参数在prepare的时候使用,控制prepare时innodb实例使用的内存量

--throttle=IOS
同xtrabackup的--throttle参数

--sleep=是给ibbackup使用的,指定每备份1M数据,过程停止拷贝多少毫秒,也是为了在备份时尽量减小对正常业务的影响,具体可以查看ibbackup的手册 ;

--compress[=LEVEL]
对备份数据迚行压缩,仅支持ibbackup,xtrabackup还没有实现;

--include=REGEXP
对 xtrabackup参数--tables的封装,也支持ibbackup。备份包含的库表,例如:--include="test.",意思是要备份 test库中所有的表。如果需要全备份,则省略这个参数;如果需要备份test库下的2个表:test1和test2,则写 成:--include="test.test1|test.test2"。也可以使用通配符,如:--include="test.test"。

--databases=LIST
列出需要备份的databases,如果没有指定该参数,所有包含MyISAM和InnoDB表的database都会被备份;

--uncompress
解压备份的数据文件,支持ibbackup,xtrabackup还没有实现该功能;

--slave-info,
备 份从库, 加上--slave-info备份目录下会多生成一个xtrabackup_slave_info 文件, 这里会保存主日志文件以及偏移, 文件内容类似于:CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0

--socket=SOCKET
指定mysql.sock所在位置,以便备份进程登录mysql.


20190426记:

当你使用的是mysql5.7时,请不要使用xtrabackup2.0.0 进行备份, xtrabackup2.0.0不支持mysql5.7的, 但只是报错会误导人:

innobackupex: fatal error: no 'mysqld' group in MySQL options
innobackupex: fatal error: OR no 'datadir' option in group 'mysqld' in MySQL options

解决办法下载更新版本:  https://www.percona.com/software/mysql-database/percona-xtrabackup

貌似mysql5.7 只有 xtrabackup2.4才支持: https://www.percona.com/doc/percona-xtrabackup/2.4/index.html
下载: https://www.percona.com/doc/percona-xtrabackup/2.4/installation/yum_repo.html

安装:

yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
yum install percona-xtrabackup-24.x86_64