Xtrabackup之备份与还原

Xtrabackup是percona的一个开源项目,可以热备份innodb,XtraDB,和MyISAM(会锁表),可以看做是mysql商业备份工具InnoDB Hotbackup的免费替代品。

①xtrabackup只能备份InnoDB和XtraDB两种数据库表,支持在线热备份,可以在不加锁的情况下备份Innodb数据表,不过此工具不能操作MyiSAM引擎表

②innobackupex是一个脚本封装,封装了xtrabackup,能同时处理Innodb和MyISAM,但在处理MyISAM时需要加一个读锁。


1.     准备工作

由于mysql版本号不同可能导致备份不成功,一次请尽量使用最新的版本,最新的版本会兼容旧版本。

xtrabackup版本:xtrabackup version 2.2.11 based on MySQL server 5.6.24 Linux (x86_64) (revision id: )

mysql版本:Server version: 5.5.5-10.0.15-MariaDB MariaDB Server

xtrabakcup官网下载地址:

https://www.percona.com/software/mysql-database/percona-xtrabackup

mariadb官网下载地址:

https://downloads.mariadb.org/

2.    安装xtrabakcup包

安装xtrabackup需要的依赖包:


yum install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl perl-devel

安装xtrabakcup:


rpm -ivh percona-xtrabackup-2.2.11-1.el6.x86_64.rpm


一、 全库备份和还原

1.1    全库备份

innobackupex --defaults-file=/data/my.cnf  --user=root --password=Xushaojie  /backup/ --socket=/data/mysql/mysql.sock

看到innobackupex: completed OK! 表示成功.

1.2    全库恢复

① 应用日志

innobackupex --defaults-file=/data/my.cnf  --apply-log /backup/2016-07-12_12-29-28/

看到innobackupex: completed OK! 表示成功.

 拷贝文件

innobackupex --defaults-file=/data/my.cnf  --copy-back /backup/2016-07-12_12-29-28/


③ 修改文件权限

chown -R mysql.mysql /data/


初始化mysql

./mysql_install_db --basedir=/data/mysql/ --no-defaults --skip-name-resolve --user=mysql  --datadir = /data/mysql/ 


或者启动的时候mysqld_safe --user=mysql --datadir=/data/mysql/ &

二、 增量备份和还原


1.1    增量备份  第1次

nnobackupex --defaults-file=/data/my.cnf  --user=root  --password=Xushaojie --incremental --incremental-basedir=/backup/2016-07-12_12-29-28  /backup/add/ --socket=/data/mysql/mysql.sock

增量备份要基于上面的全库备份目录进行。

*****************中间插入测试数据**************************

新建测试库

mysql> create database cisco_list;

Query OK, 1 row affected (0.00 sec)

新建测试表

mysql> use cisco_list;

Database changed

mysql> create table `cisco`(name varchar(20),module varchar(20) not null,price int(8));

Query OK, 0 rows affected (0.02 sec)

插入测试数据,后面恢复后可以看到这3条数据。

mysql> insert into cisco values('Cisco 2811','Cisco 2800',5800);

Query OK, 1 row affected (0.00 sec)

mysql> insert into cisco values('Cisco 2960-s','Cisco 2900',12800);

Query OK, 1 row affected (0.00 sec)

mysql> insert into cisco values('Cisco 3560-ws','Cisco 3500',22400);

Query OK, 1 row affected (0.00 sec)

查看数据

mysql> select * from cisco;

+---------------+------------+-------+

| name          | module     | price |

+---------------+------------+-------+

| Cisco 2811    | Cisco 2800 |  5800 |

| Cisco 2960-s  | Cisco 2900 | 12800 |

| Cisco 3560-ws | Cisco 3500 | 22400 |

+---------------+------------+-------+

3 rows in set (0.00 sec)

*****************中间插入测试数据**************************

1.2    增量备份  第2次

innobackupex --defaults-file=/data/my.cnf  --user=root  --password=Xushaojie --incremental --incremental-basedir=/backup/add/2016-07-12_13-18-20  /backup/add/ --socket=/data/mysql/mysql.sock

第1次增量备份作为基础,再次进行第2次增量备份,依次类推

第2次备份的文件路径: /backup/add/2016-07-13_11-55-36

1.3    增量恢复

第一步:全库应用日志

innobackupex --defaults-file=/data/my.cnf  --user=root --apply-log  --redo-only  /backup/2016-07-12_12-29-28     

第二步:增量1应用日志

innobackupex --defaults-file=/data/my.cnf  --user=root --apply-log  --redo-only /backup/2016-07-12_12-29-28  --incremental-dir=/backup/add/2016-07-12_13-18-20 

                                                                                                                              

第三步:增量2应用日志

innobackupex --defaults-file=/data/my.cnf  --user=root --apply-log  --redo-only /backup/2016-07-12_12-29-28  --incremental-dir=/backup/add/2016-07-13_11-55-36                                                                                                                               


第四步:清空datadir

恢复的数据在/data/my.cnf里面定义的datadir目录下,这里我的datadir=/data/mysql

清除数据文件,rm -rf /data/mysql/* (安全起见,也可以移动到其他目录备份起来)

第五步:拷贝还原数据

innobackupex --defaults-file=/data/my.cnf  --copy-back /backup/2016-07-12_12-29-28/                                             


1.4    启动数据库

mysqld_safe  --user=mysql --datadir=/data/mysql &

登录数据库:

#/data/my.cnf里面socket定义的是在/data/mysql/mysql.sock,所以登录mysql也要指定,不能使用默认的。

mysql -S /data/mysql/mysql.sock  -uroot -pXushaojie;

1.5    验证数据

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| backup_test        |

| cisco_list         |

| discuz             |

| mysql              |

| test               |

| wordpress          |

+--------------------+

7 rows in set (0.00 sec)

mysql> use cisco_list;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

mysql> show tables;

+----------------------+

| Tables_in_cisco_list |

+----------------------+

| cisco                |

+----------------------+

1 row in set (0.00 sec)

可以看到表里面的数据是之前插入的3条记录,至此,增量数据恢复成功。

mysql> select * from cisco;

+---------------+------------+-------+

| name          | module     | price |

+---------------+------------+-------+

| Cisco 2811    | Cisco 2800 |  5800 |

| Cisco 2960-s  | Cisco 2900 | 12800 |

| Cisco 3560-ws | Cisco 3500 | 22400 |

+---------------+------------+-------+

3 rows in set (0.00 sec)

PS:第一次备份报错不行,发现是mysql版本和xtrabackup版本不对应导致,2.2.11不行,换为2.0.0版本以后就可以使用。

innobackup 常用参数说明

--defaults-file
同xtrabackup的--defaults-file参数

--apply-log
对xtrabackup的--prepare参数的封装

--copy-back
做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir ;

--remote-host=HOSTNAME
通过ssh将备份数据存储到进程服务器上;

--stream=[tar]
备 份文件输出格式, tar时使用tar4ibd , 该文件可在XtarBackup binary文件中获得.如果备份时有指定--stream=tar, 则tar4ibd文件所处目录一定要在$PATH中(因为使用的是tar4ibd去压缩, 在XtraBackup的binary包中可获得该文件)。
在 使用参数stream=tar备份的时候,你的xtrabackup_logfile可能会临时放在/tmp目录下,如果你备份的时候并发写入较大的话 xtrabackup_logfile可能会很大(5G+),很可能会撑满你的/tmp目录,可以通过参数--tmpdir指定目录来解决这个问题。

--tmpdir=DIRECTORY
当有指定--remote-host or --stream时, 事务日志临时存储的目录, 默认采用MySQL配置文件中所指定的临时目录tmpdir

--redo-only --apply-log组,
强制备份日志时只redo ,跳过rollback。这在做增量备份时非常必要。

--use-memory=#
该参数在prepare的时候使用,控制prepare时innodb实例使用的内存量

--throttle=IOS
同xtrabackup的--throttle参数
--sleep=是给ibbackup使用的,指定每备份1M数据,过程停止拷贝多少毫秒,也是为了在备份时尽量减小对正常业务的影响,具体可以查看ibbackup的手册 ;

--compress[=LEVEL]
对备份数据迚行压缩,仅支持ibbackup,xtrabackup还没有实现;

--include=REGEXP
对 xtrabackup参数--tables的封装,也支持ibbackup。备份包含的库表,例如:--include="test.*",意思是要备份 test库中所有的表。如果需要全备份,则省略这个参数;如果需要备份test库下的2个表:test1和test2,则写 成:--include="test.test1|test.test2"。也可以使用通配符,如:--include="test.test*"。

--databases=LIST
列出需要备份的databases,如果没有指定该参数,所有包含MyISAM和InnoDB表的database都会被备份;

--uncompress
解压备份的数据文件,支持ibbackup,xtrabackup还没有实现该功能;

--slave-info,
备 份从库, 加上--slave-info备份目录下会多生成一个xtrabackup_slave_info 文件, 这里会保存主日志文件以及偏移, 文件内容类似于:CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0

--socket=SOCKET
指定mysql.sock所在位置,以便备份进程登录mysql.