【转载】http://blog.chinaunix.net/space.php?uid=25266990&do=blog&id=3314699
xtrabackup 是 percona 的一个开源项目,可以热备份 innodb , XtraDB, 和 MyISAM (会锁表)
官方网址 http://www.percona.com/docs/wiki/percona-xtrabackup:start
Xtrabackup 是由 percona 开发的一个开源软件,此软件可以说是 innodb 热备工具 ibbackup 的一个开源替代品。这个软件是由 2 个部分组成的 :xtrabackup 和 innobackupex 。 Xtrabackup 专门用于 innodb 引擎和 xtraDB 引擎;而 innobackupex 是专门用于 myisam 和 innodb 引擎,及混合使用的引擎。
一、安装
1 、 RPM 安装:
rpm -ivh –nodeps percona-xtrabackup-debuginfo-2.0.0-417.rhel5.x86_64.rpm
–nodeps( 不检查软件间的依赖关系 ) ,因为安装 xtrabackup 需要 mysql_client ,但是我的是通过源码安装的。所以环境变量要设置正确
比如 export PATH=$PATH:/usr/local/mysql/bin 如果 mysql 没有设置到 PATH 里 会报错。
2 、下载二进制源码包:
tar -zxvf percona-xtrabackup-2.0.0.tar.gz
mv percona-xtrabackup-2.0.0 /usr/loca/xtrabackup
3 、 使用源代码方式安装
如果你想使用源代码方式安装的话,则会发现 其安装方式有点古怪,这是因为它采用的在 MySQL 源代码上打补丁构建的方式。
tar zxf xtrabackup-0.8.tar.gz
cd xtrabackup-0.8
./configure
make
进行到这里时,千万别惯性使然接着 make install ,那样就会接着安装 MySQL 了,正确方法是接着:
cd innobase/xtrabackup/
make
make install
查看版本号:
mysqld 配置文件 : ( 多实例时备份必须要 )
注:文本测试中没有 多实例 ,使用默认my.cnf。
二、 xtrabackup 备份和恢复
Xtrabackup 有两个主要的工具: xtrabackup 、 innobackupex 。 xtrabackup 只能备份 InnoDB 和 XtraDB 两种数据表,支持在线热备份,不会锁表 innobackupex 则封装了 xtrabackup ,同时可以备份 MyISAM 数据表,如果你的数据库里有 innodb 和 myisam 存储引擎,只能使用 innobackupex 备份。
* xtrabackup - 用于热备份 innodb, xtradb 表的工具,不能备份其他表。
* innobackupex - 对 xtrabackup 封装的 perl 脚本,提供了 myisam 表备份的能力。(能进行整库和数据表备份)。本文旨在介绍 Xtrabackup 工具对数据库进行增量备份实践。
1、 innobackupex-1.5.1 备份
在实施备份时,需要在数据库运行的情况下在线执行,并先提前建立用于备份的路径。
参数:
/www/backup/ # 备份的目录
2>/www/backup/backup.log # 将备份过程中的输出信息重定向到 /www/backup/backup.log
–slave-info # 会记录复制主日志的复制点,便于重新做复制用。(用在备份从机器用)
xtrabackup_binlog_info # 存放 binlog 的信息。( binlog 需要另外拷贝备份,如果需要 binlog 的话)
xtrabackup_checkpoints # 存放备份的起始位置和结束位置。
–-stream=tar # 告诉 xtrabackup ,备份需要以 tar 的文件流方式输出。
–-include='test' # 备份包含的库表,如例:意思是要备份 test 库中所有的表。如果需要全备份,则省略这个参数;如果需要备份 test 库下的 2 个表: tableA & tableB, 则写成: –-include='test.tableA|test.tableB' ;再如果 test 库下只有 2 个前缀是 table 的表,你还可以写成: –-include='test.table*' 。
–-throttle=500 #xtrabackup 在备份过程中, IO 操作比较多,因此需要限定一下 IO 操作。以免服务器压力过大,不过好像作用不太明显,也不知道是不是设置的还是过大。待测 …
–-socket=/data/mysql/backup/mysql.sock # 指定 mysql.sock 所在位置,以便备份进程登录 mysql
--apply-log
--redo-only
( 1 )、完整数据备份
例如:
全量备份:
将在 /www/backup/ 目录下产生一个按当前日期时间命令的目录,如 2012-07-18_15-05-06 ,在恢复时,注意要先关闭服务器,并且将 datadir 的目录先清空,在恢复数据后一定需要重置该目录的权限。
模拟故障,具体操作如下:
/usr/local/mysql5/bin/mysqladmin -uroot shutdown
mv /www/mysqldata /tmp/
mkdir /www/mysqldata
应用全量备份:
ln -s /usr/local/mysql5/share/english /www/mysqldata/mysql/english # 恢复初始目录树,否则无法启动
chown -R mysql.mysql /www/mysqldata
/usr/local/mysql5/bin/mysqld_safe --user=mysql &
提示,可以在备份时直接压缩以节约磁盘空间:
不过注意解压需要手动进行,并加入 -i 的参数,否则无法解压出所有文件。
(2) Innobackupex 针对某个库增量备份:
增量备份仅针对 InnoDB 这类支持事务的引擎,对于 MyISAM 等引擎,则仍然是全备了。
全量备份:
登录到数据库 ,创建几个新的对象:
完整备份目录上做第一次增量备份
如果默认存储引擎是基于 MyISAM ,那么增量备份时备份的文件分别是 .frm 、 .MYD 、 .MYI 。
如果默认存储引擎是基于 InnoDB ,那么增量备份时备份的只会是 .frm 文件,我的配置文件所采用的是独立表空间。
在 /www/backup/rec/ 下会产生增量文件:
[root@localhost jss]# cd /www/backup/inc/2012-07-18_19-55-17/
[root@localhost 2012-07-18_19-55-17]# ls -l
total 384
-rw-r--r-- 1 root root 250 Jul 18 19:55 backup-my.cnf
-rw-r----- 1 root root 360448 Jul 18 19:55 ibdata1.delta
-rw-r----- 1 root root 18 Jul 18 19:55 ibdata1.meta
drwxr-xr-x 2 root root 4096 Jul 18 19:55 jss
-rw-r--r-- 1 root root 13 Jul 18 19:55 xtrabackup_binary
-rw-r--r-- 1 root root 26 Jul 18 19:55 xtrabackup_binlog_info
-rw-r----- 1 root root 81 Jul 18 19:55 xtrabackup_checkpoints
-rw-r----- 1 root root 2560 Jul 18 19:55 xtrabackup_logfile.
[root@localhost 2012-07-18_19-55-17]# cd jss/
[root@localhost jss]# ls -l
total 28
-rw-r--r-- 1 mysql mysql 61 Jul 18 19:18 db.opt
-rw-r--r-- 1 mysql mysql 8556 Jul 18 19:18 j1.frm
-rw-rw---- 1 mysql mysql 8556 Jul 18 19:53 ja.frm
note: 此过程仅影响 XtraDB 或基于 InnoDB 的表,其他带不同存储引擎的表会在增量备份出现时被完全复制
恢复过程也需要用到 prepare
首先,提交事务必须重新执行每一个备份
然后,未提交事务必须回退
模拟故障
rm -rf /www/mysqldata/jss
将完整备份中的数据恢复到数据库中
第一个增量备份应用到完整备份
在完整备份目录下会看到一个新增文件:
经过分析,原来是在 prepare 时, XtraBackup 并没有将增量备份集中,属于新建对象的 .frm 文件复制到完整备份集目录,因此在执行 copy-back 时,这部分文件自然也就没有复制回数据文件路径。只有手动还原到 datadir 。
拷贝到 datadir 目录下
cp -rp 2012-07-18_19-47-48jss /www/mysqldata/jss
进入 datadir 查看文件:
[root@localhost backup]# cd /www/mysqldata
[root@localhost mysqldata]# ls
ibdata1 ib_logfile0 ib_logfile1 jss my_db mysql test xtrabackup_binlog_pos_innodb xtrabackup_checkpoints
[root@localhost mysqldata]# chown -R mysql.mysql /www/mysqldata
重启 mysql
2、 xtrabackup 备份详解
xtrabackup 只备份 InnoDB 数据文件,表结构是不备份的,所以恢复的时候,你必须有对应表结构文件 (.frm)
mysql
use jss;
alter table j1 engine=innodb;
(1) 全量备份及恢复
(使用 xtrabackup ,仅限 InnoDB 和 xtradb 表,且注意 mysql 配置文件 my.cnf 中 “default_table_type = InnoDB” 否则不成功)。
执行两次:
将数据库停掉,删除数据库下的 ib* ( ib 开头的所有)文件。
将 /www/backup/ 目录下的 ib* 文件拷贝到数据库目录。
设置权限:
#chown mysql:mysql ib*
重启数据库后测试,是否成功。
[root@localhost backup]# cp ib* /www/mysqldata/
[root@localhost backup]# chown mysql.mysql /www/mysqldata/ib*
[root@localhost backup]# /usr/local/mysql/bin/mysqld_safe --user=mysql &
[1] 1695
[root@localhost backup]# 120719 15:56:19 mysqld_safe Logging to '/www/mysqldata/localhost.localdomain.err'.
120719 15:56:19 mysqld_safe Starting mysqld daemon with databases from /www/mysqldata
[root@localhost backup]# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.57-log MySQL Community Server (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> use jss;
Database changed
mysql> select * from j2;
+------+
| id |
+------+
| 2 |
+------+
1 row in set (0.01 sec)
注意, xtrabackup 只备份数据文件,并不备份数据表结构 (.frm) ,所以使用 xtrabackup 恢复的时候,你必须有对应表结构文件 (.frm) 。
(2) 增量备份及恢复
再次强调, xtrabackup 做增量仅限 InnoDB 和 xtradb 表,且注意 mysql 配置文件 my.cnf 中 “default_table_type= InnoDB” 否则不成功。
做增量前当然要先进行全量备份,在全量的基础上来进行增量。
首先进行全量备份。
在全量备份的基础上进行增量。
( 注: /www/inc/1/ 是每次都需修改的。比如第二次增量就改成 /www/inc/ 2 ,当然可以写个脚本进行自动备份,备份脚本将陆续奉上 ...... 恢复的时候也是一样 )
增量恢复。(步骤同全量恢复,只是在执行恢复命令的时候中间多一步)
将数据库停掉,删除数据库下 /www/mysqldata/ibdata 的 ib* 表文件。将 /www/backup/ 目录下的 ib* 文件拷贝到数据库目录 /www/mysqldata/ibdata 。
设置权限:
#chown mysql:mysql ib*
重启后测试。是否成功。
注:备份前先登录数据库,打开一个表看看记录条数,然后进行备份,然后再对表最终的记录进行修改,然后在备份,再测试。
三、 innobackupex-1.5.1 与 xtrabackup 相结合
备份策略:
整库备份直接用 innobackupex-1.5.1 脚本。
只对 InnoDB 或 xtradb 表,进行备份直接用 xtrabackup 。
由于 xtrabackup 不能备份表结构,所以备份时首先用 innobackupex-1.5.1 脚本对数据库进行整库备份。再用 xtrabackup 进 行表备份。分别进行。恢复时也分别进行恢复。如果发生表结构丢失则先使用 innobackupex-1.5.1 进行恢复,然后再用 xtrabackup 恢 复增量数据。用生成的文件 ib* 覆盖用 innobackupex-1.5.1 恢复后的 ib* 文件。
=======================================================================================
首先, innobackupex-1.5.1 全备份:
# 会生成一个时间文件夹,这里假如是 2012-7-20_15-57-44
然后, xtrabackup 做增量备份:
恢复:
首先停掉数据库,备份二进制日志(如果有的话),然后删除数据库目录下的所有数据库文件 .
cd /www/mysqldata
rm -rf * # 删除数据目录里的所有文件
恢复全量备份:
恢复增量备份:
将 /www/backup/ 目录下的 ib* 文件拷贝到数据库目录
重启 mysql 服务。