Mysql xtrabackup工具详解和使用说明

 

Xtrabackup介绍


  MySQL冷备、mysqldump、mydumper、MySQL热拷贝都无法实现对数据库进行增量备份。在实际生产环境中增量备份是非常实用的,如果数据大于50G或100G,存储空间足够的情况下,可以每天进行完整备份,如果每天产生的数据量较大,需要定制数据备份策略。例如每周实用完整备份,周一到周六实用增量备份。而Percona-Xtrabackup就是为了实现增量备份而出现的一款主流备份工具,xtrabakackup有2个工具,分别是xtrabakup、innobakupe。

  Percona-xtrabackup是 Percona公司开发的一个用于MySQL数据库物理热备的备份工具,支持MySQL、Percona server和MariaDB,开源免费,是目前较为受欢迎的主流备份工具。xtrabackup只能备份innoDB和xtraDB两种数据引擎的表,而不能备份MyISAM数据表。

 

Xtrabackup优点


(1)备份速度快,物理备份可靠

(2)备份过程不会打断正在执行的事务(无需锁表)

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

(4)自动备份校验

(5)还原速度快

(6)可以流传将备份传输到另外一台机器上

(7)在不增加服务器负载的情况备份数据

 

Xtrabackup备份原理


(1)innobackupex启动后,会先fork一个进程,用于启动xtrabackup,然后等待xtrabackup备份ibd数据文件;

(2)xtrabackup在备份innoDB数据是,有2种线程:redo拷贝线程和ibd数据拷贝线程。xtrabackup进程开始执行后,会启动一个redo拷贝的线程,用于从最新的checkpoint点开始顺序拷贝redo.log;再启动ibd数据拷贝线程,进行拷贝ibd数据。这里是先启动redo拷贝线程的。在此阶段,innobackupex进行处于等待状态(等待文件被创建)

(4)xtrabackup拷贝完成ibd数据文件后,会通知innobackupex(通过创建文件),同时xtrabackup进入等待状态(redo线程依旧在拷贝redo.log)

(5)innobackupex收到xtrabackup通知后哦,执行FLUSH TABLES WITH READ LOCK(FTWRL),取得一致性位点,然后开始备份非InnoDB文件(如frm、MYD、MYI、CSV、opt、par等格式的文件),在拷贝非InnoDB文件的过程当中,数据库处于全局只读状态。

(6)当innobackup拷贝完所有的非InnoDB文件后,会通知xtrabackup,通知完成后,进入等待状态;

(7)xtrabackup收到innobackupex备份完成的通知后,会停止redo拷贝线程,然后通知innobackupex,redo.log文件拷贝完成;

(8)innobackupex收到redo.log备份完成后,就进行解锁操作,执行:UNLOCK TABLES;

(9)最后innbackupex和xtrabackup进程各自释放资源,写备份元数据信息等,innobackupex等xtrabackup子进程结束后退出。

     在InnoDB内部会维护一个redo日志文件,我们也可以叫做事务日志文件。事务日志会存储每一个InnoDB表数据的记录修改。当InnoDB启动时,InnoDB会检查数据文件和事务日志,并执行两个步骤:它应用(前滚)已经提交的事务日志到数据文件,并将修改过但没有提交的数据进行回滚操作。

    Xtrabackup在启动时会记住log sequence number(LSN),并且复制所有的数据文件。复制过程需要一些时间,所以这期间如果数据文件有改动,那么将会使数据库处于一个不同的时间点。这时,xtrabackup会运行一个后台进程,用于监视事务日志,并从事务日志复制最新的修改。Xtrabackup必须持续的做这个操作,是因为事务日志是会轮转重复的写入,并且事务日志可以被重用。所以xtrabackup自启动开始,就不停的将事务日志中每个数据文件的修改都记录下来。上面就是xtrabackup的备份过程。

接下来是准备(prepare)过程。在这个过程中,xtrabackup使用之前复制的事务日志,对各个数据文件执行灾难恢复(就像mysql刚启动时要做的一样)。当这个过程结束后,数据库就可以做恢复还原了。

过程是备份---->准备。就是说:先将文件全部复制过来,再根据事务日志对部分操作进行回滚。

以上的过程在xtrabackup的编译二进制程序中实现。程序innobackupex可以允许我们备份MyISAM表和frm文件从而增加了便捷和功能。

Innobackupex会启动xtrabackup,直到xtrabackup复制数据文件后,然后执行FLUSH TABLES WITH READ LOCK来阻止新的写入进来并把MyISAM表数据刷到硬盘上,之后复制MyISAM数据文件,最后释放锁。

备份MyISAM和InnoDB表最终会处于一致,在准备(prepare)过程结束后,InnoDB表数据已经前滚到整个备份结束的点,而不是回滚到xtrabackup刚开始时的点。这个时间点与执行FLUSH TABLES WITH READ LOCK的时间点相同,所以myisam表数据与InnoDB表数据是同步的。

类似oracle的,InnoDB的prepare过程可以称为recover(恢复),myisam的数据复制过程可以称为restore(还原)。

 

xtrabackup的安装部署以及备份恢复实现


xtrabackup的安装

安装xtrabckup
下载地址:
https://www.percona.com/downloads/

rpm -ivh mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm
yum install libev.x86_64*
yum install perl-Digest-MD5
yum install perl-DBD-MySQL
rpm -ivh percona-xtrabackup-24-2.4.13-1.el7.x86_64.rpm

[root@localhost ~]# which xtrabackup 
/usr/bin/xtrabackup
[root@localhost ~]# which innobackupex 
/usr/bin/innobackupex

- xtrabackup只能备份innodb和xtradb引擎,不支持myisam引擎
- innobackupex是使用perl封装的脚本,调用xtrabackup的功能,并且支持myisam引擎的备份。

常用选项:  
   --host     指定主机
   --user     指定用户名
   --password    指定密码
   --port     指定端口
   --databases     指定数据库
   --incremental    创建增量备份
   --incremental-basedir   指定包含完全备份的目录
   --incremental-dir      指定包含增量备份的目录   
   --apply-log        对备份进行预处理操作             
     一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。
   --redo-only      不回滚未提交事务
   --copy-back     恢复备份目录

使用innobackupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件,这些文件会被保存到一个以时间命名的目录当中。在备份的同时,innobackupex还会在备份目录中创建如下文件:

#在备份的同时,innobackupex还会在备份目录中创建如下文件:

(1)xtrabackup_checkpoints —— 备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息; 
每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的。
[root@localhost 2020-06-29_16-53-57]# cat xtrabackup_checkpoints
backup_type = full-prepared
from_lsn = 0
to_lsn = 2635323
last_lsn = 2635332
compact = 0
recover_binlog_info = 0


(2)xtrabackup_binlog_info:mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置。
[root@localhost 2020-06-29_16-53-57]# cat  xtrabackup_binlog_info
mysql-bin.000001	154

(3)xtrabackup_binlog_pos_innodb:二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前position。

(4)xtrabackup_binary:备份中用到的xtrabackup的可执行文件;

(5)backup-my.cnf:备份命令用到的配置选项信息;

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

 

 

xtrabackup全量备份与恢复


备份:
innobackupex --user=DBUSER --password=DBUSERPASS --defaults-file=/etc/my.cnf /path/to/BACKUP-DIR/

恢复:
innobackupex --apply-log /backups/20XX-0X-XX_XX-XX-XX/
innobackupex --copy-back --defaults-file=/etc/my.cnf  /backups/20XX-0X-XX_XX-XX-XX/

(1)准备(prepare)一个完全备份

 在实现"准备"的过程中,innobackupex通常还可以使用--user-memory选项来指定其可以使用的内存的大小,默认为100M.如果有足够的内存空间可用,可以多划分一些内存给prepare的过程,以提高其完成备份的速度。

innobackupex --user=root --password=root --backup full
如果执行正确,其最后输出的几行信息通常如下:

120407 09:01:04 innobackupex: completed OK!

(2)从一个完全备份中恢复数据

注意:恢复不用启动MySQL

一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或者已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处于不一致状态。"准备"的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使用得数据文件处于一致性状态。innobackupex命令的--apply-log选项可用于实现上述功能,如下面的命令:

innobackupex --apply-log --use-memory=32m full

一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。
因此,此时数据 文件仍处理不一致状态。
--apply-log的作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态。

 innobackupex命令的--copy-back选项用于恢复操作,其通过复制所有数据相关的文件至mysql服务器DATADIR目录中来执行恢复过程。innobackupex通过backup-my.cnf来获取DATADIR目录的相关信息。

#--copy-back:做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir。 
innobackupex --copy-back /path/to/BACKUP-DIR

当数据恢复至DATADIR目录以后,还需要确保所有的数据文件的属主和属组均为正确的用户,如mysql,否则,在启动mysqld之前还需要事先修改数据文件的属主和属组。如:

# chown -R mysql.mysql /mydata/data/

(3)实战练习

全量备份:
[root@localhost backup]# innobackupex  --user=root --password=root  /data/backup/
[root@localhost backup]# cd 2020-06-29_16-53-57/
[root@localhost 2020-06-29_16-53-57]# ll   #查看备份数据
total 131128
-rw-r----- 1 root root      487 Jun 29 16:54 backup-my.cnf  #备份用到的配置选项信息文件
-rw-r----- 1 root root      320 Jun 29 16:54 ib_buffer_pool  
-rw-r----- 1 root root 12582912 Jun 29 16:56 ibdata1         #数据文件
-rw-r----- 1 root root 50331648 Jun 29 16:56 ib_logfile0
-rw-r----- 1 root root 50331648 Jun 29 16:56 ib_logfile1
-rw-r----- 1 root root 12582912 Jun 29 16:56 ibtmp1
drwxr-x--- 2 root root     4096 Jun 29 16:53 mysql
drwxr-x--- 2 root root     8192 Jun 29 16:53 performance_schema
drwxr-x--- 2 root root     8192 Jun 29 16:53 sys
drwxr-x--- 2 root root       56 Jun 29 16:53 test
-rw-r----- 1 root root       21 Jun 29 16:53 xtrabackup_binlog_info  #mysql服务器当前正在使用的二进制日志文件和此时二进制日志时间的位置信息文件
-rw-r--r-- 1 root root       21 Jun 29 16:56 xtrabackup_binlog_pos_innodb
-rw-r----- 1 root root      113 Jun 29 16:56 xtrabackup_checkpoints  #备份的类型、状态和LSN状态信息文件
-rw-r----- 1 root root      471 Jun 29 16:54 xtrabackup_info
-rw-r----- 1 root root  8388608 Jun 29 16:56 xtrabackup_logfile  #备份的日志文件
-rw-r--r-- 1 root root        1 Jun 29 16:56 xtrabackup_master_key_id

删除数据库的所有文件:
[root@localhost ~]# systemctl stop mysqld
[root@localhost ~]# rm -rf /var/lib/mysql/*


执行恢复操作,并修改文件属主属组

#合并数据,使数据文件处于一致性的状态
#--apply-log的作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态。
[root@localhost ~]# innobackupex --apply-log --use-memory=32m /data/backup/2020-06-29_16-53-57/
[root@localhost ~]# ll /var/lib/mysql
total 0

#--copy-back:做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir。
[root@localhost ~]# innobackupex --copy-back /data/backup/2020-06-29_16-53-57/
[root@localhost ~]# ll /var/lib/mysql
total 122924
-rw-r----- 1 root root      320 Jun 29 17:05 ib_buffer_pool
-rw-r----- 1 root root 12582912 Jun 29 17:05 ibdata1
-rw-r----- 1 root root 50331648 Jun 29 17:05 ib_logfile0
-rw-r----- 1 root root 50331648 Jun 29 17:05 ib_logfile1
-rw-r----- 1 root root 12582912 Jun 29 17:05 ibtmp1
drwxr-x--- 2 root root     4096 Jun 29 17:05 mysql
drwxr-x--- 2 root root     8192 Jun 29 17:05 performance_schema
drwxr-x--- 2 root root     8192 Jun 29 17:05 sys
drwxr-x--- 2 root root       56 Jun 29 17:05 test
-rw-r----- 1 root root       21 Jun 29 17:05 xtrabackup_binlog_pos_innodb
-rw-r----- 1 root root      471 Jun 29 17:05 xtrabackup_info
-rw-r----- 1 root root        1 Jun 29 17:05 xtrabackup_master_key_id


#查看数据目录,可以看到数据已经恢复,但是属主会有问题,需要进行修改,所以一般使用mysql的运行用户进行恢复,否则需要进行修改属主和属组信息
[root@localhost ~]# chown -R mysql. /var/lib/mysql
[root@localhost ~]# ll /var/lib/mysql
total 122924
-rw-r----- 1 mysql mysql      320 Jun 29 17:05 ib_buffer_pool
-rw-r----- 1 mysql mysql 12582912 Jun 29 17:05 ibdata1
-rw-r----- 1 mysql mysql 50331648 Jun 29 17:05 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 Jun 29 17:05 ib_logfile1
-rw-r----- 1 mysql mysql 12582912 Jun 29 17:05 ibtmp1
drwxr-x--- 2 mysql mysql     4096 Jun 29 17:05 mysql
-rw-r----- 1 mysql mysql        0 Jun 29 17:08 mysql-bin.index
drwxr-x--- 2 mysql mysql     8192 Jun 29 17:05 performance_schema
drwxr-x--- 2 mysql mysql     8192 Jun 29 17:05 sys
drwxr-x--- 2 mysql mysql       56 Jun 29 17:05 test
-rw-r----- 1 mysql mysql       21 Jun 29 17:05 xtrabackup_binlog_pos_innodb
-rw-r----- 1 mysql mysql      471 Jun 29 17:05 xtrabackup_info
-rw-r----- 1 mysql mysql        1 Jun 29 17:05 xtrabackup_master_key_id

[root@localhost ~]# systemctl start mysqld
[root@localhost ~]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.30-log MySQL Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

上面是单苦恢复,如果要恢复slave库参考下面

(1)全量备份
[root@master backups]# innobackupex --user=root --password=123456 --host=127.0.0.1 /backups/  #在master上进行全库备份#语法解释说明:
#--user=root 指定备份用户
#--password=123456  指定备份用户密码
#--host  指定主机
#/backups  指定备份目录
[root@master backups]# ll
total 0
drwxr-x--- 7 root root 232 Jul 30 11:01 2018-07-30_11-01-37
[root@master backups]# ll 2018-07-30_11-01-37/  #查看备份数据
total 77856
-rw-r----- 1 root root      418 Jul 30 11:01 backup-my.cnf  #备份用到的配置选项信息文件
-rw-r----- 1 root root 79691776 Jul 30 11:01 ibdata1  #数据文件
drwxr-x--- 2 root root       20 Jul 30 11:01 kim
drwxr-x--- 2 root root     4096 Jul 30 11:01 mysql
drwxr-x--- 2 root root     4096 Jul 30 11:01 performance_schema
drwxr-x--- 2 root root       20 Jul 30 11:01 repppp
drwxr-x--- 2 root root     4096 Jul 30 11:01 wordpress
-rw-r----- 1 root root       21 Jul 30 11:01 xtrabackup_binlog_info  #mysql服务器当前正在使用的二进制日志文件和此时二进制日志时间的位置信息文件
-rw-r----- 1 root root      113 Jul 30 11:01 xtrabackup_checkpoints  #备份的类型、状态和LSN状态信息文件
-rw-r----- 1 root root      482 Jul 30 11:01 xtrabackup_info
-rw-r----- 1 root root     2560 Jul 30 11:01 xtrabackup_logfile    #备份的日志文件

(2)恢复
[root@slave ~]# /etc/init.d/mysqld stop  #停止slave上的mysql
Shutting down MySQL.. SUCCESS! 

[root@slave tools]# yum install -y percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm   #安装xtrabackup
[root@master backups]# scp -r 2018-07-30_11-01-37/ root@192.168.56.12:/backups/   #从master上拷贝备份数据
[root@slave tools]# innobackupex --apply-log /backups/2018-07-30_11-01-37/      #合并数据,使数据文件处于一致性的状态
180729 23:18:23 innobackupex: Starting the apply-log operation

IMPORTANT: Please check that the apply-log run completes successfully.
           At the end of a successful apply-log run innobackupex
           prints "completed OK!".

innobackupex version 2.4.9 based on MySQL server 5.7.13 Linux (x86_64) (revision id: a467167cdd4)
xtrabackup: cd to /backups/2018-07-30_11-01-37/
xtrabackup: This target seems to be not prepared yet.
InnoDB: Number of pools: 1
xtrabackup: xtrabackup_logfile detected: size=8388608, start_lsn=(3127097)
......
InnoDB: FTS optimize thread exiting.
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 3129915
180729 23:18:30 completed OK!
[root@slave ~]# rm -rf /usr/local/mysql/data/  #在slave上删除原有的数据
[root@slave ~]# vim /etc/my.cnf  #配置my.cnf的数据目录路径,否则会报错,要和master一致
datadir=/usr/local/mysql/data
[root@slave ~]# innobackupex --copy-back /backups/2018-07-30_11-01-37/  #在slave上数据恢复
180729 23:32:03 innobackupex: Starting the copy-back operation

IMPORTANT: Please check that the copy-back run completes successfully.
           At the end of a successful copy-back run innobackupex
           prints "completed OK!".
......
180729 23:32:08 completed OK!  #看到completed OK就是恢复正常了
[root@slave ~]# ll /usr/local/mysql/data/  #slave上查看数据目录,可以看到数据已经恢复,但是属主会有问题,需要进行修改,所以一般使用mysql的运行用户进行恢复,否则需要进行修改属主和属组信息
total 188432
-rw-r----- 1 root root 79691776 Jul 29 23:32 ibdata1
-rw-r----- 1 root root 50331648 Jul 29 23:32 ib_logfile0
-rw-r----- 1 root root 50331648 Jul 29 23:32 ib_logfile1
-rw-r----- 1 root root 12582912 Jul 29 23:32 ibtmp1
drwxr-x--- 2 root root       20 Jul 29 23:32 kim
drwxr-x--- 2 root root     4096 Jul 29 23:32 mysql
drwxr-x--- 2 root root     4096 Jul 29 23:32 performance_schema
drwxr-x--- 2 root root       20 Jul 29 23:32 repppp
drwxr-x--- 2 root root     4096 Jul 29 23:32 wordpress
-rw-r----- 1 root root      482 Jul 29 23:32 xtrabackup_info
[root@slave ~]# chown -R mysql.mysql /usr/local/mysql/data/  #修改属主属组
[root@slave ~]# /etc/init.d/mysqld start  #启动mysql
Starting MySQL. SUCCESS! 
[root@slave ~]# mysql -uroot -p -e "show databases;"  #查看数据,是否恢复
Enter password: 
+--------------------+
| Database           |
+--------------------+
| information_schema |
| kim                |
| mysql              |
| performance_schema |
| repppp             |
| wordpress          |
+--------------------+

 

总结全库备份与恢复三步曲


a. innobackupex全量备份,并指定备份目录路径;

b. 在恢复前,需要使用--apply-log参数先进行合并数据文件,确保数据的一致性要求;

c. 恢复时,直接使用--copy-back参数进行恢复,需要注意的是,在my.cnf中要指定数据文件目录的路径。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值