防伪码:没有相当程度的孤独是不可能有内心的平和。

1、概述

Percona XtraBackup(简称PXB)是 Percona 公司开发的一个用于 MySQL 数据库物理热备的备份工具,支持 MySQl(Oracle)、Percona Server 和 MariaDB,并且开源,淘宝的RDS for MySQL的物理备份就是基于XtraBackup做的。

Xtrabackup有两个主要的工具:xtrabackup、innobackupex

  (1)xtrabackup是C/C++编译的二进制文件,只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表;

  (2)innobackupex则封装了xtrabackup,是一个perl脚本封装,所以能同时备份处理innodb和myisam,但在处理myisam时需要加一个读锁;

1.1 备份原理

整个备份过程如下图:

XtraBackup全量备份与恢复MySQL数据_备份

  1. innobackupex 在启动后,会先 fork 一个进程,启动 xtrabackup进程,然后就等待 xtrabackup 备份完 ibd 数据文件;

  2. xtrabackup 在备份 InnoDB 相关数据时,是有2种线程的,1种是 redo 拷贝线程,负责拷贝 redo 文件,1种是 ibd 拷贝线程,负责拷贝 ibd 文件;redo 拷贝线程只有一个,在 ibd 拷贝线程之前启动,在 ibd 线程结束后结束。xtrabackup 进程开始执行后,先启动 redo 拷贝线程,从最新的 checkpoint 点开始顺序拷贝 redo 日志;然后再启动 ibd 数据拷贝线程,在 xtrabackup 拷贝 ibd 过程中,innobackupex 进程一直处于等待状态(等待文件被创建)。

  3. xtrabackup 拷贝完成idb后,通知 innobackupex(通过创建文件),同时自己进入等待(redo 线程仍然继续拷贝);

  4. innobackupex 收到 xtrabackup 通知后,执行FLUSH TABLES WITH READ LOCK (FTWRL),取得一致性位点,然后开始备份非 InnoDB 文件(包括 frm、MYD、MYI、CSV、opt、par等)。拷贝非 InnoDB 文件过程中,因为数据库处于全局只读状态,如果在业务的主库备份的话,要特别小心,非 InnoDB 表(主要是MyISAM)比较多的话整库只读时间就会比较长,这个影响一定要评估到。

  5. 当 innobackupex 拷贝完所有非 InnoDB 表文件后,通知 xtrabackup(通过删文件) ,同时自己进入等待(等待另一个文件被创建);

  6. xtrabackup 收到 innobackupex 备份完非 InnoDB 通知后,就停止 redo 拷贝线程,然后通知 innobackupex redo log 拷贝完成(通过创建文件);

  7. innobackupex 收到 redo 备份完成通知后,就开始解锁,执行 UNLOCK TABLES;

  8. 最后 innobackupex 和 xtrabackup 进程各自完成收尾工作,如资源的释放、写备份元数据信息等,innobackupex 等待 xtrabackup 子进程结束后退出。


1.2 常用参数

--defaults-file:指明服务器的配置文件,此参数必须作为innobackupex的第一个参数,否则报错

--host:指明连接数据库的主机

--user:指明执行数据库备份的用户名

--password:指明执行备份的密码

--backup:指明为备份,此参数可以忽略

--apply-log:重做日志

--copy-back:执行数据恢复

--slave-info:备份从库的show slave status信息,仅用于在备份从库时使用

--no-lock:不锁表,仅适用于存储引擎为innodb,并且不在乎备份位置点时使用


2、安装XtraBackup

2.1 环境准备

主机名IP系统MySQL版本
MySQL-01192.168.10.20CentOS release 6.9 (Final)5.6.36

MySQL的安装步骤略。

2.2 创建备份用户

mysql> create user 'backup'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.04 sec)
mysql> grant reload,lock tables,replication client,process on *.* to 'backup'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.30 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.04 sec)


2.3 创建备份目录

[root@MySQL-01 ~]#mkdir /backup


2.4 下载xtraBackup

[root@MySQL-01 ~]#cd /opt
# 下载可能较慢。
[root@MySQL-01 opt]#wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.7/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.7-2.el6.x86_64.rpm


2.4 安装XtraBackup

# 安装的时候出现报错,原因为依赖包未安装。
[root@MySQL-01 opt]#rpm -ivh percona-xtrabackup-24-2.4.7-2.el6.x86_64.rpm
warning: percona-xtrabackup-24-2.4.7-2.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
error: Failed dependencies:
	libev.so.4()(64bit) is needed by percona-xtrabackup-24-2.4.7-2.el6.x86_64
	perl(DBD::mysql) is needed by percona-xtrabackup-24-2.4.7-2.el6.x86_64
# 安装相关依赖包
[root@MySQL-01 opt]#yum -y install libev-devel perl-DBD-MySQL
[root@MySQL-01 opt]#rpm -ivh percona-xtrabackup-24-2.4.7-2.el6.x86_64.rpm
warning: percona-xtrabackup-24-2.4.7-2.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
Preparing...                ########################################### [100%]
1:percona-xtrabackup-24  ########################################### [100%]
[root@MySQL-01 opt]#rpm -ql percona-xtrabackup-24-2.4.7-2.el6.x86_64
/usr/bin/innobackupex                #innobackupex脚本工具
/usr/bin/xbcloud
/usr/bin/xbcloud_osenv
/usr/bin/xbcrypt
/usr/bin/xbstream
/usr/bin/xtrabackup                    #最主要的备份工具
/usr/share/doc/percona-xtrabackup-24-2.4.7
/usr/share/doc/percona-xtrabackup-24-2.4.7/COPYING
/usr/share/man/man1/innobackupex.1.gz
/usr/share/man/man1/xbcrypt.1.gz
/usr/share/man/man1/xbstream.1.gz
/usr/share/man/man1/xtrabackup.1.gz

3、备份与恢复测试

3.1 全量备份

# defaults-file:my.cnf配置路径
[root@MySQL-01 opt]#innobackupex --defaults-file=/app/mysql/my.cnf --user=backup --password=123456 /backup
# 查看backup目录下已经有备份文件
[root@MySQL-01 opt]#ll /backup/
total 4
drwxr-x--- 5 root root 4096 Jul 14 17:25 2017-07-14_17-25-24
[root@MySQL-01 opt]#ls /backup/2017-07-14_17-25-24/
backup-my.cnf  performance_schema      xtrabackup_checkpoints
ibdata1        rep                     xtrabackup_info
mysql          xtrabackup_binlog_info  xtrabackup_logfile
[root@MySQL-01 opt]#cat /backup/2017-07-14_17-25-24/xtrabackup_checkpoints
backup_type = full-backuped        #备份方式为全量备份
from_lsn = 0                                  #由于是全备,其实LSN号为0
to_lsn = 13835894                        #截止LSN号
last_lsn = 13835894
compact = 0
recover_binlog_info = 0



3.2 模拟恢复

既然全量备份已经完成,那么就来测试一下。

# 将数据库停掉
[root@MySQL-01 ~]#service mysqld stop
Shutting down MySQL............ SUCCESS!
# 将data文件移到backup目录下
[root@MySQL-01 ~]#mv /app/mysql/data /backup/data_bak
# 无法启动mysqld了
[root@MySQL-01 ~]#service mysqld start
Starting MySQL.Logging to '/app/mysql/data/MySQL-01.err'.
. ERROR! The server quit without updating PID file (/app/mysql/data/MySQL-01.pid).
# apply-log参数:在真正恢复数据库数据之前,先将数据库redo日志状态恢复。
[root@MySQL-01 ~]#innobackupex --defaults-file=/app/mysql/my.cnf --user=backup --password=123456  --apply-log /backup/2017-07-14_17-25-24
# 执行数据恢复
[root@MySQL-01 ~]#innobackupex --defaults-file=/app/mysql/my.cnf --user=backup --password=123456  --copy-back /backup/2017-07-14_17-25-24
[root@MySQL-01 ~]#chown -R mysql.mysql /app/mysql/data
# 再次启动数据库,显示成功
[root@MySQL-01 ~]#service mysqld start
Starting MySQL.Logging to '/app/mysql/data/MySQL-01.err'.
. SUCCESS!


4、参考

http://mysql.taobao.org/monthly/2016/03/07/

http://www.cnblogs.com/olinux/p/5207887.html