Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具。
Xtrabackup中主要包含两个工具:
xtrabackup:是用于热备份innodb, xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构;
innobackupex:是将xtrabackup进行封装的perl脚本,可以备份和恢复MyISAM表以及数据表结构。
一段官方文档的说明:
http://www.percona.com/doc/percona-xtrabackup/2.1/manual.html
It is possible to use the xtrabackup binary alone, however, the recommend way is using it through the innobackupex wrapper script and let it execute xtrabackup for you. It might be helpful to first learn how to use innobackupex, and then learn how to use xtrabackup for having a better low-level understanding or control of the tool if needed.
安装
1、首先从官网上http://www.percona.com/下载较新版本的xtrabackup
percona-xtrabackup-2.2.7-5050-Linux-x86_64.tar.gz
2、开始安装xtrabackup
1)解压
tar -zxvf percona-xtrabackup-2.2.7-5050-Linux-x86_64.tar.gz
2)拷贝innobackupex、 xtrabackup工具到/usr/bin
备份恢复
一、 全量备份
环境介绍:
MySQL:5.6.19
basedir:/u01/mysql
datadir:/u01/mysql/data
步骤:
eg1:./innobackupex --user=root --password=root --host=172.17.210.112 --parallel=4 --throttle=400 --stream=tar /mysqlbak/innobackupex 2>/mysqlbak/innobackupex/bak.log 1>/mysqlbak/innobackupex/fullbak.tar
eg2:./innobackupex --user=root --password=root --host=172.17.210.112 --parallel=4 --throttle=400 /mysqlbak/innobackupex 2>/mysqlbak/innobackupex/bak.log 1>/mysqlbak/innobackupex/
--user=root 备份操作用户名,一般都是root用户
--password=root123 密码
--host=172.17.210.112 备份主机IP
--parallel=4 --throttle=400 并行个数,根据主机配置选择合适的,默认是1个,多个可以加快备份速度
--stream=tar 压缩类型,这里选择tar格式,可选参数还有 xbstream
--compress 压缩选项
--compress-threads=4 压缩进程
--slave-info 备份数据库show slave status中的部分状态信息
--database=zztx单独对zztx数据库做备份,若是不添加此参数那就是对全库做备份
/mysqlbak/innobackupex 备份存放的目录
2>/mysqlbak/innobackupex/bak.log 备份日志,将备份过程中的输出信息重定向到bak.log
1>/mysqlbak/innobackupex/fullbak.tar 备份文件压缩后的名字
查看日志信息,会出现:
141011 09:44:02 innobackupex: Executing FLUSH ENGINE LOGS...
141011 09:44:02 innobackupex: Waiting for log copying to finish
xtrabackup: The latest check point (for incremental): '14275993522'
xtrabackup: Stopping log copying thread.
.>> log scanned up to (14275993522)
xtrabackup: Creating suspend file '/tmp/xtrabackup_log_copied' with pid '19659'
141011 09:44:03 innobackupex: All tables unlocked
141011 09:44:03 innobackupex: Waiting for ibbackup (pid=19659) to finish
xtrabackup: Transaction log of lsn (14275990028) to (14275993522) was copied.
innobackupex: Backup created in directory '/mysqlbak/innobackupex'
141011 09:44:04 innobackupex: Connection to database server closed
innobackupex: You must use -i (--ignore-zeros) option for extraction of the tar stream.
141011 09:44:04 innobackupex: completed OK!
表示备份成功。
二、全量恢复
环境介绍:
MySQL:5.6.19
备份文件目录:/mysqlbak/innobackupex/
步骤:
1.应用日志
[root@newbidb bin]# ./innobackupex --user=root --password=root1 --defaults-file=/etc/my.cnf --apply-log /mysqlbak/innobackupex//
2.拷贝文件。
[root@newbidb bin]# ./innobackupex --user=root --password=root1 --defaults-file=/etc/my.cnf --copy-back /mysqlbak/innobackupex//
注释一下,常用的参数。
--defaults-file=/etc/my.cnf 恢复会使用my.cnf文件把需要恢复的文件,恢复到my.cnf指定的位置。
--apply-log 这是备份时产生的日志,
--copy-back 这是备份源,解压后的备份文件。
恢复需要一点点的时间,出现下面信息表示恢复成功。
innobackupex: Starting to copy InnoDB system tablespace
innobackupex: in '/mysqlbak/innobackupex/'
innobackupex: back to original InnoDB data directory '/u01/mysql/data'
innobackupex: Copying '/mysqlbak/innobackupex//ibdata1' to '/u01/mysql/data/ibdata1'
innobackupex: Starting to copy InnoDB undo tablespaces
innobackupex: in '/mysqlbak/innobackupex/'
innobackupex: back to '/u01/mysql/data'
innobackupex: Starting to copy InnoDB log files
innobackupex: in '/mysqlbak/innobackupex/'
innobackupex: back to original InnoDB log directory '/u01/mysql/data'
innobackupex: Copying '/mysqlbak/innobackupex//ib_logfile1' to '/u01/mysql/data/ib_logfile1'
innobackupex: Copying '/mysqlbak/innobackupex//ib_logfile0' to '/u01/mysql/data/ib_logfile0'
innobackupex: Finished copying back files.
3.修改文件权限。
cd 到data目录
chown -R mysql.mysql data/
4.可能出现的报错:
a.出现下面错误,先初始化一下mysql
[root@newbidb support-files]# ./mysql.server start
Starting MySQL...The server quit without updating PID file (/u01/mysql/data/newbidb.pid).[FAILED]
[root@newbidb script]# ./mysql_install_db --basedir=/u01/mysql --no-defaults --skip-name-resolve --user=mysql --datadir=/u01/mysql/data
b.权限:应该恢复使用的是root用户,但是MySQL需要MySQL用户去访问
[root@newbidb support-files]# ./mysql.server restart
MySQL server PID file could not be found![FAILED]
Starting MySQL.The server quit without updating PID file (/u01/mysql/data/newbidb.pid).[FAILED]
c.连接MySQL的时候
[root@newbidb bin]# ./mysql -uroot -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
没有这个文件,touch mysql.sock 并修改文件权限。
d.恢复备份文件是要保证datadir文件为空,否则会报如下的错误
[root@newbidb data]# innobackupex --user=root /data/backup/
IMPORTANT: Please check that the copy-back run completes successfully.
At the end of a successful copy-back run innobackupex
prints "completed OK!".
Original data directory is not empty! at /usr/bin/innobackupex line 568.
备份原理
1. xtrabackup原理
官方文档:http://www.percona.com/docs/wiki/doku.php?id=percona-xtrabackup:xtrabackup_manual
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数据库启动的速度。
增量备份:
在InnoDB中,每个page中都记录LSN信息,每当相关数据发生改变,page的LSN就会自动增加,xtrabackup的增量备份就是依据这一原理进行的。
(1)首先完成一个完全备份,并记录下此时检查点LSN;
(2)然后增量备份时,比较表空间中每个页的LSN是否大于上次备份的LSN,若是则备份该页并记录当前检查点的LSN。
具体来说,首先在logfile中找到并记录最后一个checkpoint(“last checkpoint LSN”),然后开始从LSN的位置开始拷贝InnoDB的logfile到xtrabackup_logfile;然后开始拷贝全部的数据文件.ibd;在拷贝全部数据文件结束之后,才停止拷贝logfile。所以xtrabackup_logfile文件在并发写入很大时也会变得很大,占用很多空间,需要注意。另外当我们使用--stream=tar或者远程备份--remote-host时默认使用/tmp,但最好显示用参数--tmpdir指定,以免把/tmp目录占满影响备份以及系统其它正常服务。因为logfile里面记录全部的数据修改情况,所以即使在备份过程中数据文件被修改过了,恢复时仍然能够通过解析xtrabackup_logfile保持数据的一致。
2 innobackupex工作原理
官方文档:http://www.percona.com/doc/percona-xtrabackup/2.1/innobackupex/how_innobackupex_works.html
2.1 备份
如果在程序启动阶段未指定模式,innobackupex将会默认以备份模式启动。
默认情况下,此脚本以--suspend-at-end选项启动xtrabackup,然后xtrabackup程序开始拷贝InnoDB数据文件。当xtrabackup程序执行结束,innobackupex将会发现xtrabackup创建了xtrabackupsuspended2文件,然后执行FLUSH TABLES WITH READ LOCK,此语句对所有的数据库表加读锁,然后开始拷贝其他类型的文件。
如果--ibbackup未指定,innobackupex将会自行尝试确定使用的xtrabackup的binary。其确定binary的逻辑如下:首先判断备份目录中xtrabackup_binary文件是否存在,如果存在,此脚本将会依据此文件确定使用的xtrabackup binary。否则,脚本将会尝试连接database server,通过server版本确定binary。如果连接无法建立,xtrabackup将会失败,需要自行指定binary文件。
在binary被确定后,将会检查到数据库server的连接是否可以建立。其执行逻辑是:建立连接、执行query、关闭连接。若一切正常,xtrabackup将以子进程的方式启动。
FLUSH TABLES WITH READ LOCK是为了备份MyISAM和其他非InnoDB类型的表,此语句在xtrabackup已经备份InnoDB数据和日志文件后执行。在这之后,将会备份 .frm, .MRG, .MYD, .MYI, .TRG, .TRN, .ARM, .ARZ, .CSM, .CSV, .par, and .opt 类型的文件。
当所有上述文件备份完成后,innobackupex脚本将会恢复xtrabackup的执行,等待其备份上述逻辑执行过程中生成的事务日志文件。接下来,表被解锁,slave被启动,到server的连接被关闭。接下来,脚本会删掉xtrabackupsuspended2文件,允许xtrabackup进程退出。
2.2 恢复
为了恢复一个备份,innobackupex需要以--copy-back选项启动。
innobackupex将会首先通过my.cnf文件读取如下变量:datadir, innodb_data_home_dir, innodb_data_file_path, innodb_log_group_home_dir,并确定这些目录存在。
接下来,此脚本将会首先拷贝MyISAM表、索引文件、其他类型的文件(如:.frm, .MRG, .MYD, .MYI, .TRG, .TRN, .ARM, .ARZ, .CSM, .CSV, par and .opt files),接下来拷贝InnoDB表数据文件,最后拷贝日志文件。拷贝执行时将会保留文件属性,在使用备份文件启动MySQL前,可能需要更改文件的owener(如从拷贝文件的user更改到mysql用户)。