XtraBackup全量备份与恢复MySQL数据
防伪码:没有相当程度的孤独是不可能有内心的平和。
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 备份原理
整个备份过程如下图:
innobackupex 在启动后,会先 fork 一个进程,启动 xtrabackup进程,然后就等待 xtrabackup 备份完 ibd 数据文件;
xtrabackup 在备份 InnoDB 相关数据时,是有2种线程的,1种是 redo 拷贝线程,负责拷贝 redo 文件,1种是 ibd 拷贝线程,负责拷贝 ibd 文件;redo 拷贝线程只有一个,在 ibd 拷贝线程之前启动,在 ibd 线程结束后结束。xtrabackup 进程开始执行后,先启动 redo 拷贝线程,从最新的 checkpoint 点开始顺序拷贝 redo 日志;然后再启动 ibd 数据拷贝线程,在 xtrabackup 拷贝 ibd 过程中,innobackupex 进程一直处于等待状态(等待文件被创建)。
xtrabackup 拷贝完成idb后,通知 innobackupex(通过创建文件),同时自己进入等待(redo 线程仍然继续拷贝);
innobackupex 收到 xtrabackup 通知后,执行FLUSH TABLES WITH READ LOCK (FTWRL),取得一致性位点,然后开始备份非 InnoDB 文件(包括 frm、MYD、MYI、CSV、opt、par等)。拷贝非 InnoDB 文件过程中,因为数据库处于全局只读状态,如果在业务的主库备份的话,要特别小心,非 InnoDB 表(主要是MyISAM)比较多的话整库只读时间就会比较长,这个影响一定要评估到。
当 innobackupex 拷贝完所有非 InnoDB 表文件后,通知 xtrabackup(通过删文件) ,同时自己进入等待(等待另一个文件被创建);
xtrabackup 收到 innobackupex 备份完非 InnoDB 通知后,就停止 redo 拷贝线程,然后通知 innobackupex redo log 拷贝完成(通过创建文件);
innobackupex 收到 redo 备份完成通知后,就开始解锁,执行 UNLOCK TABLES;
最后 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-01 | 192.168.10.20 | CentOS 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.rpmwarning: percona-xtrabackup-24-2.4.7-2.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEYerror: 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.rpmwarning: percona-xtrabackup-24-2.4.7-2.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEYPreparing... ########################################### [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 4drwxr-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_checkpointsibdata1 rep xtrabackup_infomysql xtrabackup_binlog_info xtrabackup_logfile[root@MySQL-01 opt]#cat /backup/2017-07-14_17-25-24/xtrabackup_checkpointsbackup_type = full-backuped #备份方式为全量备份from_lsn = 0 #由于是全备,其实LSN号为0to_lsn = 13835894 #截止LSN号last_lsn = 13835894compact = 0recover_binlog_info = 0
3.2 模拟恢复
既然全量备份已经完成,那么就来测试一下。
# 将数据库停掉[root@MySQL-01 ~]#service mysqld stopShutting down MySQL............ SUCCESS!# 将data文件移到backup目录下[root@MySQL-01 ~]#mv /app/mysql/data /backup/data_bak# 无法启动mysqld了[root@MySQL-01 ~]#service mysqld startStarting 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 startStarting 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