Mysql备份工具xtraback全量和增量测试

【转载】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 安装:

wget  http://www.percona.com/redir/downloads/XtraBackup/XtraBackup-2.0.0/RPM/rhel5/x86_64/percona-xtrabackup-debuginfo-2.0.0-417.rhel5.x86_64.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 、下载二进制源码包:

wget http://www.percona.com/redir/downloads/XtraBackup/XtraBackup-2.0.0/binary/Linux/x86_64/percona-xtrabackup-2.0.0.tar.gz

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 配置文件 ( 多实例时备份必须要 )

  1. [mysqld]

  2. innodb_data_home_dir = /www/mysqldata/ibdata #用来储存文件的数据

  3. innodb_log_group_home_dir = /www/mysqldata/iblogs

  4. innodb_data_file_path=ibdata1:10M;ibdata2:10M:autoextend

  5. innodb_log_files_in_group = 2

  6. innodb_log_file_size = 1G

注:文本测试中没有 多实例 ,使用默认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 备份

 

在实施备份时,需要在数据库运行的情况下在线执行,并先提前建立用于备份的路径。

  1. innobackupex [--defaults-file=/etc/my.cnf] –user=root [--host=192.168.10.198] [--password=xxx] [--port=3306] /www/backup/ 2>/www/backup/backup.log

参数:

/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 )、完整数据备份

例如:

  1. mysql> show databases;

  2. + - - - - - - - - - - - - - - - - - - - - +

  3. | Database |

  4. + - - - - - - - - - - - - - - - - - - - - +

  5. | information_schema |

  6. | jss |

  7. | my_db |

  8. | mysql |

  9. | test |

  10. + - - - - - - - - - - - - - - - - - - - - +

  11. 5 rows in set ( 0. 00 sec)

全量备份:

  1. innobackupex --defaults-file=/etc/my.cnf /www/backup/

Mysql备份工具xtraback全量和增量测试_第1张图片

将在 /www/backup/  目录下产生一个按当前日期时间命令的目录,如 2012-07-18_15-05-06 ,在恢复时,注意要先关闭服务器,并且将 datadir 的目录先清空,在恢复数据后一定需要重置该目录的权限。

模拟故障,具体操作如下:

/usr/local/mysql5/bin/mysqladmin  -uroot shutdown

mv /www/mysqldata  /tmp/

mkdir /www/mysqldata

应用全量备份:

  1. innobackupex --apply-log /www/backup/2012-07-18_15-05-06/

Mysql备份工具xtraback全量和增量测试_第2张图片

 

  1. innobackupex --copy-back /www/backup/2012-07-18_15-05-06/

Mysql备份工具xtraback全量和增量测试_第3张图片

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 &

Mysql备份工具xtraback全量和增量测试_第4张图片

提示,可以在备份时直接压缩以节约磁盘空间:

  1. innobackupex --defaults-file=/etc/my.cnf --stream=tar /www/backup/ | gzip > /www/backup/compress/mysql_backup.tar.gz

不过注意解压需要手动进行,并加入 -i 的参数,否则无法解压出所有文件。

  1. tar zxfi /www/backup/compress/mysql_backup.tar.gz

  2. innobackupex --apply-log /www/backup/compress

  3. innobackupex --copy-back /www/backup/compress

(2) Innobackupex 针对某个库增量备份:

 

    增量备份仅针对 InnoDB 这类支持事务的引擎,对于 MyISAM 等引擎,则仍然是全备了。

全量备份:

  1. innobackupex-1.5.1 --defaults-file=/etc/my.cnf --databases="jss" /www/backup/full/

登录到数据库 ,创建几个新的对象:

  1. mysql> use jss;

  2. Database changed

  3. mysql> show tables;

  4. +---------------+

  5. | Tables_in_jss |

  6. +---------------+

  7. | j1 |

  8. +---------------+

  9. 1 row in set (0.00 sec)

  10. mysql> truncate table j1;

  11. Query OK, 0 rows affected (0.01 sec)

  12. mysql> create table ja(id int);

  13. Query OK, 0 rows affected (0.04 sec)

  14. mysql> insert into ja values (1);

  15. Query OK, 1 row affected (0.01 sec)

完整备份目录上做第一次增量备份

  1. innobackupex-1.5.1 --defaults-file=/etc/my.cnf --databases="jss" --incremental --incremental-basedir=/www/backup/full/2012-07-18_19-47-49/ /www/backup/inc

Mysql备份工具xtraback全量和增量测试_第5张图片
如果默认存储引擎是基于 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

将完整备份中的数据恢复到数据库中

  1. innobackupex-1.5.1 --defaults-file=/etc/my.cnf --databases="jss" --apply-log /www/backup/full/2012-07-18_19-47-49/

Mysql备份工具xtraback全量和增量测试_第6张图片

第一个增量备份应用到完整备份

  1. innobackupex-1.5.1 --defaults-file=/etc/my.cnf --databases="jss" --apply-log /www/backup/full/2012-07-18_19-47-49/ --incremental-dir=/www/backup/inc/2012-07-18_19-55-17/

在完整备份目录下会看到一个新增文件:

经过分析,原来是在 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

Mysql备份工具xtraback全量和增量测试_第7张图片


2、 xtrabackup 备份详解

 

xtrabackup 只备份 InnoDB 数据文件,表结构是不备份的,所以恢复的时候,你必须有对应表结构文件 (.frm)
  mysql
  use jss;
  alter table j1 engine=innodb;

(1) 全量备份及恢复

(使用 xtrabackup ,仅限 InnoDB xtradb 表,且注意 mysql 配置文件 my.cnf “default_table_type = InnoDB” 否则不成功)。

  1. xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/www/backup/

执行两次:

  1. xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/www/backup/

  2. xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/www/backup/

将数据库停掉,删除数据库下的 ib* ib 开头的所有)文件。

Mysql备份工具xtraback全量和增量测试_第8张图片 /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” 否则不成功。

做增量前当然要先进行全量备份,在全量的基础上来进行增量。

首先进行全量备份。

  1. xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/www/backup/

在全量备份的基础上进行增量。

  1. xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/www/inc/1 --incremental-basedir=/www/backup/

( 注: /www/inc/1/ 是每次都需修改的。比如第二次增量就改成 /www/inc/ 2 ,当然可以写个脚本进行自动备份,备份脚本将陆续奉上 ...... 恢复的时候也是一样 )

增量恢复。(步骤同全量恢复,只是在执行恢复命令的时候中间多一步)

  1. xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/www/backup/

  2. xtrabackup --target-dir=/www/backup/ --prepare --incremental-dir=/www/inc/1

  3. xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/www/backup/

  将数据库停掉,删除数据库下 /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 全备份:

  1. innobackupex --defaults-file=/etc/my.cnf /www/backup/full/ 2> /www/backup//1.log

# 会生成一个时间文件夹,这里假如是 2012-7-20_15-57-44

然后, xtrabackup 做增量备份:

  1. innobackupex-1.5.1--defaults-file=/etc/my.cnf --incremental --incremental-basedir=/www/backup/full/2012-7-20_15-57-44/ /www/backup/inc/1

恢复:

首先停掉数据库,备份二进制日志(如果有的话),然后删除数据库目录下的所有数据库文件 .

cd /www/mysqldata

rm -rf * # 删除数据目录里的所有文件

恢复全量备份:

  1. innobackupex-1.5.1 --apply-log /www/backup/full/2012-7-20_15-57-44/ # 应用日志

  2. innobackupex-1.5.1 --copy-back /www/backup/full/2012-7-20_15-57-44/ # 拷贝文件

恢复增量备份:

  1. xtrabackup --prepare --target-dir=/www/backup/full/2012-7-20_15-57-44 --incremental-dir= /www/backup/inc/1

/www/backup/ 目录下的 ib* 文件拷贝到数据库目录

重启 mysql 服务。

 

你可能感兴趣的:(mysql备份)