说到备份MySQL数据库,不少人可能会先想到其自带的命令行工具mysqldump,要说这个工具确实不错,操作简单调用灵活,不过mysqldump属于逻辑备份工具,类似ORACLE数据库中的export,小数据量时效率尚可,当数据量达到一定规模时,使用mysqldump执行备份的时间也许还可接受,但恢复时间基本就不能忍受了。
这种情况下就需要一种好用又高效的工具,xtrabackup就是其中一款,号称免费版的InnoDB HotBackup。
Xtrabackup提供了两种命令行工具:
- xtrabackup:专用于备份InnoDB引擎的数据;
- innobackupex:这是一个perl脚本,在执行过程中会调用xtrabackup命令,这样用该命令即可以实现备份InnoDB,也可以备份MyISAM引擎的对象。
目前xtrabackup最新版本已经升级到了1.6版本,可以到http://www.percona.com/downloads/xtrabackup/免费下载。
Xtrabackup提供了Linux下常见的安装方式,包括RPM安装,源码编译方式,以及二进制版本安装,这里三思尝试下载了最新的1.6源码包,决定自行编译安装。
1.6版本的源码包相较之前大了数十倍,主要是由于源码包中同时包含了mysql5.1和mysql5.5的源码包,一个2M左右的小软件,居然内置了两个各有20余M的软件安装包,这真不是一般人都想的出来的。
由于1.6版本新推不久,官网中的文档都没有来的及更新完善,源码方式的安装文档也并不完整,三思也只能连蒙带猜,下列安装步骤有可能并非最佳安装方式,仅只是提供了一种,源码安装xtrabackup并使其可用的方式。
由于xtrabackup依赖libinnodb链接库,因此需要先编译InnoDB,而后再编译xtrabackup。要编译安装xtrabackup最简单的方式当然是使用提供的编译脚本,首先还是解压缩文件,并进入到安装目录:
[root@rhel5u3 software]# tar xvfz xtrabackup-1.6.tar.gz
[root@rhel5u3 software]# cd xtrabackup-1.6
ll的话会看到目录有两mysql-5.1.56.tar.gz和mysql-5.5.10.tar.gz两个mysql源码包,正是这两个源码包占用了大量的空间。除此外还有一个innobackupex的perl脚本程序,该脚本可以直接执行,不过执行备份任何时会报:
sh: xtrabackup_55: command not found
innobackupex: fatal error: no 'mysqld' group in MySQL options
innobackupex: fatal error: OR no 'datadir' option in group 'mysqld' in MySQL options
提示xtrabackup_55命令不存在,接下来就是要编译xtrabackup。
在解压缩目录下执行utils/build.sh,注意一定要在xtrabackup安装目录内执行,执行时要指定与之匹配的MySQL数据库版本。
[root@rhel5u3 xtrabackup-1.6]# utils/build.sh
Build an xtrabackup binary against the specified InnoDB flavor.
Usage: build.sh CODEBASE
where CODEBASE can be one of the following values or aliases:
innodb51_builtin | 5.1 build against built-in InnoDB in MySQL 5.1
innodb55 | 5.5 build against InnoDB in MySQL 5.5
xtradb51 | xtradb build against Percona Server with XtraDB 5.1
xtradb55 | xtradb55 build against Percona Server with XtraDB 5.5
三思安装的是mysql5.5,因此这里指定innodb55,执行命令如下:
- [root@rhel5u3 xtrabackup-1.6]# utils/build.sh innodb55
该脚本会根据指定的引擎版本,自动解压缩适当的MySQL源码包并进行编译,这是最简单的安装方式。
命令执行完成之后,xtrabackup就可以用了,一般默认编译后该文件保存在xtrabackup-1.6/mysql-5.5.10/storage/innobase/xtrabackup/目录下,当然也可以通过find命令查找xtrabackup的具体路径。
创建两个软链接,以方便调用XtraBackup命令执行备份:
[root@rhel5u3 xtrabackup-1.6]# ln -s /data/software/xtrabackup-1.6/innobackupex /usr/local/mysql55/bin/innobackupex
[root@rhel5u3 xtrabackup-1.6]# ln -s /data/software/xtrabackup-1.6/mysql-5.5.10/storage/innobase/xtrabackup/xtrabackup_innodb55 /usr/local/mysql55/bin/xtrabackup_55
将mysql55的bin加载到path环境变量,当然这步多数情况下应该在安装mysql时做过了:
- [root@rhel5u3 xtrabackup-1.6]# export PATH=$PATH:/usr/local/mysql55/bin
至此,XtraBackup的源码安装就完成了,接下来就可以使用这些命令执行备份任务了。例如,调用xtrabackup命令执行备份,举个简单的备份示例如下:
[root@rhel5u3 ~]# xtrabackup_55 --defaults-file=/data/mysqldata/3306/my.cnf --backup --target-dir=/data/mysql_20110524
xtrabackup_55 Ver undefined Rev undefined for 5.5.10 Linux (x86_64)
xtrabackup: uses posix_fadvise().
xtrabackup: cd to /data/mysqldata/3306/data
xtrabackup: Target instance is assumed as followings.
xtrabackup: innodb_data_home_dir = /data/mysqldata/3306/innodb_ts
xtrabackup: innodb_data_file_path = ibdata1:10M:autoextend
xtrabackup: innodb_log_group_home_dir = /data/mysqldata/3306/innodb_log
xtrabackup: innodb_log_files_in_group = 2
xtrabackup: innodb_log_file_size = 5242880
110524 17:31:16 InnoDB: Using Linux native AIO
>> log scanned up to (1598402)
[01] Copying /data/mysqldata/3306/innodb_ts/ibdata1
to /data/mysql_20110524/ibdata1
[01] ...done
xtrabackup: The latest check point (for incremental): '1598402'
>> log scanned up to (1598402)
xtrabackup: Stopping log copying thread.
xtrabackup: Transaction log of lsn (1598402) to (1598402) was copied.