一、 xtrabackup安装
根据实际情况选择相应版本的xtrabackup,mysql是5.7.xx对应的xtrabackup版本为2.4.*,mysql8.0以上的对应的xtrabackup版本为8.x.x
#安装依赖包:
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL libev
#下载软件并安装
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.12/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm
yum -y install percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm
二 、介绍
Percona XtraBackup工具提供了一种在系统运行时执行MySQL数据热备份的方法。2.4版本开始支持非innodb表的备份
工作原理
InnoDB表:
对于innodb不锁表,拷贝数据页,最终以数据文件的方式保存下来,把一部分redo和undo一并备走,属于热备方式。
大概的工作流程如下
- xbk备份执行的瞬间,立即触发checkpiont,已提交的数据脏页,从内存刷写到磁盘,并记录此时的LSN号
- 拷贝innoDB表相关的文件(ibdata,frm,ibd…)
- 记录备份过程中产生的redo和undo一起拷贝走,也就是checkpoint LSN之后的日志
- 再次统计LSN
- 记录二进制日志位置
非InnoDB表:
进行温备份,即锁表备份
三、xtrabackup 备份使用方法
Usage: [xtrabackup [--defaults-file=#] --backup | xtrabackup [--defaults-file=#] --prepare] [OPTIONS]
1、全备
使用xtrabackup
命令进行全量热备份示例:
[root@db01 ~]# xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --user=root --password=123 --port=3306 --backup --target-dir=/data/backup
--defaults-file
:指定MySQL的配置文件所在路径,因为XtraBackup需要通过读取配置文件才能知道数据目录在哪--host
:指定MySQL服务的ip地址,因为全量备份时需要备份表结构,所以得连接到MySQL加读锁--user
:指定使用哪个MySQL用户进行备份--password
:MySQL用户的密码--port
:指定MySQL服务的端口号--target-dir=name
:备份文件存储的目录--backup
:进行备份并将其放入备份文件存储的目录
2、增量备份
[root@db01 ~]# xtrabackup --backup --target-dir=/data/backupv1 --incremental-basedir=/data/backup --user=root --password=123 --socket=/tmp/mysql.sock
--incremental-basedir
:该选项告诉xtrabackup创建增量备份的参照点。
该版本下,to_lsn和last_lsn差9可以理解为在备份过程中数据没有发生变化,由上图可以看到lsn号是连续的
四、备份还原实战
1、数据环境准备
#第一天对数据进行全备
[root@db01 ~]# xtrabackup --user=root --password=123 --socket=/tmp/mysql.sock --backup --target-dir=/data/full
#模拟第一天的数据变化
mysql> use test;
mysql> create table t1(id int);
mysql> insert into t1 values (1),(2),(3);
#第二天对数据进行增量备份
[root@db01 ~]# xtrabackup --user=root --password=123 --socket=/tmp/mysql.sock --backup --target-dir=/data/inc1 --incremental-basedir=/data/full
#模拟第二天数据变化
mysql> create table t2(id int);
mysql> insert into t2 values (1),(3),(5);
#第三天对数据进行增量备份
[root@db01 ~]# xtrabackup --user=root --password=123 --socket=/tmp/mysql.sock --backup --target-dir=/data/inc2 --incremental-basedir=/data/inc1
#对数据库搞破坏
[root@db01 ~]# rm -rf /data/mysql/*
2、准备备份
全备的整理:
[root@db01 ~]# xtrabackup --prepare --apply-log-only --target-dir=/data/full
--prepare
prepare a backup for starting mysql server on the backup 为启动备份上的mysql服务器准备一个备份。--apply-log-only
此项较为重要。主要应用与增备,在常规备份中,执行两种操作以使数据库保持一致:从redo log对数据文件redo已提交的事务,回滚undo的事务。在准备备份时,必须跳过未提交事务的回滚,因为在备份时未提交的事务可能正在进行中,它们很可能在下一次增量备份中提交。您应该使用--apply-log-only
选项来防止回滚阶段。
将第一次增量备份应用到完全备份:
[root@db01 ~]# xtrabackup --prepare --apply-log-only --target-dir=/data/full --incremental-dir=/data/inc1
准备第二次增量备份是一个类似的过程:
最后一次准备备份过程需要将回滚的内容也准备进去,所以不需要加--apply-log-only
参数
[root@db01 ~]# xtrabackup --prepare --target-dir=/data/full --incremental-dir=/data/inc2
3、进行恢复
[root@db01 ~]# cp -a /data/full/* /data/mysql/
[root@db01 ~]# chown -R mysql.mysql /data/mysql/