MySQL备份恢复之XtraBackup

我们知道,针对InnoDB存储引擎,MySQL本身没有提供合适的热备工具,ibbackup虽是一款高效的首选热备方式,但它是是收费的。好在Percona公司给大家提供了一个开源、免费的Xtrabackup热备工具,它可实现ibbackup的所有功能,并且还扩展支持真正的增量备份功能,是商业备份工具InnoDB Hotbackup的一个很好的替代品。

Xtrabackup包括两个主要工具:Xtrabackup和innobackupex:

Xtrabackup只能备份InnoDB和XtraDB两种引擎表,而不能备份MyISAM数据表。

innobackupex则是参考InnoDBHotbackup的innoback脚本修改而来的一个perl脚本,它封装了xtrabackup,主要是为了能方便的同时备份InnoDB和MyISAM引擎表。但在处理MyISAM时需要加一个读锁,这会阻塞线上服务的写操作,所以数据库中MyISAM表越少越好。另外,该工具还加入了一些其它使用选项,比如slave-info,可以在备份中记录一些Slave需要的信息,根据这些信息,可以很方便的利用备份重做Slave。

通过Xtrabackup,不但可在线(热)备份整个库的InnoDB、XtraDB表,还可在上一次整库备份的基础上做增量备份(InnoDB only),其工作原理如下:

首先完成一个完全备份,并记录下此时检查点的LSN(Log Sequence Number);在进行增量备份时,比较表空间中每个页的LSN是否大于上次备份时的LSN,如果是,则备份该页,同时记录当前检查点的LSN。

注意:在增量备份时,作为备份基础的全备文件不能压缩,否则备份失效;另外,增量备份期间,表结构变更的话,变更部分的备份也会失效。

Ubuntu 14.04下安装MySQL

《MySQL权威指南(原书第2版)》清晰中文扫描版 PDF

Ubuntu 14.04 LTS 安装 LNMP Nginx\PHP5 (PHP-FPM)\MySQL

Ubuntu 14.04下搭建MySQL主从服务器

Ubuntu 12.04 LTS 构建高可用分布式 MySQL 集群

Ubuntu 12.04下源代码安装MySQL5.6以及Python-MySQLdb

二、安装

Pecona官方网站提供了Xtrabackup源码包、二进制包以及RPM包三种安装包,下载地址为: 本文选择最简单方便的RPM包安装,如下:

[root@db ~]# rpm -ivh percona-xtrabackup-2.0.5-499.rhel5.x86_64.rpm

warning: percona-xtrabackup-2.0.5-499.rhel5.x86_64.rpm:Header V4 DSA signature: NOKEY, key ID cd2efd2a

Preparing... ########################################### [100%]

1:percona-xtrabackup ########################################### [100%]

安装完成后,会在/usr/bin/目录下生成如下命令工具:

[root@db ~]# cd /usr/bin/

[root@db bin]# ls xtr* inno*

innobackupex innochecksum xtrabackup_51 xtrapchar xtrapinfo xtrapproto xtrapstats

innobackupex-1.5.1 xtrabackup xtrabackup_55 xtrapin xtrapout xtrapreset

其中:

innobackupex 是备份时直接使用的工具,它是一个perl脚本,内部封装xtrabackup;

innobackupex-1.5.1 是innobackupex文件的一个软链接;

xtrabackup 是备份Innodb引擎的脚本;

xtrabackup_51 xtrabackup运行时需要调用的工具,适用于MySQL 5.1版本;

xtrabackup_55 xtrabackup运行时需要调用的工具,适用于MySQL 5.5版本;

三、Xtrabackup的使用

首先来学习使用Xtrabackup这个命令工具,前面提到:它只能备份InnoDB和XtraDB两种引擎表,不能备份MyISAM数据表。

通过--help参数查看该命令的用法,如下:

Usage: [xtrabackup [--default-file=#] --backup | xtrabackup [--defaults-file=#] --prepare] [OPTIONS]

参数解读如下:

--defaults-file=#   标识默认的配置文件,可显式手工指定,也可不设置;若不设置,则Xtrabackup缺省将从以下目录查找配置文件:  
/etc/my.cnf  
/etc/mysql/my.cnf  
/usr/local/etc/my.cnf  
~/.my.cnf  
然后从中读取[mysqld]和[xtrabackup]配置段。[mysqld]中只需指定datadir、innodb_data_home_dir、innodb_data_file_path、innodb_log_group_home_dir、innodb_log_files_in_group、innodb_log_file_size这6个参数即可让Xtrabackup正常工作。  
--defaults-extra-file=#   如果使用了该参数,则会在读取了全局配置文件后,再读取这里指定的配置文件  
--target-dir=name   备份文件的存放路径  
--backup   执行备份操作,将备份文件存放到target-dir指定的目录下  
--prepare   对备份文件执行恢复前的准备(生成InnoDB logfile)  
--print-param   打印备份或恢复时需要的参数  
--use-memory=#   该参数在prepare的时候使用,控制prepare时innodb实例使用的内存量  
--suspend-at-end   在target-dir目录下产生一个xtrabackup_suspended文件,将xtrabackup进程挂起,不停地将数据文件的变化同步到备份文件,直到用户手工删除xtrabackup_suspended文件  
--throttle=#   每秒钟IO次数,限制backup时使用的I/O操作量,使备份对数据库正常业务的影响最小化  
--log-stream   该参数在backup时使用,将xtrabackup_logfile的内容输出到标准输出,使用该参数时会自动使用suspend-at-end参数,innobackupex脚本的stream模式会使用该参数。  
--incremental-lsn=name   增量备份时只拷贝LSN比该参数指定值新的ibd pages,前次备份到了哪个LSN可以看前次备份集的xtrabackup_checkpoints文件  
--incremental-basedir=name   该参数在backup的时候使用,备份比该参数指定位置的备份集新的idb pages  
--incremental-dir=name   该参数在prepare的时候使用,指定prepare时产生的delta文件和日志文件的存放路径  
--tables=name   在备份file-per-table类型的文件时使用,使用正则表达式指定需要备份的innodb表  
-h, --datadir=name   MySQL数据库的数据文件目录  

示例1:完全备份与恢复(InnoDB)

(1)备份

脚本内容:

[root@db xtrabak]# more xtra_backup.sh
# 2014-04-29
mkdir -p /data/xtrabak/bak_`date +%F`/
echo "backup begin" `date`
xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/data/xtrabak/bak_`date +%F`/
cp -r /var/lib/mysql/test /data/xtrabak/bak_`date +%F`/

注意:xtrabackup只备份数据文件,并不备份数据表结构文件(.frm),所以还需手动拷贝一下,以便xtrabackup恢复时使用

执行备份脚本:

[root@db xtrabak]# sh xtra_backup.sh
backup begin Tue Apr 29 15:22:09 CST 2014
xtrabackup version 2.0.5 for Percona Server 5.1.59 unknown-linux-gnu (x86_64) (revision id: 499)
xtrabackup: uses posix_fadvise().
xtrabackup: cd to /var/lib/mysql/
xtrabackup: Target instance is assumed as followings.
xtrabackup: innodb_data_home_dir = /var/lib/mysql
xtrabackup: innodb_data_file_path = ibdata1:10M:autoextend
xtrabackup: innodb_log_group_home_dir = /var/lib/mysql
xtrabackup: innodb_log_files_in_group = 2
xtrabackup: innodb_log_file_size = 5242880
>> log scanned up to (1830807)
[01] Copying /var/lib/mysql/ibdata1 to /data/xtrabak/bak_2014-04-29/ibdata1
[01] ...done
xtrabackup: The latest check point (for incremental): '1830807'
xtrabackup: Stopping log copying thread.
.>> log scanned up to (1830807)


xtrabackup: Transaction log of lsn (1830807) to (1830807) was copied.

从输出可以看出,备份过程首先记录LSN,然后拷贝数据文件(注意,并没有备份表结构文件.frm),最后拷贝并记录LSN。备份完成后,在指定目标目录除了拷贝过来的数据文件ibdata1及表结构文件夹test外,还生成了另外两个文件,分别记录日志及检查点,如下:

[root@db xtrabak]# cd bak_2014-04-29/
[root@db bak_2014-04-29]# ls
ibdata1 test xtrabackup_checkpoints xtrabackup_logfile

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/f77e9dcebe59efa902c6d94cd6e9607e.html