Xtrabackup备份和恢复MySQL(上)

作者:mail
来自:TaobaoDBA 2009年9月2日星期三
摘要:本文介绍了XtraBackup的安装(编译安装)和使用。Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。本文测试使用的是0.8版本,与当前最新版本是0.9区别并不大。Xtrabackup有两个主要的工具:xtrabackup、innobackupex,其中xtrabackup只能备份InnoDB和XtraDB两种数据表,innobackupex则封装了xtrabackup,同时可以备份MyISAM数据表。本文仅仅介绍了innobackupex的备份和恢复。

+++++++++++++++++++++++++++++++++
正文:
+++++++++++++++++++++++++++++++++

一、 环境

测试主机OS:Linux RHEL AS 3

MySQL InnoDB环境:innodb_data_file_path = ibdata1:1G;ibdata2:1G;ibdata3:1G

初始化数据:

use test;
CREATE TABLE items(id INT,var1 VARCHAR(10));
#使用脚本随机插入约1000万数据

下载XtraBackup:

http://www.percona.com/mysql/xtrabackup/0.8/source/

这里下载的是0.8版本的源码包

下载MySQL源码包:

http://dev.mysql.com/downloads/mysql/5.0.html#source

因为是编译安装XtraBackup,需要使用MySQL的源代码

clip_image001

二、 编译安装

你也可以下载对应平台的二进制版本XtraBackup,免去编译安装的步骤,不过目前二进制版本支持的平台并不多,所以这里列出编译的步骤。

tar zxvf mysql-5.0.85.tar.gz #解压源码包

tar zxvf xtrabackup-0.8-src.tar.gz #解压源码包

mv xtrabackup-0.8-src ./mysql-5.0.85/ innobase/ #将XtraBackpu移到InnoDB的源码目录

#如果使用的是MySQL5.1,目录改为/mysql-5.1.*/ storage/innobase/

cd mysql-5.0.85/ innobase #进入源代码目录

patch –p2 < . /xtrabackup-0.8-src/fix_innodb_for_backup.patch #给InnoDB源码打上补丁

#如果使用的是MySQL5.1,使用fix_innodb_for_backup51.patch

cd .. #进入目录mysql-5.0.85

./configure

make #我们只需要Make就可以了,不需要Make install

cd innobase/xtrabackup-0.8-src

make #编译XtraBackup;MySQL5.1必须要使用XtraBackup0.9

编译成功后,我们会获得可执行文件xtrabackup、innobackupex。为了方便使用,分别将其拷贝到某个$PATH路径下。(我这里/u01/mysql/bin/是$PATH路径的一部分)

cp xtrabackup /u01/mysql/bin/

cp innobackupex-1.5.1 /u01/mysql/bin/

安装中要注意的问题:

编译XtraBackup;MySQL5.1必须要使用XtraBackup0.9。

另外,使用MySQL5.1编译,需要简单的修改一下XtraBackup的Makefile:

#MySQL 5.0

#INC= -I. -I.. -I./../include -I./../../include

#INNODBOBJS=

#MySQL 5.1

INC= ……

MYSQLOBJS=

安装完成后,我们就可以使用命令innobackupex来备份我们的数据库了。

三、 备份

XtraBackup使用脚本innobackupx-1.5.1来备份你的数据库。关于innobackupx-1.5.1的详细参数,请参考http://www.percona.com/docs/wiki/percona-xtrabackup:xtrabackup_manual。这里列出比较常用的备份命令:普通备份、打包(Tar)备份、压缩(Tar gzip)备份。

需要注意的是,innobackupex-1.5.1会根据你的/etc/my.cnf配置,来确定你的MySQL数据位置(datadir),所以你并不需要告诉innobackupex-1.5.1你的MySQL数据在哪儿。

1. 普通备份

innobackupex-1.5.1 --user=root --password=123 /u01/backup/1/innobackup/ 2>/u01/backup/1/1.log

备份时间3分38秒;3G的表空间,InnoDB Free 2595840 Kb。

这里我们使用mysql的root用户备份,密码为123。备份的目标目录(target dir)是/u01/backup/1/innobackup/,innobackupex-1.5.1将在该目录下生成备份。例如/u01/backup/1/innobackup/2009-09-01_11-59-29就是我执行脚本后生成的备份,所有的备份文件都在该./2009-09-01_11-59-29目录下。

这里的2>/u01/backup/1/1.log,是将备份过程中的输出信息重定向到1.log。另外innobackupex-1.5.1还支持增量备份,这里并没有测试使用。

那如何恢复呢?为了模拟恢复过程,我先将MySQL停止,并删除MySQL的data目录下所有数据文件。

cd mysql/data/ ;rm –rf *;

innobackupex-1.5.1 --apply-log /u01/backup/1/innobackup/2009-09-01_11-59-29

innobackupex-1.5.1 --apply-log /u01/backup/1/innobackup/2009-09-01_11-59-29

innobackupex-1.5.1 --copy-back /u01/backup/1/innobackup/2009-09-01_11-59-29

cd /u01/mysql/data/

chown -R mysql:dba . #(这时候可能还需要修改datadir修改文件的所有者)

命令innobackupex-1.5.1需要指定具体哪个备份目录,先应用备份log,然后copy back。这里的备份目录是/u01/backup/1/innobackup/2009-09-01_11-59-29。恢复时间约3分钟。

值得一提的是,默认innobackupex-1.5.1会将二进制日志信息存放在文件xtrabackup_binlog_info中发(方便做Slave)。

innobackupex-1.5.1会根据/et/my.cnf来确定MySQL的数据位置。

2. 打包(Tar)备份

这里基本和前面的普通备份类似,就不做详细说明了,之列出对应的命令。值得一提的是,恢复解压缩时,必须使用-i参数。

innobackupex-1.5.1 --user=root --password=123 --stream=tar /u01/backup/2/ 2>/u01/backup/2.log 1>/u01/backup/2/2.tar

大约2分55秒。这里使用1>做标准输出重定向。

恢复:

tar –ixvf 2.tar #解压压缩 这里-i参数是必须的。

innobackupex-1.5.1 --apply-log /u01/backup/2/innobackup

innobackupex-1.5.1 --copy-back /u01/backup/2/innobackup

cd /u01/mysql/data/

chown -R mysql:dba . #(这时候可能还需要修改datadir修改文件的所有者)

mysqld_safe --user=mysql &

3. 压缩(tar gzip)备份

innobackupex-1.5.1 --user=root --password=123 --stream=tar /u01/backup/1/ 2>/u01/backup/2.log | gzip > /u01/backup/1/1.tar.gz

大约3分钟。这里使用了管道|将innobackupex-1.5.1作为gzip的标准输入。它的恢复过程,只需要使用tar –izxvf 解压对应的文件后,操作完全同普通备份。

四、 关于XtraBackup

XtraBackup还在快速的成长阶段,由http://www.percona.com/维护。这里列出一些相关资源:

参考文献

  1. http://www.percona.com/docs/wiki/percona-xtrabackup:start
  2. http://www.ningoo.net/html/2009/using_xtrabackup_backup_mysql_database.html
  3. http://www.innodb.com/doc/hot_backup/manual.html#innobackup
  4. http://www.ibm.com/developerworks/cn/linux/l-diffp/index.html

10 responses to “Xtrabackup备份和恢复MySQL(上)”

  1. […] Xtrabackup备份和恢复MySQL(下) 2009年10月19日  |  11:44 上午分类:MYSQL, 技术细节  |  标签:XtraBackup  |  1 views 作者:周振兴 来自:supu@TaobaoDBA 2009年10月13日星期二 摘要:在上篇中我们介绍了Xtrabackup的编译安装,以及如何使用innobackupex来备份和恢复数据库。本文将继续介绍Xtrabackup中的另一个工具xtrabackup(二进制脚本)。innobackupex对xtrabackup进行了封装可以同时备份InnoDB和MyISAM数据表,在备份MyISAM表时会进行全局锁表,如果单独使用xtrabackup,我们不仅可以实现真正的“在线”备份,还可以进行增量备份InnoDB。本文将介绍如何单独使用xtrabackup来备份你的InnoDB数据。(本文PDF版本:上篇 下篇) […]

  2. gary

    “另外,使用MySQL5.1编译,需要简单的修改一下XtraBackup的Makefile:”
    zhou,能否把这里更细致说下
    mysql 5.1哪个版本?
    xtrabackup具体哪个版本.
    配置文件具体如何修改.
    我编译出错了.

  3. 你打开文件,把 #MySQL 5.0下面的几行注释掉。

    建议使用RPM包安装,简单快捷

  4. gary

    “innobackupex-1.5.1 –apply-log /u01/backup/1/innobackup/2009-09-01_11-59-29”
    “模拟恢复过程”
    现在不需要执行两遍了. 我的1.2版本.

  5. lmj

    这个工具是否能够在线搭建slave
    同时对主库的影响最少?

  6. @lmj 如果你的表主要是InnoDB,完全可以的。Xtrabackup备份InnoDB时是无需锁表的,即备份时不影响读写。但是如果想获得一个一致的Binlog位置,在备份结束时,有个短时间的锁表。

  7. lmj

    @orczhou 搭建slave应该需要一致的binlog位置,想问下这个锁表时间有多长,我测试使用–no-lock的时候没发现这个短暂的锁表的时间

  8. 加了–no-lock 是没有锁表的,所以也无法获得一致的binlog位置;正常情况这个加锁的时间很短的。

  9. nettedfish@live.cn

    锁表主要是因为有myisam的表.如果myism的表很少,锁表的时间一般就几秒.

  10. hyace

    您好,我们项目都在windows server上布,所以我试了下windows上用xtrabackup,但是会报错中断。
    命令:
    cmd>innobackupex.pl –user=root –password=root e:\db\xtr\

    回显:
    InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy
    and Percona Inc 2009-2011. All Rights Reserved.
    This software is published under
    the GNU GENERAL PUBLIC LICENSE Version 2, June 1991.
    150526 12:17:39 innobackupex.pl: Starting mysql with options: –password=xxxxxxxx –user=’root’ –unbuffered —
    150526 12:17:39 innobackupex.pl: Connected to database with mysql child process (pid=5348)
    innobackupex.pl: Error: mysql child process has died: ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using password: YES)

    应该是连接的问题,请问这是怎么回事呢?谢谢!

Leave a Reply

Your email address will not be published. Required fields are marked *