percona-xtrabackup-2.1.7的安装、使用、排错
安装所需依赖包
yum install libaio libaio-devel perl-Time-HiRes curl curl-devel zlib-devel openssl-devel perl cpio expat-devel gettext-devel perl-ExtUtils-MakeMaker perl-DBD-MySQL.* package bzr bison ncurses-devel zlib-devel gcc gcc-c++ -y
使用二进制源码包安装
tar -zxvf percona-xtrabackup-2.1.7-721-Linux-x86_64.tar.gz cd percona-xtrabackup-2.1.7-Linux-x86_64 cd bin mv ./* /usr/bin
全备份及恢复
innobackupex --user=root --password='root' --defaults-file=/data/my.cnf --port=3306 --socket=/tmp/mysql.sock --parallel=4 /data/xtrabackup/
该语句将拷贝数据文件(由my.cnf里的变量datadir指定)至备份目录下(/data/xtrabackup/),注意:如果不指定--defaults-file,默认值为/etc/my.cnf。我的默认配置文件中没有指定datadir,当是以为需要重启数据库,其实不必,只要将配置文件拷贝到某个位置,修改一下,备份时调用即可,我的拷贝到/data下,备份成功后,将在备份目录下创建一个时间戳目录(本例创建的目录为/data/xtrabackup/2014-01-29_09-05-25),在该目录下存放备份文件
恢复:
恢复之前,要先关闭数据库,并且删除数据文件和日志文件
innobackupex --user=root --password='root' --defaults-file=/data/my.cnf --parallel=4 --use-memory=4G --apply-log /data/xtrabackup/2013-10-29_09-05-25 innobackupex --user=root --password='root' --defaults-file=/data/my.cnf --parallel=4 --copy-back /data/xtrabackup/2013-10-29_09-05-25
恢复分为两个步骤,第1步是apply-log,为了加快速度,一般建议设置--use-memory,这个步骤完成之后,目录/data/xtrabackup/2014-01-29_09-05-25下的备份文件已经准备就绪。
第2步是copy-back,即把备份文件拷贝至原数据目录下。
恢复完成之后,要记得检查数据目录的所有者和权限是否正确
增量备份及其恢复
注意:innobackupex 增量备份仅针对InnoDB这类支持事务的引擎,对于MyISAM等引擎,则仍然是全备。
增量备份:
增量备份需要基于全备,先假设我们已经有了一个全备(/data/xtrabackup/2013-10-29_09-05-25),我们需要在该全备的基础上做增量备份。
[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片
innobackupex --defaults-file=/opt/mysql/my.cnf --user=root --password=*** --incremental-basedir=/data/xtrabackup/2013-10-29_09-05-25 --incremental /backup/mysql/data
其中--incremental-basedir指向全备目录,--incremental指向增量备份的目录。
上面语句执行成功之后,会在--incremental执行的目录下创建一个时间戳子目录(本例中为:/data/xtrabackup/2013-10-29_09-52-37),在该目录下存放着增量备份的所有文件。
在备份目录下,有一个文件xtrabackup_checkpoints记录着备份信息,全备的信息如下:
[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片
backup_type = full-backuped
from_lsn = 0
to_lsn = 563759005914
last_lsn = 563759005914
基于该全备的增量备份的信息如下:
[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片
backup_type = incremental
from_lsn = 563759005914
to_lsn = 574765133284
last_lsn = 574765133284
从上面可以看出,增量备份的from_lsn正好等于全备的to_lsn。
那么,我们是否可以在增量备份的基础上再做增量备份呢?答案是肯定的,只要把--incremental-basedir执行上一次增量备份的目录即可,如下所示:
[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片
innobackupex --defaults-file=/data/my.cnf --user=root --password=*** --incremental-basedir=/data/xtrabackup/2013-10-29_09-52-37 --incremental /backup/mysql/data
它的xtrabackup_checkpoints记录着备份信息如下:
[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片
backup_type = incremental
from_lsn = 574765133284
to_lsn = 574770200380
last_lsn = 574770200950
可以看到,该增量备份的from_lsn是从上一次增量备份的to_lsn开始的。
恢复:
增量备份的恢复比全备要复杂很多,第一步是在所有备份目录下重做已提交的日志,如:
[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片
innobackupex --apply-log --redo-only BASE-DIR innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1 innobackupex --apply-log BASE-DIR --incremental-dir=INCREMENTAL-DIR-2
其中BASE-DIR是指全备目录,INCREMENTAL-DIR-1是指第一次的增量备份,INCREMENTAL-DIR-2是指第二次的增量备份,以此类推。
这里要注意的是:最后一步的增量备份并没有--redo-only选项!还有,可以使用--use_memory提高性能。
以上语句执行成功之后,最终数据在BASE-DIR(即全备目录)下。
第一步完成之后,我们开始第二步:回滚未完成的日志:
[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片
innobackupex --apply-log BASE-DIR
上面执行完之后,BASE-DIR里的备份文件已完全准备就绪,最后一步是拷贝:
[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片
innobackupex --copy-back BASE-DIR
同样地,拷贝结束之后,记得检查下数据目录的权限是否正确。
错误:
[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片
sh: xtrabackup_55: command not found
innobackupex: Error: no 'mysqld' group in MySQL options at /home/mysql/admin/bin/percona-xtrabackup-2.1.6/innobackupex line 4341.
解决方法:
[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片
cp xtrabackup_innodb55 xtrabackup_55
错误
innobackupex: Error: Failed to connect to MySQL server as DBD::mysql module is not installed at /usr/bin/innobackupex line 2976
处理过程总结:
查找是否缺dbd包
rpm -qa | grep perl-DBD-MySQL
没有缺包,卸载这两个包
rpm -e --nodeps perl-DBD-MySQL
rpm -e --nodeps perl-DBI
还是不济,于是深挖
yum deplist perl-DBD-MySQL | grep mysql
dependency: libmysqlclient.so.16()(64bit)
provider: mysql-libs.x86_64 5.1.71-1.el6
provider: mysql-libs.x86_64 5.1.73-3.el6_5
dependency: libmysqlclient.so.16(libmysqlclient_16)(64bit)
provider: mysql-libs.x86_64 5.1.71-1.el6
provider: mysql-libs.x86_64 5.1.73-3.el6_5
其实问题的症结已经出来了,于是
ll /usr/lib64/mysql/*
lrwxrwxrwx. 1 root root 26 2月 15 2012 /usr/lib64/mysql/libmysqlclient_r.so.16 -> libmysqlclient_r.so.16.0.0
-rwxr-xr-x. 1 root root 1588520 6月 25 2011 /usr/lib64/mysql/libmysqlclient_r.so.16.0.0
lrwxrwxrwx. 1 root root 24 2月 15 2012 /usr/lib64/mysql/libmysqlclient.so.16 -> libmysqlclient.so.16.0.0
-rwxr-xr-x. 1 root root 1577896 6月 25 2011 /usr/lib64/mysql/libmysqlclient.so.16.0.0
没有问题,包都是有的,又再网上来回的找,基本再没有其他的解决方案,于是:
vi /etc/ld.so.conf.d/mysql-x86_64.conf
/data/program/mysql5/lib
此时才知道,libmysqlclient.so.16 为被调用到,因为 /data/program/mysql5/lib中的包是libmysqlclient.so.18
修改/etc/ld.so.conf.d/mysql-x86_64.conf
/usr/lib64/mysql/
问题解决
转载于:https://blog.51cto.com/buguoruci/1361308