理解部分(及原理部分):
XtraBackup是percona公司提供的开源工具,以热备Innodb表著称而被广泛采用。
XtraBackup对Innodb的备份之所以是热备,无需锁表,是基于Innodb自身的崩溃恢复机制,它首先复制所有的Innodb数据文件,这样复制出来的文件肯定是不一致的,然后对每个文件进行崩溃恢复处理,最终达到一致。就和MySQL在启动Innodb的时候一样,会通过比较数据文件头和redo log文件头信息来检查数据是否是一致的,如果不一致就尝试通过前滚(把redo log中所有提交的事务写入数据文件)和回滚(从数据文件中撤销所有redo log中未提交的事务引起的修改)来使数据达到最终一致。
XtraBackup在启动的时候会记录一个LSN(log sequence number),然后就把所有的Innodb数据文件复制出来,这样复制出来的数据文件是不一致的,但是XtraBackup会在后台运行一个进程把所有对redo log file的修改记录下来,只要有了这个数据,就能进行崩溃恢复。只所以要额外记录下来,是因为MySQL自身的redo log file是可重用的。
以上的操作是由xtrabackup二进制程序(比如xtrabackup_55)完成的,如果使用innobackupex 脚本,刚才的步骤完成以后,innobackupex就会去备份MyISAM表和.frm文件,这时要保证数据的一致性就会先锁表了,通过FLUSH TABLES WITH READ LOCK命令锁表然后把文件复制出来,再释放掉这个锁。
在恢复数据的时候,要经过prepare(recovery)和restore两个步骤。在prepare结束以后,Innodb的表恢复到了复制Innodb文件结束的时间点,这个时间点也就是锁表复制MyISAM表的起点,所以最终数据是一致的。一般我们在恢复的时候执行两次prepare,是因为第二次prepare会帮助我们生成redo log文件,从而加快MySQL数据库启动的速度。
简单总结Xtrabackup:
| Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具。特点: (1)备份过程快速、可靠; (2)备份过程不会打断正在执行的事务; (3)能够基于压缩等功能节约磁盘空间和流量; (4)自动实现备份检验; (5)还原速度快; |
环境介绍:
平台:CentOS-6.5-x86_64(单台主机实现)
percona-XtraBackup版本:percona-xtrabackup-2.1.8-733.rhel6.x86_64.rpm
下面是 应用案列 的部署:
一、部署Xtrabackup
1、安装percona-xtrabackup和percona-tpplkit服务:
| 其最新版的软件可从 http://www.percona.com/software/percona-xtrabackup/ 安装包: percona-toolkit-2.2.4-1.noarch.rpm percona-xtrabackup-2.1.8-733.rhel6.x86_64.rpm yum安装即可: [root@localhost ~]# yum -y install ./*.rpm |
二、备份的实现
(一)完全备份
1.1 修改配置文件:
| [root@localhost ~]# vim /etc/my.cnf 定位且添加: thread_concurrency = 4 datadir = /data/mydata innodb_file_per_table = ON 指定自定义路径: log-bin=/data/binlogs/master-bin |
1.2 停止MySQL服务:
| [root@localhost ~]# service mysqld stopxtrabackup_checkpoints Shutting down MySQL.. [ OK ] [root@localhost ~]# |
1.3 创建binlogs目录:
| [root@localhost ~]# mkdir /data/binlogs/ [root@localhost ~]# chown -R mysql:mysql /data/binlogs/ [root@localhost ~]# |
1.4 启动MySQL服务:
| [root@localhost ~]# service mysqld start Starting MySQL.. [ OK ] [root@localhost ~]# |
1.5 连入MySQL查看日志:
| [root@localhost ~]# mysql MariaDB [(none)]> SHOW BINARY LOGS; +-------------------+-----------+ | Log_name | File_size | +-------------------+-----------+ | master-bin.000001 | 313 | +-------------------+-----------+ 1 row in set (0.01 sec) MariaDB [(none)]> |
1.6 删除/data/mydata/目录下的mysql-bin.*日志文件(这个是为了后面不影响我们备份):
| [root@localhost ~]# cd /data/mydata/ [root@localhost mydata]# ls aria_log.00000001 ib_logfile1 mysql performance_schema aria_log_control localhost.localdomain.err mysql-bin.000001 test ibdata1 localhost.localdomain.pid mysql-bin.index ib_logfile0 multi-master.info mysql-bin.state [root@localhost mydata]# rm -rf mysql-bin.* |
1.7 创建备份所需目录:
| [root@localhost mydata]# mkdir /mybackups |
1.8 为了演示热备效果吧hellodb中的内容改下hellodb坐下修改:
| è修改引擎: [root@localhost ~]# vim hellodb.sql %s/ENGINE=MyISAM/ENGINE=InnoDB/g [root@localhost ~]# |
1.9 查看都是InnoDB的引擎:
| MariaDB [hellodb]> SHOW TABLE STATUS FROM hellodb; |
1.10 关闭二进制日志,且导入测试库hellodb:
| [root@localhost ~]# mysql MariaDB [(none)]> set sql_log_bin=0; MariaDB [(none)]> source /root/hellodb.sql MariaDB [(none)]> set sql_log_bin=1; |
1.11 完全备份(注意:备份时候MySQL必须是运行状态,而在做数据恢复时候服务必须是处于停滞状态