文章来源:数据库备份恢复之XtraBackup概述及安装部署
1.xtrabackup简介:
前言: mysqldump备份方式是采用逻辑备份,其最大的缺陷就是备份和恢复速度都慢,对于一个小于50G的数据库而言,这个速度还是能够接受的,如果数据库非常大,那再使用mysqldump备份就不太适合了。
Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上唯一一个开源的能够对innodb和xtradb数据库进行物理热备的工具。
2.xtrabakcup特点:
1)备份过程快速,可靠; 2)备份过程不会打断正在执行的事务(不需要锁表) 3)能够给予压缩等功能节约磁盘空间和流量。 4)自动实现备份检验; 5)还原速度快; 6)可以进行流传出备份,备份到另外一台机器上。Xtrabackup中主要有包含两个工具:
1.innobackupex:是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力, 2.xtrabackup:是用于热备innodb,xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构;事务说明: 事务是逻辑上的一组操作,组成这组操作的各个单元,要么全都成功要不全都失败,这个是事务的特性(innodb引擎,ACID特性)
如何使用:
1)在执行sql语句之前,我们要开启事务 start transation; 2)正常执行我们的sql语句 3)当sql语句执行完毕,存在两种情况; 1.全部都成功,我们要将sql语句对数据库造成的影响提交到数据库中commit 2.某些sql语句失败,我们执行rollback(回滚),将对数据库操作赶紧撤销总结:我们可以把当前的事务分为两类
1.已经提交的commit 2.为提交的commit3.Xtrabackup备份原理 官方原理: 在InnoDB内部会维护一个redo日志文件,我们也可以叫做事务日志文件。事务日志会存储每一个InnoDB表数据修改的记录。当InnoDB启动时,InnoDB会检查数据文件和事务日志,并执行两个步骤:它应用(前滚)已经提交事务日志到数据文件,并将修改过但没有提交的数据进行回滚操作。
3.1.xtrabackup备份过程 Xtrabackup在启动时会记住log sequence number(LSN)日志序列号,即当前的redo记录的位置,并且复制所有的数据文件。复制过程需要一些时间,所以这段时间如果数据文件LSM有改动,他会运行一个后台进程,用于监视事务日志,并不停的将事务日志中每个数据文件的修改都记录下来。
3.2.恢复的准备过程 准备(prepare)过程,在这个过程中,xtrabackup使用之前记录事务日志,对各个数据文件执行宅男恢复(类似mysql刚启动时要做的一样) 它的应用(前滚)已经提交的事务日志到数据文件,并将修改过但没有提交的数据进行回滚操作。当这个过程结束后,数据库就可以恢复还原了。
3.3备份过程和恢复过程总结
以上过程(备份过程、恢复过程)在xtrabackup的编译二进制程序中实现。工具Innobackupex备份MyISAM引擎的表和frm文件过程中会先启动xtrabackup,当xtrabackup复制数据文件完成后再执行 FLUSH TABLES WITH READ LOCK来阻止新的写入进来并把MyIsam表数据刷到硬盘上,之后在复制数据文件,然后释放锁。 备份过程中,MyISAM和InnoDB表最终会处于一致,MyisAM表在准备(prepare)过程结束后,InnoDB表数据已经前滚到整个备份结束的点,这个时间点会与FLUSH TABLES WITH READ LOCK的时间点相同(类似Oracle)。InnoDB的prepare过程称为恢复(recover),myisam的数据复制过程称为还原(restore)Mysql数据补充说明:
*.idb文件: InnoDB引擎类型的数据文件(独享表空间存储); 文件存放在和MyISAM数据相同的位置 *.ibdata文件: InnoDB引擎类型的数据文件(共享表空间存储); 可通过innodb_data_home_dir 和innodb_data_file_path两个参数共同配置组成;使用绝对路径来完成配置。 *.MYD文件: 存放Myisam表的数据; 每一个Myisam表都有一个".MYD"文件与之对应,存放在所属数据库文件夹下,和".frm"文件一起。 *.MYI文件: MyISAM引擎的表的索引相关信息; 对于MyiSAM引擎存放cache源于".MYI"文件中。每个MyISAM表对应一个,位置同".frm"和".MYD"一样。 *.frm文件: 存放与表相关的元数据(meta)信息及表结构的定义信息; 无论什么存储引擎,每一个表都会有以表名存放的".frm文件"存放位置在所属的数据库下面。 MyISAM引擎的表中,每个表都被以三个表名的物理文件(frm、myd、myi)做为MyISAM存储类型的表存储。无论多少个表索引,都存放在同一个".MYI"文件中。3.5我们的理解: Xtrabackup只能备份和恢复InnoDB表,而且只有idb文件,frm文件它不管。恢复时需要DBA提示frm. Innobackupex可以备份和恢复MYisam表及frm文件,并且对xtrabackup也做了很好的封装,所以可以使用Innobackupex来备份MYSQL数据库。Innobackupex备份MyiSAM表之前要对全库进行加READ LOCK,阻塞写操作;备份是在主从同步进行的话会影响主从同步,造成延迟。对InnoDB表全备不会阻塞读写。
Xtrabackup和innobackupex这两个工具都提供了许多前文没有提到的功能特点。手册上有对各个功能都有详细的介绍。简单介绍下,这些工具提供了如流(streaming)备份,增量(incremental)备份等,通过复制数据文件,复制日志文件和提交日志到数据文件(前滚)实现了各种复合备份方式。
3.6 Xtrabackup 增量备份的原理是:
1)首先完成一个完全备份,并记录此时检查LSN 2)然后增量备份时,比较表空间每个页的LSN是否大于上次备份的LSN,若是则备份该页记录当前检查点的LSN; 具体来说: 首先在logfile中找到最后一个checkpoint(last checkpoint LSN)然后从LSN的位置开始拷贝InnoDB的loffile到xtrabackup_logfile;然后开始拷贝全部的数据文件".ibd";在拷贝全部数据文件结果之后,才停止拷贝logfile. 注意:在xtrabackup_logfile文件在并发写入很大的时也会变得很大,占用很多空间,当我们使用-stream=tar 或者远程备份 -remote-host默认使用/tmp 但是最好先试参数-tpmdir指定,以免把/tmp 目录占满影响备份以及系统其他正常服务。 logfile里面全部记录数据的全部修改情况,即使在备份时候数据文件被修改了恢复时仍然可以通过解析xtrabackup_logfile保持一致。 Xtrabackup的增量备份只能用于InnoDB,不能用于MyisaM表上。采用增量备份MySql数据库时 xtrabackup会依照上次全备或者增量备份目录对InnoDB进行增量备份,对MyiSAM表会进行全表复制。3.7流备份(streaming):可以直接备份保存到远程服务器上。 当执行恢复时,由于复制时不锁表的,所以此时数据文件都是不一致的,Xtrabackup使用之前保存的redo log 对各个数据进行检查是否与事务日志的checkpoint一致,执行恢复;
1)根据复制数据文件时以及之后提交事务产生的事务日志进行前滚; 2)将未提交的事务进行回滚、 这个过程就是MySQL数据库宕机之后执行的崩溃恢复(crash recovery)3.8 增量备份 在InnoDB中,每个page总都记录LSN信息,每当相关数据发生改变,page的LSN就会自动增加。 xtrabackup的增量备份就是依照这一原理进行的,xtrabackup将上次备份(完全备份集或一个增量备份集)以来LSN改变的page进行备份。所以,要增量备份,第一就要一个完整的备份(就是将MySQL实例或者要备份的数据进行一个完全备份,同时记录LSN,之后可以给予此进行增量备份及恢复。)
增量备份的优点:
1)数据库太大没有足够的时间空间进行全备的,增量备份能有有效的节约空间,并且效率高。 2)支持热备份,备份过程不锁表(InnoDB而言)不阻塞数据库的读写。 3)每日备份只产生少量的数据,也可以采用远程备份,节约本地空间。 4)备份恢复基于文件操作,降低直接数据库操作的风险 5)备份效率更高,恢复效率更高。3.9 恢复与还原
backup的恢复过程包括恢复和还原两个部分。 1)xtrabackup只备份InnoDB表的文件及表的ibd文件,而Innobackupex可以备份InnoDB表在内的其他引擎的表的所有数据文件,由于备份引擎的不同,备份的过程看起也不一样。
完整备份集的恢复:
在innodb表的备份或者直接说ibd数据文件复制的过程中,数据处于不一致的状态,所以要将xtraback_logfile中尚未提交的事务进行回滚,以及将已经提交的事务进行前滚。使的个数据文件处于一个一致性状态,这个过程叫做"准备 prepare" 如果是在从库上执行备份,那说明你没有东西需要回滚,只是简单的apply redo log 就可以了,另外在prepare过程中,可以使用参数 -use-memory增大使用系统内存量从而提交恢复速度。 之后,我们就可以根据backup-my.cnf中的配置把数据文件复制回对应的目录了。当然也可以自己固执回去,但是这里innobackupex会帮助我们完成;在这里,对于InnoDB表来说是完成"后准备"动作,我们称为"恢复recovery";对于MyISAM表来说由于备份时采用锁表方式复制的,所以此时只能简单复制回来,不要apply log 这个我们称为"还原restore"补充说明:本文里之所以使用恢复和还原,也是和其他数据库比如oracle看起来一样。
3.10 完全备份集恢复 对于增量备份的恢复过程,与完全备份集的类似,只是有少许不同;
1)恢复过程需要使用完全备份集合各个增量备份集,各个备份集的恢复与前面说的一样(前滚和回滚)之后的各个增量备份集 redo log 都会应用到完全备份集中。 2)对于完全备份集之后产生的新表,要有特殊处理方式,以便恢复后不丢表。 3)要以完全备份为基础,然后按照顺序应用到各个增量备份集。3.11 流备份和压缩 提到流备份 (streaming) 就要说远程备份和备份压缩,先说流备份吧. 流备份是指备份的数据通过标准输出STDOUT传输给tar 程序进行归档,而不是单纯的将数据文件保存指定的备份目录中,参数 -stream=tar 表示开启流备份功能并打包。同时也可以利用流备份备份到远程服务器上。
例如: innobackupex --stream=TAR ${BACKUP_DIR}/base | gzip > ${BACKUP_DIR}/base.tar.gz innobackupex --stream=TAR ${BACKUP_DIR}/base|ssh somebackupaddr “cat > ${DIR}/base.tar” 当然如果使用了流备份,那么增量备份也就不能用了,因为增量备份需要参考此次备份情况,而上次备份却被打包或者压缩了。
3.12 部分备份和恢复 Xtrabackup只能备份/恢复部分库表,可以正则匹配或者你想要备份的库表的列表,但是InnoDB表必须是独立表空间,同时不能使用流备份功能。
1)使用正则模式匹配备份部分库表,需要使用参数 -include 语句类似如下: innobackupex --include=’^qb.*’ ${BACKUP_DIR}/part-base 2) 使用数据库,列表备份部分库,需要使用参数 –databases,语句类似如下: innobackupex --databases=qb0 qb1 qb2 qb3 ${BACKUP_DIR}/part-base 3) 使用表,列表备份部分表,需要使用参数 –tables-file,语句类似如下: innobackupex --tables-list=${CONF_DIR}/tab.conf ${BACKUP_DIR}/part-base 注:在我们的现实应用中,很少会只备份集群中部分库表,所以只是了解此功能即可,若有现实需要可以参考 percona 官方资料以获取更多信息
能备份部分库表,也就能根据完全备份集进行部分库表的恢复,在现实中很少会用到,但还是说一下吧。 首先在“准备 prepare”的过程中,使用参数 –export 将表导出,这个导出会将每个 InnoDB 表创建一个以.exp 结尾的文件,这些文件为之后的导入过程服务。 innobackupex --apply-log --export ${BACKUP_DIR}/base
然后将你需要恢复的表的 ibd 和 exp 文件复制到目标机器,在目标机器上执行导入:
mysql> create table t() engine=innodb; // 此处需要 DBA 手动创建一个同结构的表或表已存在 mysql> ALTER TABLE t DISCARD TABLESPACE; $ cp t.ibd t.exp ${DATA_DIR}/${DB}/ mysql> ALTER TABLE t IMPORT TABLESPACE;这样的导出导入就可以保住恢复的表可以与数据库其他表保持一致性了。
3.13 并行备份
Xtrbackup还支持并行备份,默认情况下xtrabackup 备份时只会开启一个进程进行数据文件的备份,若配置参数--parallel=N可以让xtrabackup开启N个子进程对多个数据文件进行并发备份,这样可以加快备份的速度。当然服务器的 IO 处理能力以及对服务器的影响也是要考虑的,所以另一个参数 --throttle=IOS 会与它同时使用,这个参数用来限制备份过程中每秒读写的 IO 次数,对服务器的 IO 是一个保护。这两个参数 xtrabackup 和 innobackupex 都支持,举例如下: innobackupex --parallel=4 --throttle=400 ${BACKUP_DIR}/part-base 注意:对同一个数据文件只会有一个进程在备份
Xtrabackup在备份时主要的工作是做数据文件复制,它每次只会读写1MB的数据(即64个page,不能修改),xtrabackup逐页访问1MB数据,使用innodb的buf_page_is_corrupted()函数检查此页的数据是否正常,如果数据不正常,就重新读取这一页,最多重新读取 10 次,如果还是失败,备份就失败了,退出。在复制事务日志的时候,每次读写 512KB 的数据,同样不可以配置.
在官网中,复制相关链接下载最新版本(建议使用当前发布版本前6个月左右的稳定版本) https://www.percona.com/downloads/XtraBackup/LATEST/
1.下载和安装 安装方法一: #下载rpm安装包 wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.3.3/binary/redhat/6/x86_64/percona-xtrabackup-2.3.3-1.el6.x86_64.rpm 2.安装依赖 yum install -y perl-DBD-MySQL per-DBI perl-Time-HiRes libaio* 3.安装rpm包
rpm -ivh percona-xtrabackup-2.3.3-1.e16.x86_64.rpm warning: percona-xtrabackup-2.3.3-1.e16.x86_64.rpm: Header V4 DSA/SHA1 Signature,key ID cd2efd2a: NOKEY error: Faild dependencies: lidev.so4()(64bit) is needed by percona-xtrabackup-2.3.3-1.e16.x86_644.安装libv.so()(64bit) 地址:http://rpmfind.net/linux/RPM/index.html 搜索libev.so.4()(64bit),下载
rpm -ivh libev-4.04-2.e16.x86_64.rpm
5.安装Xtrabackup
rpm -ivh percona-xtrabackup-2.3.3-1.e16.x86_64.rpm Preparing... ########################################### [100%] 1:percona-xtrabackup ########################################### [100%]安装方法二: #使用yum安装 安装percona源 rpm -Uhv http://www.percona.com/downloads/percona-release/percona-release-0.0-1.x86_64.rpm
#使用yum安装percona-xtrabackup: yum -y install percona-xtrabackup
6.检查安装结果
rpm -qa |grep xtraback percona-xtrabackup-2.3.3-1.e16.x86_64 rpm -ql percona-xtrabackup-2.3.3-1.e16.x86_64 /usr/bin/innobackupex /usr/bin/xbcloud /usr/bin/xbcloud_osenv /usr/bin/xbcrpt /usr/bin/xbstream /usr/bin/xtrabackup /usr/bin/doc/percona-xtrabackup-2.3.3 /usr/bin/doc/percona-xtrabackup-2.3.3/COPYING /usr/share/man/man1/innobackupex.1.gz /usr/share/man/man1/xbcrpt.1.gz /usr/share/man/man1/xbstream.1.gz /usr/share/man/man1/xtrabackup.1.gzXtrabackup常用参数 常用参数:
--user=USER #指定备份用户,不指定的话为当前系统用户 --password=PASSWD #指定备份用户密码 --port=PORT #指定数据库端口 --defaults-group=GROUP-NAME #在多实例的时候使用 --host=HOST #指定备份的主机,可以为远程数据库服务器 --apply-log #回滚日志 --database #指定需要备份的数据库,多个数据库之间以空格分开 --defaults-file #指定mysql的配置文件 --copy-back #将备份数据复制回原始位置 --incremental #增量备份,后面跟要增量备份的路径 --incremental-basedir=DIRECTORY #增量备份时使用指向上一次的增量备份所在的目录 --incremental-dir=DIRECTORY #增量备份还原的时候用来合并增量备份到全量,用来指定全备路径 --redo-only #对增量备份进行合并 --rsync #加快本地文件传输,适用于non-InnoDB数据库引擎。不与--stream共用 --safe-slave-backup --no-timestamp #生成的备份文件不以时间戳为目录.1】全量备份与恢复
完全备份目录:/data/backup/full 完全备份与增量备份每次命令操作成功的标志是,日志结尾处打印completed OK! 1.#全量备份 innobackupex --user=root --password /data/backup/full
说明: 上面的命令在我的/data/backup/full 目录生成了一个文件夹【2017-01-20_10-52-43】 一般情况下,这个备份不能用于恢复,因为备份的数据中可能含有尚未提交的事务或者已经提交的事务但尚未同步至数据文件的事务,此时数据文件处于不一致的状态。 因此,我们现在就是要通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。
innobackupex --user=root --password --defaults-file=/data/mysql/my.cnf --apply-log /data/backup/full/2017-01-20_10-52-43 #--apply-log 参数就是开启恢复过程
2.恢复操作演练 1)关闭数据库,备份原数据,创建新的数据目录 执行过程:
[root@mysql 3306]# /data/3306/mysql stop Stoping MySQL... [root@mysql 3306]# mv /data/3306/data/ /data/3306/data_bak [root@mysql 3306]# mkdir /data/3306/data 恢复全备必须恢复到空目录里,不然 会报错。2)执行innobackupex恢复命令
[root@mysql 3306]# innobackupex --defaults-file=/data/3306/my.cnf --user=root --password=123456 --copy-back /data/backup/full/2017-01-20_10-52-433)对新目录授权,此操作需要在innobackupex恢复命令后 chow -R mysql.mysql /data/mysql/data
4)重启服务后,并检查数据是否恢复。
[root@mysql 3306]# /data/3306/mysql start Starting MySQL [root@mysql 3306]# ps -ef|grep 3306 #登录数据查看已经恢复的数据文件。2】增量备份与恢复 环境备份目录说明:
增量备份目录1:/data/backup/inc1 增量备份目录2:/data/backup/inc21)#全量备份 innobackupex --defaults-file=/data/3306/my.cnf --user=root --password=123456 /data/backup/full
2)第一次增量备份 innobackupex --defaults-file=/data/3306/my.cnf --user=root --password=123456 --incremental /data/backup/inc1 --incremental-basedir=/data/backup/full/2017-01-20_10-52-43
# --incremental-basedir 指的是完全备份所在的目录 # 此命令执行结束后,innobackupex命令会在/data/backup目录中创建一个新的以时间命名的目录以存放所有的增量备份数据。 # 另外,在执行过增量备份之后再一次进行增量备份时,其--incremental-basedir应该指向上一次的增量备份所在的目录。 # 需要注意的是,增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是完全备份。2)第二次增量备份 innobackupex --defaults-file=/data/3306/my.cnf --user=root --password=123456 --incremental /data/backup/inc2 --incremental-basedir=/data/backup/inc1/2017-01-20_11-04-31
# 如果需要恢复的话需要先执行如下操作 innobackupex --apply-log --redo-only /data/backup/full/2017-01-20_10-52-43 innobackupex --apply-log --redo-only /data/backup/full/2017-01-20_10-52-43 --incremental-dir=/data/backup/inc1/2017-01-20_11-04-31
# 如果存在多次增量备份的话,就多次执行如下命令。此处执行针对的是第二次增量备份 innobackupex --apply-log --redo-only /data/backup/full/2017-01-20_10-52-43 --incremental-dir=/data/backup/inc2/2017-01-20_11-06-41
# 恢复操作演练,需先停掉服务器并迁移已有的数据目录,详情见全量备份 # 执行恢复命令 innobackupex --defaults-file=/data/3306/my.cnf --user=root --password=123456 --copy-back /data/backup/full/2017-01-20_10-52-43
补充说明: 指定使用 --databases 可以指定库来备份 innobackupex --default-file=/data/3306/my.cnf --user-root --password-123456 --databases="oldboy" /data/backup/ #指定表来备份 innobackupex --default-file=/data/3306/my.cnf --user=root --password=12345 --databases="oldboy test" /data/backup/ #指定压缩包备份 --stream innobackupex --default-file=/data/3306/my.cnf --user=root --password=123456 --stream=tar /backup/full/|gzip >/backup/full/back_$(date +%F).tar.gz
常见的备份有全量备份、增量备份和差异备份。
首先需要弄明白增量备份和差异备份的区别:
增量备份:自从任意类型的上次备份后有所修改做的备份。 差异备份:自上次全备份后有所改变的部分而做的备份。1)全量备份与差异备份结合
以每周数据备份计划为例,我们可以在周一进行完全备份,在周二至周日进行差异备份。如果在周日数据被破坏了,则你只需要还原周一的全量备份和周六的差异备份。这种策略备份数据需要时间较多,但还原数据使用时间较少。2)全量备份与增量备份结合
以每周数据备份计划为例,我们可以在周一进行完全备份,在周二至周日进行增量备份。如果在周日数据被破坏了,则你需要还原周一的全量备份和从周二至周六的所有增量备份。这种策略备份数据需要时间较少,但还原数据使用时间较多。且周二至周六任何一个增量数据损坏,所有备份不可用。3)全量备份、增量备份和差异备份结合
以每周数据备份计划为例,我们可以在周一进行完全备份,在周二至周日进行差异备份,并且每天针对当天的差异备份每隔一段时间(比如半小时)进行增量备份。如果在周日某个时间点数据被破坏了,则你需要还原周一的全量备份和周六的差异备份,然后再还原周日所做的所有增量备份。这种策略操作最复杂,但是数据库最多损失半个小时的数据。借用谁的一句话:只做备份,不做恢复演练,结果可能是一场空。
参考资料: https://www.percona.com/ https://www.percona.com/doc/percona-xtrabackup/2.3/index.html http://op.baidu.com/ http://www.cnblogs.com/gomysql/p/3650645.html