阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

XtraBackup备份原理和实战详解

157次阅读
没有评论

共计 24396 个字符,预计需要花费 61 分钟才能阅读完成。

第 1 章 XtraBackup

1.1 XtraBackup介绍

InnoDB 有个商业的 InnoDB Hotbackup,可以对 InnoDB 引擎的表实现在线热备。而 percona 出品的 Xtrabackup,是 InnoDB Hotbackup 的一个开源替代品,可以在线对 InnoDB/XtraDB 引擎的表进行物理备份。mysqldump 支持在线备份,不过是逻辑备份,效率比较差。xtrabackup 是开源的 MySQL 备份工具,物理备份,效率很不错。

Xtrabackup有两个主要的工具:xtrabackup、innobackupex,其中 xtrabackup 只能备份 InnoDB 和 XtraDB 两种数据表,innobackupex 则封装了 xtrabackup,同时可以备份 MyISAM 数据表。Xtrabackup 做备份的时候不能备份表结构、触发器等等,智能纷纷.idb 数据文件。另外 innobackupex 还不能完全支持增量备份,需要和 xtrabackup 结合起来实现全备的功能。

1.2 XtraBackup特点介绍

C语言编写,可以备份 InnodbXtraD, 不拷贝 *.frm 文件

支持的引擎有:

InnoDB、Xtradb:hotbackup

MyISAM:with read lock

具有的特点有如下几点:

§  1)备份过程快速、可靠;

§  (2)备份过程不会打断正在执行的事务;

§  (3)能够基于压缩等功能节约磁盘空间和流量;

§  (4)自动实现备份检验;

§  (5)还原速度快;

1.3 XtraBackup的下载安装

Xtrabackup工具由 Percona 公司开发的开源热备工具,可以到官网下载到最新的版本文件。

https://www.percona.com/downloads/下载各种版本,也可以在系统中使用 wget 下载。

方法一:

wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/RedHat/6/x86_64/percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm

安装依赖的包

yum install perl-DBI  perl-DBD-MySQL  perl-Time-HiRes perl-IO-Socket-SSL installperl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL

方法二:

下载好的 rpm 包,直接使用 yum 安装,自动安装依赖包,但是需要有 epel 源的支持,所以要下载配置好 epe’

wget -O /etc/yum.repos.d/epel.repo  http://mirrors.aliyun.com/repo/epel-6.repo

yum install -y percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm

1.4 XtraBackup备份用户需要的权限

RELOAD LOCKTABLES 权限为了执行 FLUSHTABLES WITH READ LOCK

REPLICATION CLIENT 为了获取 binary log 位置

CREATE TABLESPACE 权限为了导入表,用户表级别的恢复

SUPER权限在 slave 环境下备份用来启动和关闭 slave 线程

1.5 XtraBackup备份

InnoDB 和非 InnoDB 文件的备份都是通过拷贝文件,但是实现的方式是不同的。

  • InnoDB是以 page 为粒度做的的(Xtrabackup),Xtrabackup在读取每个 page 时会校验 checksum 值,保证数据块是一致的

  • InnoDBcp或者 tar 命令,innobackupexcp MyISAM 文件时已经做了flushFTWRL),磁盘上的文件也是完整的,所以最终备份集里的数据文件都是写入完整的

  • 1.5.1 备份流程

XtraBackup 备份原理和实战详解

1.5.2 全备流程图

XtraBackup 备份原理和实战详解

1.5.3 增量备份流程图

XtraBackup 备份原理和实战详解

1.6 Xtrabackup恢复

1.6.1 恢复流程图

XtraBackup 备份原理和实战详解

XtraBackup 备份原理和实战详解

XtraBackup 备份原理和实战详解

XtraBackup 备份原理和实战详解

XtraBackup 备份原理和实战详解

1.7 Xtrabackup的使用

规范操作,我们先建好全备和增量备份的路径

[root@db01 backups]# pwd

/data/backups

[root@db01 backups]# ll

总用量 12

drwxr-xr-x 4 root root 4096 9  4 17:28 full

drwxr-xr-x 4 root root 4096 9  4 17:26 inc

操作过程:

 mkdir/data/backups/{full,inc} -p

1.7.1 全备

*****生产环境中为了数据一致性最好是 ROW 模式,因为其他的模式数据会丢失*****

命令语法格式:

innobackupex --user=User--password=PWD/data/backup/full --slave-info --safe-slave-backup --parallel=4--safe-slave-backup-timeout=7200  --rsync

–rsync 这个参数一般用作分布式数据库集群的时候

全备步骤:

1、准备一个 xtr_test 数据库,并在 xtr_test 数据库中插入 testbackup 表,字段包含 idstep 两个字段

mysql -uroot -p789 -S /data/3306/mysql.sock
show databases;
create database xtr_test;
use xtr_test;
select database();
create table testbackup(id int not nullauto_increment primary key,step varchar(50))engine=innodb;
show tables;
desc testbackup;
show create table testbackup\G

结果样子:

mysql> desc testbackup;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
id    |int(11)     | NO   | PRI | NULL    | auto_increment |
| step  |varchar(50) | YES  |     | NULL   |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.02 sec)
mysql> show create table testbackup\G
*************************** 1. row***************************
       Table:testbackup
Create Table: CREATE TABLE `testbackup` (
  `id`int(11) NOT NULL AUTO_INCREMENT,
  `step`varchar(50) DEFAULT NULL,
  PRIMARY KEY(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

2、插入字段 “firstfull backup”testbackup表中

insert into testbackup(step) values('first fullbackup');

操作结果:

mysql> select * from testbackup;
+----+-------------------+
id | step              |
+----+-------------------+
|  1 | firstfull backup |
+----+-------------------+
1 row in set (0.02 sec)

3、执行全备

此时,我们创建的 xtr_test 数据库中的 testbackup 表中有数据,而且我们创建的 /data/backups/full 文件下面没有任何内容。下面执行全备,操作命令上面已经给出,此次操作使用的多实例所以用到了 –socket 参数。

innobackupex --user=root --password=789/data/backups/full --slave-info --safe-slave-backup --parallel=4--safe-slave-backup-timeout=7200 --socket=/data/3306/mysql.sock

执行结果一定要看到“160905 20:01:38 completedOK!” OK的字样,才表示成功,从打出的日志我们也能看到备份的过程和上面给出的全备流程图对比起来。

正确输出以后会在 /data/backups/full 指定的目录中生成一个有时间和序号的目录,这个目录就是全备文件存放地方如:

[root@db01 ~]# ls -lrt /data/backups/full/
总用量 4
drwxr-x--- 8 root root 4096 9 月   5 20:012016-09-05_20-01-32 

1.7.2 增量备份

增量备份的前提是一定要有一个全备 ,只有有了全备才能进行所谓的增量备份!!!

增量备份的方式有两种,分别为:

第一种:通过全备的文件

innobackupex --user=root --password=789 --incremental --incremental-lsn=1783249/data/backups/inc  --slave-info--safe-slave-backup --parallel=4 --safe-slave-backup-timeout=7200--socket=/data/3306/mysql.sock

第二种方法:通过LSN

innobackupex --user=root --password=789 --incremental --incremental-lsn=1783249/data/backups/inc  --slave-info--safe-slave-backup --parallel=4 --safe-slave-backup-timeout=7200--socket=/data/3306/mysql.sock

1、准备好全备最新一次的全备文件,这里只做了一次,所以只有一个目录

[root@db01 ~]# ls -lrt /data/backups/full/
总用量 4
drwxr-x--- 8 root root 4096 9 月   5 20:01 2016-09-05_20-01-32 

2、xtr_test 数据库中的 testbackup 表,进行数据的插入,插入内容为“fist increment backup”

mysql> insert into testbackup(step)values('first increment backup');
Query OK, 1 row affected (0.02 sec)
   
mysql> select * from testbackup;
+----+------------------------+
id | step                  |
+----+------------------------+
|  1 | firstfull backup      |
|  2 | firstincrement backup |
+----+------------------------+
2 rows in set (0.01 sec)

3、执行增量备份

这里我们要确定好最新一次的全备(强调)!!!

innobackupex --user=root --password=789--incremental  --incremental-basedir=/data/backups/full/
2016-09-05_20-01-32 
 /data/backups/inc --slave-info--safe-slave-backup --parallel=4 --safe-slave-backup-timeout=7200 --socket=/data/3306/mysql.sock

这里执行结果一定要看到 completed OK!” OK 的字样,才表示成功如果是分布式也可以用 –rsync,我们会在创建的inc 目录下发现创建了一个以时间和序号命名的目录,这个目录就是 Xtrabackup 备份的增量。

执行结果:

[root@db01 ~]# ll /data/backups/inc
总用量 4
drwxr-x--- 8 root root 4096 9 月   5 20:19 2016-09-05_20-19-48 

TIP:innodb 默认是使用的系统表空间,我们可以通过配置参数来使 idb 文件到独立空间中 innodb_file_per_table = 1 这个是修改 idb 到独立空间,如果数据库是线上的,我们可以在配置文件 my.cnf 配置以上参数后,再使用 set globalinnodb_file_per_table= 1 临时生效。

alter table backupstep engine=innodb; 修改表的引擎,这个操作很费时间,需要在业务低点的时候操作

1.7.3 再增量备份的基础上再备份

在创建的 xtr_test 数据库中的 testbackup 表中再次插入内容“secondincrement backup”

mysql> insert into testbackup(step) values('secondincrement backup');
Query OK, 1 row affected (0.01 sec)
   
mysql> select * from testbackup;
+----+-------------------------+
id | step                    |
+----+-------------------------+
|  1 | firstfull backup       |
|  2 | first incrementbackup  |
|  3 | secondincrement backup |
+----+-------------------------+
3 rows in set (0.00 sec)

1确定最新的全备文件

[root@db01 full]# pwd
/data/backups/full
[root@db01 full]# ls -lrt
总用量 4
drwxr-x--- 8 root root 4096 9 月   5 20:01 2016-09-05_20-01-32

   2确定上一次增量备份的 LSN

[root@db01 inc]# ls -lrt
总用量 4
drwxr-x--- 8 root root 4096 9 月   5 20:19 2016-09-05_20-19-48
[root@db01 inc]# cd 2016-09-05_20-19-48/
[root@db01 2016-09-05_20-19-48]# ls
backup-my.cnf krik    performance_schema      xtrabackup_checkpoints  xtr_test
ibdata1.delta mysql   test                    xtrabackup_info
ibdata1.meta  oldboy xtrabackup_binlog_info xtrabackup_logfile
[root@db01 2016-09-05_20-19-48]# cat xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 1793716   # 这个值一定是和上一次全备的 last_lsn 一样,否则就是数据不全
to_lsn = 1794019
last_lsn = 1794019
compact = 0
recover_binlog_info = 0

4、
执行增量备份命令

innobackupex  --user=root --password=789 --incremental--incremental-lsn=1794019 /data/backups/inc --slave-info --safe-slave-backup --parallel=4 --safe-slave-backup-timeout=7200--socket=/data/3306/mysql.sock

这个值是通过查看最近一次增量备份的 xtrabackup_checkpoints 得到

这里执行结果一定要看到“completed OK!” OK的字样,才表示成功

执行结果会在指定的目录 /data/backups/inc 下生成一个新的文件

[root@db01 2016-09-05_20-19-48]# cd ..
[root@db01 inc]# pwd
/data/backups/inc
[root@db01 inc]# ls -lrt
总用量 8
drwxr-x--- 8 root root 4096 9 月   5 20:19 2016-09-05_20-19-48
drwxr-x--- 8 root root 4096 9 月   5 21:18 2016-09-05_21-18-30

到此我们对数据进行了完整的备份,下面会再创建一条语句,但是不会做增量备份,为了是下面测试二进制日志恢复数据。接下来要玩大的了,删库,后面看看能恢复回来不

生产环境中为了数据一致性最好是 ROW 模式,因为其他的模式数据会丢失

mysql> show variables like "log_bin";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin      | ON    |
+---------------+-------+
1 row in set (0.00 sec)
   
mysql> show variables like"%binlog_format%";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW   |
+---------------+-------+
1 row in set (0.00 sec)
   
ot root   418 9 月   4 15:34backup-my.cnf

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2017-04/142477p2.htm

第 2 章 数据库恢复

XtraBackup 备份原理和实战详解

XtraBackup 备份原理和实战详解

XtraBackup 备份原理和实战详解

这里只做 redo,不做 undo

2.1 恢复数据前准备

数据库的恢复,是从全备 —>1 次增量 —>2 次增量 ……—>N 次增量直到故障点的位置的顺序来恢复的

如果是全备:最近一次的全备—-> binlog

2.1.1 创建新的语句为二进制日志恢复做准备

mysql> insert into testbackup(step)values('second increment backup');
Query OK, 1 row affected (0.01 sec)
   
mysql> select * from testbackup;
+----+-------------------------+
id | step                    |
+----+-------------------------+
|  1 | firstfull backup       |
|  2 | firstincrement backup  |
|  3 | secondincrement backup |
+----+-------------------------+
3 rows in set (0.00 sec)
   
mysql> insert into testbackup(step)values('last  backup');
Query OK, 1 row affected (0.00 sec)
   
mysql> select * from testbackup;
+----+-------------------------+
id | step                    |
+----+-------------------------+
|  1 | firstfull backup       |
|  2 | firstincrement backup  |
|  3 | secondincrement backup |
|  4 |last  backup            |
+----+-------------------------+
4 rows in set (0.00 sec)
   
mysql> truncate table testbackup;
Query OK, 0 rows affected (0.02 sec)
   
mysql> select * from testbackup;
Empty set (0.00 sec) 

2.2 恢复第一次的全备数据库

恢复数据库的时候一定会重启一次数据库的,所以我们可以选择停库操作(如果可以的情况下),下面以停库操作练习:

1、  停掉数据库

[root@db01 inc]# /data/3306/mysql stop
Stoping MySQL...
[root@db01 inc]# netstat -lntup|grep 3306
[root@db01 inc]#

2、  恢复最近一次的全备,*****在操作前一定要先备份*****

[root@db01 backups]# for i in `ls/data/backups/`;do cp -r $i /data/backups/$i.bak;done
[root@db01 backups]# ls
full full.bak  inc  inc.bak
[root@db01 backups]# cp -r /data/3306/data/data/backups/3306_data.bak
[root@db01 backups]# ls
3306_data.bak full  full.bak  inc inc.bak

3、  导入全备数据

innobackupex --user=root --password=789 --apply-log--redo-only /data/backups/full/2016-09-05_20-01-32--socket=/data/3306/mysql.sock

要确认看到 OK 字样,表示导入成功

2.3 恢复第一次全备后的第一次增量备份

1、    确定第一次增量备份的文件目录

[root@db01 inc]# ls -lrt
总用量 8
drwxr-x--- 8 root root 4096 9 月   5 20:19 2016-09-05_20-19-48
drwxr-x--- 8 root root 4096 9 月   5 21:18 2016-09-05_21-18-30

通过时间排序可以看到这里第一次是2016-09-05_20-19-48,工作中可以自定义一些名字

2、    执行增量恢复

innobackupex --user=root --password=789 --apply-log--redo-only /data/backups/full/2016-09-05_20-01-32 --incremental-dir=/data/backups/inc/2016-09-05_20-19-48--socket=/data/3306/mysql.sock

 看到 OK 字样表示成功

2.4 恢复第一次全备后的第二次增量备份

innobackupex --user=root --password=789 --apply-log--redo-only /data/backups/full/2016-09-05_20-01-32   --incremental-dir=/data/backups/inc/2016-09-05_21-18-30--socket=/data/3306/mysql.sock 

到此 Xtrabackup 昨晚了 redo 操作,下面我们要把他写入数据文件中。这一步才是把数据放到数据库中

数据写入数据文件:

innobackupex --user=root --password=789--apply-log /data/backups/full/2016-09-05_20-01-32  --socket=/data/3306/mysql.sock

同样是看到 OK 字样表示执行成功。

2.5 恢复数据到实例 3306 的数据中

Xtrabackup恢复是把所有的增量都叠加到了全备的身上,也就是恢复用的全备。它就是数据库 data,我们把这个全备目录替换了3306 数据库的 data 数据

[root@db01 full]# rm -fr /data/3306/data/
[root@db01 full]# mv 2016-09-05_20-01-32//data/3306/data
[root@db01 full]# ll /data/3306/data
总用量 163884
-rw-r----- 1 root root       418 9 月   5 20:01 backup-my.cnf
-rw-r----- 1 root root 134217728 9 月   5 22:12 ibdata1
-rw-r----- 1 root root   4194304 9 月   5 22:12 ib_logfile0
-rw-r----- 1 root root   4194304 9 月   5 22:12 ib_logfile1
-rw-r----- 1 root root   4194304 9 月   5 22:12 ib_logfile2
-rw-r----- 1 root root  12582912 9 月   5 22:12 ibtmp1
drwxr-x--- 2 root root      4096 9 月   5 22:10 krik
drwxr-x--- 2 root root      4096 9 月   5 22:10 mysql
drwxr-x--- 2 root root      4096 9 月   5 22:10 oldboy
drwxr-x--- 2 root root      4096 9 月   5 22:10 performance_schema
drwxr-x--- 2 root root      4096 9 月   5 22:10 test
-rw-r----- 1 root root        22 9 月   5 22:10 xtrabackup_binlog_info
-rw-r--r-- 1 root root        33 9 月   5 22:12 xtrabackup_binlog_pos_innodb
-rw-r----- 1 root root       113 9 月   5 22:12 xtrabackup_checkpoints
-rw-r----- 1 root root       630 9 月   5 22:10 xtrabackup_info
-rw-r----- 1 root root   8388608 9 月   5 22:04 xtrabackup_logfile
drwxr-x--- 2 root root      4096 9 月   5 22:10 xtr_test
[root@db01 full]# chown -R mysql.mysql/data/3306/data/
[root@db01 full]# ll /data/3306/data
总用量 163884
-rw-r----- 1 mysql mysql       418 9 月   5 20:01 backup-my.cnf
-rw-r----- 1 mysql mysql 134217728 9 月   5 22:12 ibdata1
-rw-r----- 1 mysql mysql   4194304 9 月   5 22:12 ib_logfile0
-rw-r----- 1 mysql mysql   4194304 9 月   5 22:12 ib_logfile1
-rw-r----- 1 mysql mysql   4194304 9 月   5 22:12 ib_logfile2
-rw-r----- 1 mysql mysql  12582912 9 月   5 22:12 ibtmp1
drwxr-x--- 2 mysql mysql      4096 9 月   5 22:10 krik
drwxr-x--- 2 mysql mysql      4096 9 月   5 22:10 mysql
drwxr-x--- 2 mysql mysql      4096 9 月   5 22:10 oldboy
drwxr-x--- 2 mysql mysql      4096 9 月   5 22:10 performance_schema
drwxr-x--- 2 mysql mysql      4096 9 月   5 22:10 test
-rw-r----- 1 mysql mysql        22 9 月   5 22:10 xtrabackup_binlog_info
-rw-r--r-- 1 mysql mysql        33 9 月   5 22:12 xtrabackup_binlog_pos_innodb
-rw-r----- 1 mysql mysql       113 9 月   5 22:12 xtrabackup_checkpoints
-rw-r----- 1 mysql mysql       630 9 月   5 22:10 xtrabackup_info
-rw-r----- 1 mysql mysql   8388608 9 月   5 22:04 xtrabackup_logfile
drwxr-x--- 2 mysql mysql      4096 9 月   5 22:10 xtr_test

重启数据库测试

[root@db01 full]# cd /data/3306
[root@db01 3306]# ./mysql start
Starting MySQL...
[root@db01 3306]# netstat -lntup|grep 3306
tcp       0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      56714/mysqld
mysql> select * from testbackup;
+----+-------------------------+
id | step                    |
+----+-------------------------+
|  1 | firstfull backup       |
|  2 | firstincrement backup  |
|  3 | secondincrement backup |
+----+-------------------------+
3 rows in set (0.00 sec)
测试增量恢复正常,但是我们最后做的一次操作,没有出现,下面使用二进制 binglog 来恢复 

2.6 binlog日志恢复数据

使用 binlog 恢复数据,我们需要来确定一个 范围 这里我们需要确定从第二次增量备份后到 执行删除表的 sql 语句之前这个范围;查找范围,我们可以使用时间范围、位置点 pos 来取这个范围。

2.6.1 查找第二次增量的位置点

[root@db01 2016-09-05_21-18-30]# catxtrabackup_binlog_info
mysql-bin.000010   1201

这里我们知道了第二次增量结束后的位置点事1201,我们将以这个位置点为起止位置点

2.6.2 查找删表语句时候的位置点

由于测试 binlog 日志文件少,这里很好查找,生产中要根据时间点来截取一段时间范围内,然后在去查找

[root@db01 3306]# mysqlbinlog--base64-output=decode-rows mysql-bin.000010
# at 1376
#160905 21:46:41 server id 1  end_log_pos 1403     Xid = 164
COMMIT/*!*/;
# at 1403
#160905 21:46:59 server id 1  end_log_pos 1495     Query    thread_id=7   exec_time=0   error_code=0
SET TIMESTAMP=1473083219/*!*/;
truncate table testbackup
/*!*/;
# at 1495
#160905 21:52:16 server id 1  end_log_pos 1514     Stop
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

通过查找到语句后,我们找到了位置点,我们可以导出一个文件,通过 vim 编辑来搜索语句

2.6.3 binlog恢复数据

通过上面找出的起止点和终止点来恢复数据

mysqlbinlog --base64-output=decode-rows -v--start-position=1201 --stop-position=1403 mysql-bin.000010

来再次确认

恢复:

[root@db01 3306]# mysqlbinlog --start-position=1201--stop-position=1403 mysql-bin.000010|mysql -uroot -p789 -S/data/3306/mysql.sock

数据中查看:

mysql> select * from testbackup;
+----+-------------------------+
id | step                    |
+----+-------------------------+
|  1 | firstfull backup       |
|  2 | firstincrement backup  |
|  3 | secondincrement backup |
|  4 |last  backup            |
+----+-------------------------+
4 rows in set (0.01 sec)

附录 —Xtrabackup 参数详解

Xtrabackup常用参数选项如下:

–slave-info

   它会记录 master 服务器的 binary logposname。会把记录的信息记录在xtrabackup_slave_info。在备份从库时, 可以使用该参数, 加上 –slave-info 备份目录下会多生成一个 xtrabackup_slave_info 文件 , 这里会保存主日志文件以及偏移 , 文件内容类似于:CHANGE MASTER TOMASTER_LOG_FILE=”, MASTER_LOG_POS=0

    这个参数适用的场景:假设现在有主库 A 和从库 B,目前想再添加一台备库C,并让备库C 以主库 Amaster;因为主库 A 是生产库,压力一般比较大,所以我们就在备库 B 上备份一个数据库,然后把这个备份拿到 C 服务器上 并导入到 C 库,接下来再在 C 服务器上执行 change master 的命令:其中 master_hostAip,master_log_filemaster_log_pos 就是这个 xtrabackup_slave_info 里面的值

–safe-salve-backup:

  它会停止 slave SQL 进程,等备份完后,重新打开 slaveSQL进程

–force-tar –stream=tar /tmp

  这些命令是用来压缩备份为 tar 文件。具体看官方文档

–defaults-file=#

默认配置文件的路径,如果不该参数,xtrabackup将从依次从以下位置查找配置文件 /etc/my.cnf/etc/mysql/my.cnf/usr/local/etc/my.cnf~/.my.cnf,并读取配置文件中的[mysqld][xtrabackup]配置段。[mysqld]中只需要指定 datadirinnodb_data_home_dirinnodb_data_file_pathinnodb_log_group_home_dirinnodb_log_files_in_groupinnodb_log_file_size6 个参数即可让 xtrabackup 正常工作。

–defaults-extra-file=#

如果使用了该参数,在读取了全局配置文件之后,会再读取这里指定的配置文件

–target-dir=name

备份文件的存放目录路径

–backup

实施备份到target-dir

–prepare

实施对备份文件进行恢复前的准备 ( 生成InnoDB log file)

–print-param

打印备份或恢复时需要的参数

–use-memory=#

该参数在 prepare 的时候使用,控制 prepareinnodb实例使用的内存量

–suspend-at-end

target-dir 目录下产生一个 xtrabackup_suspended 文件,将 xtrabackup 进程挂起,不停地将数据文件的变化同步到备份文件,直到用户手工删除 xtrabackup_suspended 文件

–throttle=#

每秒 IO 次数 , 限制 backup 时使用的 I/O 操作量,使备份对数据库正常业务的影响最小化

–log-stream

该参数在 backup 的时候使用,将 xtrabackup_logfile 的内容输出到标准输出,使用该参数时会自动使用 suspend-at-end 参数,innobackupex脚本的 stream 模式会使用该参数。

–incremental-lsn=name

增量备份时只拷贝 LSN 比该参数指定值新的 ibd pages,前次备份到了哪个LSN 可以看前次备份集的 xtrabackup_checkpoints 文件

–incremental-basedir=name

该参数在 backup 的时候使用,备份比该参数指定位置的备份集新的idb pages

–incremental-dir=name

该参数在 prepare 的时候使用,指定 prepare 时产生的 .delta 文件和日志文件的存放路径

–tables=name

在备份 file-per-table 类型的数据文件时使用,使用正则表达式指定需要备份的 innodb

–datadir=name

MySQL数据库的数据文件目录

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-04/142477.htm

第 1 章 XtraBackup

1.1 XtraBackup介绍

InnoDB 有个商业的 InnoDB Hotbackup,可以对 InnoDB 引擎的表实现在线热备。而 percona 出品的 Xtrabackup,是 InnoDB Hotbackup 的一个开源替代品,可以在线对 InnoDB/XtraDB 引擎的表进行物理备份。mysqldump 支持在线备份,不过是逻辑备份,效率比较差。xtrabackup 是开源的 MySQL 备份工具,物理备份,效率很不错。

Xtrabackup有两个主要的工具:xtrabackup、innobackupex,其中 xtrabackup 只能备份 InnoDB 和 XtraDB 两种数据表,innobackupex 则封装了 xtrabackup,同时可以备份 MyISAM 数据表。Xtrabackup 做备份的时候不能备份表结构、触发器等等,智能纷纷.idb 数据文件。另外 innobackupex 还不能完全支持增量备份,需要和 xtrabackup 结合起来实现全备的功能。

1.2 XtraBackup特点介绍

C语言编写,可以备份 InnodbXtraD, 不拷贝 *.frm 文件

支持的引擎有:

InnoDB、Xtradb:hotbackup

MyISAM:with read lock

具有的特点有如下几点:

§  1)备份过程快速、可靠;

§  (2)备份过程不会打断正在执行的事务;

§  (3)能够基于压缩等功能节约磁盘空间和流量;

§  (4)自动实现备份检验;

§  (5)还原速度快;

1.3 XtraBackup的下载安装

Xtrabackup工具由 Percona 公司开发的开源热备工具,可以到官网下载到最新的版本文件。

https://www.percona.com/downloads/下载各种版本,也可以在系统中使用 wget 下载。

方法一:

wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/RedHat/6/x86_64/percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm

安装依赖的包

yum install perl-DBI  perl-DBD-MySQL  perl-Time-HiRes perl-IO-Socket-SSL installperl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL

方法二:

下载好的 rpm 包,直接使用 yum 安装,自动安装依赖包,但是需要有 epel 源的支持,所以要下载配置好 epe’

wget -O /etc/yum.repos.d/epel.repo  http://mirrors.aliyun.com/repo/epel-6.repo

yum install -y percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm

1.4 XtraBackup备份用户需要的权限

RELOAD LOCKTABLES 权限为了执行 FLUSHTABLES WITH READ LOCK

REPLICATION CLIENT 为了获取 binary log 位置

CREATE TABLESPACE 权限为了导入表,用户表级别的恢复

SUPER权限在 slave 环境下备份用来启动和关闭 slave 线程

1.5 XtraBackup备份

InnoDB 和非 InnoDB 文件的备份都是通过拷贝文件,但是实现的方式是不同的。

  • InnoDB是以 page 为粒度做的的(Xtrabackup),Xtrabackup在读取每个 page 时会校验 checksum 值,保证数据块是一致的

  • InnoDBcp或者 tar 命令,innobackupexcp MyISAM 文件时已经做了flushFTWRL),磁盘上的文件也是完整的,所以最终备份集里的数据文件都是写入完整的

  • 1.5.1 备份流程

XtraBackup 备份原理和实战详解

1.5.2 全备流程图

XtraBackup 备份原理和实战详解

1.5.3 增量备份流程图

XtraBackup 备份原理和实战详解

1.6 Xtrabackup恢复

1.6.1 恢复流程图

XtraBackup 备份原理和实战详解

XtraBackup 备份原理和实战详解

XtraBackup 备份原理和实战详解

XtraBackup 备份原理和实战详解

XtraBackup 备份原理和实战详解

1.7 Xtrabackup的使用

规范操作,我们先建好全备和增量备份的路径

[root@db01 backups]# pwd

/data/backups

[root@db01 backups]# ll

总用量 12

drwxr-xr-x 4 root root 4096 9  4 17:28 full

drwxr-xr-x 4 root root 4096 9  4 17:26 inc

操作过程:

 mkdir/data/backups/{full,inc} -p

1.7.1 全备

*****生产环境中为了数据一致性最好是 ROW 模式,因为其他的模式数据会丢失*****

命令语法格式:

innobackupex --user=User--password=PWD/data/backup/full --slave-info --safe-slave-backup --parallel=4--safe-slave-backup-timeout=7200  --rsync

–rsync 这个参数一般用作分布式数据库集群的时候

全备步骤:

1、准备一个 xtr_test 数据库,并在 xtr_test 数据库中插入 testbackup 表,字段包含 idstep 两个字段

mysql -uroot -p789 -S /data/3306/mysql.sock
show databases;
create database xtr_test;
use xtr_test;
select database();
create table testbackup(id int not nullauto_increment primary key,step varchar(50))engine=innodb;
show tables;
desc testbackup;
show create table testbackup\G

结果样子:

mysql> desc testbackup;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
id    |int(11)     | NO   | PRI | NULL    | auto_increment |
| step  |varchar(50) | YES  |     | NULL   |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.02 sec)
mysql> show create table testbackup\G
*************************** 1. row***************************
       Table:testbackup
Create Table: CREATE TABLE `testbackup` (
  `id`int(11) NOT NULL AUTO_INCREMENT,
  `step`varchar(50) DEFAULT NULL,
  PRIMARY KEY(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

2、插入字段 “firstfull backup”testbackup表中

insert into testbackup(step) values('first fullbackup');

操作结果:

mysql> select * from testbackup;
+----+-------------------+
id | step              |
+----+-------------------+
|  1 | firstfull backup |
+----+-------------------+
1 row in set (0.02 sec)

3、执行全备

此时,我们创建的 xtr_test 数据库中的 testbackup 表中有数据,而且我们创建的 /data/backups/full 文件下面没有任何内容。下面执行全备,操作命令上面已经给出,此次操作使用的多实例所以用到了 –socket 参数。

innobackupex --user=root --password=789/data/backups/full --slave-info --safe-slave-backup --parallel=4--safe-slave-backup-timeout=7200 --socket=/data/3306/mysql.sock

执行结果一定要看到“160905 20:01:38 completedOK!” OK的字样,才表示成功,从打出的日志我们也能看到备份的过程和上面给出的全备流程图对比起来。

正确输出以后会在 /data/backups/full 指定的目录中生成一个有时间和序号的目录,这个目录就是全备文件存放地方如:

[root@db01 ~]# ls -lrt /data/backups/full/
总用量 4
drwxr-x--- 8 root root 4096 9 月   5 20:012016-09-05_20-01-32 

1.7.2 增量备份

增量备份的前提是一定要有一个全备 ,只有有了全备才能进行所谓的增量备份!!!

增量备份的方式有两种,分别为:

第一种:通过全备的文件

innobackupex --user=root --password=789 --incremental --incremental-lsn=1783249/data/backups/inc  --slave-info--safe-slave-backup --parallel=4 --safe-slave-backup-timeout=7200--socket=/data/3306/mysql.sock

第二种方法:通过LSN

innobackupex --user=root --password=789 --incremental --incremental-lsn=1783249/data/backups/inc  --slave-info--safe-slave-backup --parallel=4 --safe-slave-backup-timeout=7200--socket=/data/3306/mysql.sock

1、准备好全备最新一次的全备文件,这里只做了一次,所以只有一个目录

[root@db01 ~]# ls -lrt /data/backups/full/
总用量 4
drwxr-x--- 8 root root 4096 9 月   5 20:01 2016-09-05_20-01-32 

2、xtr_test 数据库中的 testbackup 表,进行数据的插入,插入内容为“fist increment backup”

mysql> insert into testbackup(step)values('first increment backup');
Query OK, 1 row affected (0.02 sec)
   
mysql> select * from testbackup;
+----+------------------------+
id | step                  |
+----+------------------------+
|  1 | firstfull backup      |
|  2 | firstincrement backup |
+----+------------------------+
2 rows in set (0.01 sec)

3、执行增量备份

这里我们要确定好最新一次的全备(强调)!!!

innobackupex --user=root --password=789--incremental  --incremental-basedir=/data/backups/full/
2016-09-05_20-01-32 
 /data/backups/inc --slave-info--safe-slave-backup --parallel=4 --safe-slave-backup-timeout=7200 --socket=/data/3306/mysql.sock

这里执行结果一定要看到 completed OK!” OK 的字样,才表示成功如果是分布式也可以用 –rsync,我们会在创建的inc 目录下发现创建了一个以时间和序号命名的目录,这个目录就是 Xtrabackup 备份的增量。

执行结果:

[root@db01 ~]# ll /data/backups/inc
总用量 4
drwxr-x--- 8 root root 4096 9 月   5 20:19 2016-09-05_20-19-48 

TIP:innodb 默认是使用的系统表空间,我们可以通过配置参数来使 idb 文件到独立空间中 innodb_file_per_table = 1 这个是修改 idb 到独立空间,如果数据库是线上的,我们可以在配置文件 my.cnf 配置以上参数后,再使用 set globalinnodb_file_per_table= 1 临时生效。

alter table backupstep engine=innodb; 修改表的引擎,这个操作很费时间,需要在业务低点的时候操作

1.7.3 再增量备份的基础上再备份

在创建的 xtr_test 数据库中的 testbackup 表中再次插入内容“secondincrement backup”

mysql> insert into testbackup(step) values('secondincrement backup');
Query OK, 1 row affected (0.01 sec)
   
mysql> select * from testbackup;
+----+-------------------------+
id | step                    |
+----+-------------------------+
|  1 | firstfull backup       |
|  2 | first incrementbackup  |
|  3 | secondincrement backup |
+----+-------------------------+
3 rows in set (0.00 sec)

1确定最新的全备文件

[root@db01 full]# pwd
/data/backups/full
[root@db01 full]# ls -lrt
总用量 4
drwxr-x--- 8 root root 4096 9 月   5 20:01 2016-09-05_20-01-32

   2确定上一次增量备份的 LSN

[root@db01 inc]# ls -lrt
总用量 4
drwxr-x--- 8 root root 4096 9 月   5 20:19 2016-09-05_20-19-48
[root@db01 inc]# cd 2016-09-05_20-19-48/
[root@db01 2016-09-05_20-19-48]# ls
backup-my.cnf krik    performance_schema      xtrabackup_checkpoints  xtr_test
ibdata1.delta mysql   test                    xtrabackup_info
ibdata1.meta  oldboy xtrabackup_binlog_info xtrabackup_logfile
[root@db01 2016-09-05_20-19-48]# cat xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 1793716   # 这个值一定是和上一次全备的 last_lsn 一样,否则就是数据不全
to_lsn = 1794019
last_lsn = 1794019
compact = 0
recover_binlog_info = 0

4、
执行增量备份命令

innobackupex  --user=root --password=789 --incremental--incremental-lsn=1794019 /data/backups/inc --slave-info --safe-slave-backup --parallel=4 --safe-slave-backup-timeout=7200--socket=/data/3306/mysql.sock

这个值是通过查看最近一次增量备份的 xtrabackup_checkpoints 得到

这里执行结果一定要看到“completed OK!” OK的字样,才表示成功

执行结果会在指定的目录 /data/backups/inc 下生成一个新的文件

[root@db01 2016-09-05_20-19-48]# cd ..
[root@db01 inc]# pwd
/data/backups/inc
[root@db01 inc]# ls -lrt
总用量 8
drwxr-x--- 8 root root 4096 9 月   5 20:19 2016-09-05_20-19-48
drwxr-x--- 8 root root 4096 9 月   5 21:18 2016-09-05_21-18-30

到此我们对数据进行了完整的备份,下面会再创建一条语句,但是不会做增量备份,为了是下面测试二进制日志恢复数据。接下来要玩大的了,删库,后面看看能恢复回来不

生产环境中为了数据一致性最好是 ROW 模式,因为其他的模式数据会丢失

mysql> show variables like "log_bin";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin      | ON    |
+---------------+-------+
1 row in set (0.00 sec)
   
mysql> show variables like"%binlog_format%";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW   |
+---------------+-------+
1 row in set (0.00 sec)
   
ot root   418 9 月   4 15:34backup-my.cnf

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2017-04/142477p2.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计24396字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中