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.