InnoDB Hot Backup介绍(上)

作者:mail
来自:supu@TaobaoDBA 2009年10月12日星期一
摘要:本文将较为详细的介绍InnoDB Hot Backup(后简称IHB)使用。IHB是Innobase下的一个商用备份软件,可以实现在线备份InnoDB数据表,这里的“在线备份”是指:在备份的同时不阻塞其他连接的读、请求。(本文提供PDF版本下载:点击下载

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

一、 License

InnoDB Hot Backup授权方式是基于每台server的,可以是按年购买,也可以购买永久使用权限。试用期可以使用30天。

可以通过http://www.innodb.com/products/hot-backup/order/order/ 申请获得一个30天的试用版本,申请后innodb.com将会给你发一封电子邮件,里面有二进制可执行文件ibbackup的下载地址。这样我们就获得了IHB的主要部分ibbackup。

配合ibbackup的工具还有innobackup脚本,该脚本是在GPL协议下发布。如果你购买了IHB,那么使用innobackup可以不受GPL协议的限制,获得和IHB同样的商业授权。

二、 ibbackup

这里将简单测试说明ibbackup的备份、恢复。(很遗憾,ibbackup不能够做增量备份)

1. 备份

这里仅简单的介绍ibbackup的基础使用,更多详细请参考manual

ibbackup的基本命令:

#基本命令:
ibbackup my.cnf my2.cnf
#典型的:
ibbackup /etc/my.cnf /home/mysql/backup-my.cnf

ibbackup会根据第一个参数my.cnf文件,获取需要备份的ibdata和ib_logfile文件位置,并将其备份到第二个参数my2.cnf所指定的位置。

ibbackup将读取第一个参数my.cnf中的如下内容:

datadir=…
innodb_data_home_dir=…
innodb_data_file_path=…
innodb_log_group_home_dir=…
innodb_log_files_in_group=…
innodb_log_file_size=…
#这里需要注意的是,很多的配置文件my.cnf中是没有innodb_log_group_home_dir和innodb_data_home_dir,这样ibbackup会执行失败。

参数my.cnf和my2.cnf中,关于数据文件的数量和大小必须相同。日志文件则可以不一样。下面是我在测试中使用的命令,以及文件中的参数:

/etc/my.cnf文件:
datadir = /disk1/mysql/data
innodb_log_group_home_dir = /disk1/mysql/data
# innodb_log_group_home_dir 在MySQL的配置文件中可以省略,但是ibbackup必须有这个参数才行
innodb_log_file_size = 100M
innodb_log_files_in_group = 4
innodb_data_home_dir = /disk1/mysql/data
# innodb_data_home_dir 在MySQL的配置文件中可以省略,但是ibbackup必须有这个参数才行
innodb_data_file_path = ibdata1:1G;ibdata2:1G;ibdata3:1G
/home/mysql/backup-my.cnf文件:
datadir=/disk1/ibbackup/
innodb_data_home_dir=/disk1/ibbackup
innodb_data_file_path= ibdata1:1G;ibdata2:1G;ibdata3:1G
innodb_log_group_home_dir=/disk1/ibbackup
[set-variable = ]innodb_log_files_in_group=4
[set-variable = ]innodb_log_file_size=100M
这里为什么写set-variable,好像是为了兼容4.0.2之前的版本。参考:这里

开始备份:

ibbackup /etc/my.cnf /home/mysql/backup-my.cnf

备份时,输出信息参考[附录1]。备份后的文件列表:

cd /disk1/ibbackup/ && ls
ibbackup_logfile ibdata1 ibdata2 ibdata3 test
cd test && ls
t1.ibd t2.ibd user_auth.ibd

注意到,这里并没有备份.frm文件。备份的主要时间花费在数据文件的拷贝上。这里共花费232秒(本地备份)。

压缩备份命令为:ibbackup --compress /etc/my.cnf /home/mysql/backup-my.cnf。

2. 恢复

恢复的第一步是应用log。ibbackup在备份是将logfile全部放到了文件ibbackup_logfile中,所以恢复的第一步是将ibbackup_logfile文件中的内容应用到数据文件,并创建对应的logfile。

ibbackup --apply-log /home/mysql/backup-my.cnf
# ibbackup --apply-log输出信息,参考[附录2]。
cd /disk1/ibbackup/ && ls
ibbackup_logfile ibdata1 ibdata2 ibdata3 ib_logfile0 ib_logfile1 ib_logfile2 ib_logfile3 test

这时候,数据文件就是我们需要的了。只需要将对应的文件拷贝的你的数据目录下就可以了。这里我们将原来的数据文件删除(.frm文件需要保留),用备份的文件来恢复数据库。

cp -r /disk1/ibbackup/* /disk1/mysql/data/
mysqld_safe --user=mysql &&

注意事项:
(1).Ibbackup只备份innodb的数据文件(ibdata和*.ibd)、日志文件(ib_logfile*),并不备份*.frm文件,所以恢复的时候,你需要通过其他途径确保你的*.frm文件正常。
(2).如果你备份的时候使用了压缩,那么apply log使用命令:ibbackup --apply-log --uncompress /home/mysql/backup-my.cnf。
(3).在apply-log的时候,我们可以获得二进制文件及其位置,可以利用此信息做slave。

未完待续

In:

9 responses to “InnoDB Hot Backup介绍(上)”

  1. […] Images 上一篇:InnoDB Hot Backup介绍(上) […]

  2. liheng

    您好!我在使用innobackup 时,发现好像不能用普通用户执行脚本,只能用 root 用户才能正常备份,不知道您有没有遇到过这种情况?

  3. 我都是用是普通用户备份的,报什么错误。需要注意的是确定你的目标目录上是否有足够的空间?时候有写权限?
    另外,报什么错误可以贴出来看看

  4. liheng

    您好,很感谢你的回答.

    我的环境是这样的:
    我使用系统预设的 mysql 用户执行一个自己写的备份脚本,整个脚本内容如下:
    INNOBACKUP=”/home/backup/innobackup-1.5.2″
    MYSQLUSER=”root”
    PASSWORD=”123456″
    IBBACKUP=”/home/backup/ibbackup”
    NOWDATE=`date +%Y%m%d%H%M`
    YESTERDAY=`date +%Y%m%d% -d yesterday`
    BACKUPDIR=”/home/backup/backup/$NOWDATE”

    if $INNOBACKUP –ibbackup=”$IBBACKUP” –compress –no-timestamp –user=”$MYSQLUSER” –password=”$PASSWORD” /etc/my.cnf $BACKUPDIR ;then
    echo “`date +%Y%m%d` mysql backup is Finish.” >> /home/backup/backupok
    else
    echo “`date +%Y%m%d` mysql backup is failed.” >> /home/backup/backupfailed
    fi

    我已经将 /home/backup 目录的所有者更改成为了 mysql .而且该目录也有足够的权限.

    系统报错提示:
    File name /var/lib/mysql/mysql/host.myi
    innoDB:Operating system error number 13 in a file operation.
    the error means mysqld does not nave the access rights to the directory.

    但很郁闷的是最后的结果却是 innobackup:innobackup completed ok!

    看提示好像是权限的问题,但 /var/lib/mysql 目录下所有文件属主也是 mysql .

    我看过了,/var/lib/mysql/mysql 及此目录下所有文件的 owner 一直都是 mysql 用户。
    正因为此,所以觉得很是郁闷呀

    /var/lib/mysql/mysql 下的所有文件的权限都为660

  5. 这不是innobackup的问题。你可以看看你的/var/lib/mysql/mysql/host.myi文件权限,或者看看目录/var/lib/mysql/mysql的权限,应该是这儿的问题。(文件的owner应该是mysql用户)

  6. (问题完全超出了本文的范畴~~) 建议你使用最简单的命令备份实验一下:innobackup –user=backup –password=backup /etc/my.cnf /disk1/innobackup/
    排除其他因素干扰。如果仍然不能备份,从其他地方找找原因。

  7. liheng

    请问一下,你们公司有购买 ibbackup 这个软件吗?

  8. 没有 🙂 Xtrabackup is cool

Leave a Reply

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