xtrabackup备份还原实战

一、 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一并备走,属于热备方式。

大概的工作流程如下

  1. xbk备份执行的瞬间,立即触发checkpiont,已提交的数据脏页,从内存刷写到磁盘,并记录此时的LSN号
  2. 拷贝innoDB表相关的文件(ibdata,frm,ibd…)
  3. 记录备份过程中产生的redo和undo一起拷贝走,也就是checkpoint LSN之后的日志
  4. 再次统计LSN
  5. 记录二进制日志位置

非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/

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章