一、什么是Xtrabackup?
Xtrabackup 是一个对 InnoDB 做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具 InnoDB Hotbackup 的一个很好的替代品。
Xtrabackup 有两个主要的工具:xtrabackup、innobackupex(本次测试主要讲xtrabackup)
1、xtrabackup 只能备份 InnoDB 和 XtraDB 两种数据表,而不能备份 MyISAM 数据表
2、innobackupex是参考了InnoDBHotbackup的innoback脚本修改而来的.innobackupex是一个perl脚本封装,封装了xtrabackup。主要是为了方便的同时备份InnoDB和MyISAM引擎的表,但在处理myisam时需要加一个读锁。并且加入了一些使用的选项。如slave-info可以记录备份恢复后,作为 slave 需要的一些信息,根据这些信息,可以很方便的利用备份来重做 slave。
二 、Xtrabackup可以做什么?
1、在线(热)备份整个库的 InnoDB、 XtraDB 表
2、在xtrabackup的上一次整库备份基础上做增量备份(innodbonly)。MySQL数据库本身提供的工具并不支持真正的增量备份,二进制日志恢复是 point-in-time(时间点)的恢复而不是增量备份
3、可以远程备份,以流的形式产生备份,直接保存到远程机器上,对本机硬盘空间不足时很有用。
三 、Xtrabackup的工作原理
1、Xtrabackup基于InnoDB的crash-recovery功能。它会复制innodb的datafile,由于不锁表,在恢复的时候使用crash-recovery,使得数据恢复一致。
2、InnoDB维护了一个redo-log,又称为transaction-log,事务日志,它包含了innodb数据的所有改动情况。当InnoDB启动的时候,它会先去检查data-file和transaction-log。
3、XtraBackup在备份的时候,一页一页地复制innodb的数据,而且不锁定表,与此同时,XtraBackup还有另外一个线程监视着transactions-log,一旦log发生变化,就把变化过的log-pages复制走。为什么要急着复制走呢?因transactions-log文件大小有限,写满之后,就会从头再开始写,所以新数据可能会覆盖到旧的数据。
4、在prepare过程中,XtraBackup使用复制到的transactions-log对备份出来的innodb-data-file进行crash-recovery。
四 、Xtrabackup的应用场景
1、基于以上原理,xtrabackup备份恢复工具比较适合数据增长型数据库。对于数据增长型的库,由于数据的增长导致数据备份和恢复的空间和时间上的压力较大。而xtrabackup有增量备份的功能,在短时间内可以通过进行增量备份来保证数据的安全性。而长期来看,仍然需要间断性的进行全库备份。此外,由于xtrabackup对innodb的数据库不进行锁定,因此对要求不影响线上服务的数据备份和恢复较适合。
2、而对于数据量无明显增长,且更新为主的数据更新型数据库,xtrabackup 显得过于复杂。xtrabackup 操作反而不如 mysqldump 的性能高。
五、Xtrabackup的优势
1、无需停止数据库进行 InnoDB 热备,快速、可靠的完成备份
2、备份期间不间断事务处理
3、节省磁盘空间和网络带宽
4、自动对备份文件进行验证
5、快速恢复,保障在线运行时间持久性
六、Xtrabackup安装、备份、恢复测试
1 实验环境
操作系统 Linux Red Hat6.5
数据库 mysql 5.5.27
2 安装所需依赖包
yum install cmake gcc gcc-c++ libaio libaio-devel automake autoconf bzr bison libtool ncurses-devel zlib-devel libgcrypt-devel perl-ExtUtils-MakeMaker perl-DBD-MySQL.* perl-Time-HiRes -y
3 解压安装包并编译
[root@Louis media]# cd /home/tools/
[root@Louis tools]# ls
cmake-2.8.8 cmake-2.8.8.tar.gz mysql-5.5.27.tar.gz percona-xtrabackup-2.1.9.tar.gz
[root@Louis tools]# tar xvzf percona-xtrabackup-2.1.9.tar.gz
[root@Louis percona-xtrabackup-2.1.9]# utils/build.sh innodb55
4 调整软件位置
[root@Louis utils]# cd /application/
[root@Louis application]# ls
mysql mysql-5.5.27
[root@Louis application]# mkdir xtrabackup
[root@Louis application]# mv /home/tools/percona-xtrabackup-2.1.9/* /application/xtrabackup/
复制备份命令到bin目录
[root@Louis xtrabackup]# cp /application/xtrabackup/innobackupex /usr/bin/innobackupex
[root@Louis xtrabackup]# cp /application//xtrabackup/src/xtrabackup_innodb55 /usr/bin/xtrabackup_55
[root@Louis xtrabackup]# cp /application/xtrabackup/src/xbstream /usr/bin/xbstream
至此 Xtrabackup已安装完成,下面进行测试
5 创建测试数据
创建MyIsam引擎表
mysql> create database test1;
Query OK, 1 row affected (0.16 sec)
mysql> use test1;
Database changed
mysql> create table users (id int primary key auto_increment,name varchar(20) not null unique,password varchar(100) not null,address varchar(200))ENGINE=MyISAM;
Query OK, 0 rows affected (0.06 sec)
mysql> insert into users (id,name,password,address) values (1,'zhang','1234',null),(2,'wang','4321','Shijiazhuang'), (3,'li','5678','Beijing');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from users;
+----+-------+----------+--------------+
| id | name | password | address |
+----+-------+----------+--------------+
| 1 | zhang | 1234 | NULL |
| 2 | wang | 4321 | Shijiazhuang |
| 3 | li | 5678 | Beijing |
+----+-------+----------+--------------+
3 rows in set (0.00 sec)
创建InnoDB表
mysql> create database test2;
Query OK, 1 row affected (0.00 sec)
mysql> create table t1 (id int primary key auto_increment,name varchar(20) not null)ENGINE=InnoDB;
Query OK, 0 rows affected (0.16 sec)
mysql> insert into t1 (id,name) values (1,'louis'),(2,'tom'),(13,'scott');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from t1;
+----+-------+
| id | name |
+----+-------+
| 1 | louis |
| 2 | tom |
| 13 | scott |
+----+-------+
3 rows in set (0.00 sec)
6 创建备份目录
[root@Louis xtrabackup]# mkdir -p /backup/{full_data,dk_data,zl_data}
full_data: 全库备份路径
dk_data: 单库备份路径
zl_data: 增量备份路径
7 全库备份恢复测试
1)全库备份
[root@Louis 3306]# innobackupex --defaults-file=/mysqldata/3306/my.cnf --user=root --password=123456 /backup/full_data
--defaults-file : 默认配置文件的路径
--user:授权的数据库用户
--password:数据库用户的密码
--target-dir=name 备份文件的存放目录路径(即:/backup/full_data )
[root@Louis test1]# cd /backup/full_data/
[root@Louis full_data]# ls
2018-05-04_02-18-37
[root@Louis full_data]# cd 2018-05-04_02-18-37/
[root@Louis 2018-05-04_02-18-37]# ls
backup-my.cnf mysql shsnc test1 xtrabackup_binary xtrabackup_checkpoints
ibdata1 performance_schema test test2 xtrabackup_binlog_info xtrabackup_logfile
2)模拟误删除
mysql> use test1
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> drop table users;
Query OK, 0 rows affected (0.00 sec)
mysql> use test2
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> drop table t1;
Query OK, 0 rows affected (0.30 sec)
mysql> use test1;
Database changed
mysql> select * from users;
ERROR 1146 (42S02): Table 'test1.users' doesn't exist
3)恢复准备
[root@Louis 2018-05-04_02-18-37]# innobackupex --defaults-file=/mysqldata/3306/my.cnf --user=root --password=123456 --apply-log /backup/full_data/2018-05-04_02-18-37
4)停库
[root@Louis 2018-05-04_02-18-37]# mysqladmin -uroot -p123456 -S /mysqldata/3306/mysql.sock shutdown
5)把备份文件拷贝到原数据目录下并授权
[root@Louis data]# cd /mysqldata/3306/data/
[root@Louis data]# ls
ibdata1 ib_logfile0 ib_logfile1 ib_logfile2 mysql performance_schema shsnc test test1 test2
[root@Louis data]# rm -rf *
[root@Louis data]# ls
[root@Louis data]# cp -ap /backup/full_data/2018-05-04_02-18-37/* /mysqldata/3306/data/
[root@Louis data]# ls
backup-my.cnf ib_logfile0 ib_logfile2 performance_schema test test2 xtrabackup_binlog_info xtrabackup_checkpoints
ibdata1 ib_logfile1 mysql shsnc test1 xtrabackup_binary xtrabackup_binlog_pos_innodb xtrabackup_logfile
[root@Louis data]# chown -R mysql.mysql /mysqldata/3306/data
6)重启数据库
[root@Louis data]# /mysqldata/3306/mysql start
Starting MySQL...
7)验证数据是否恢复成功
mysql> use test1;
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> select * from users;
+----+-------+----------+--------------+
| id | name | password | address |
+----+-------+----------+--------------+
| 1 | zhang | 1234 | NULL |
| 2 | wang | 4321 | Shijiazhuang |
| 3 | li | 5678 | Beijing |
+----+-------+----------+--------------+
3 rows in set (0.00 sec)
mysql> use test2;
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> select * from t1;
+----+-------+
| id | name |
+----+-------+
| 1 | louis |
| 2 | tom |
| 13 | scott |
+----+-------+
3 rows in set (0.00 sec)
8 单库备份恢复测试
单库备份跟全库用法是一样的,只不过单库在备份里,要指定要备份的数据库名
1)单库备份
[root@Louis data]# innobackupex --defaults-file=/mysqldata/3306/my.cnf --user=root --password=123456 --databases=test1 /backup/dk_data
注:如果备份从库的话需要添加参数:--slave-info
innobackupex --defaults-file=/mysqldata/3306/my.cnf --user=root --password=123456 --slave-info --databases=test1 /tmp
[root@Louis data]# cd /backup/dk_data/2018-05-04_02-48-44/
[root@Louis 2018-05-04_02-48-44]# ls
backup-my.cnf ibdata1 test1 xtrabackup_binary xtrabackup_binlog_info xtrabackup_checkpoints xtrabackup_logfile
2)模拟误删除
mysql> use test1;
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> select * from users;
+----+-------+----------+--------------+
| id | name | password | address |
+----+-------+----------+--------------+
| 1 | zhang | 1234 | NULL |
| 2 | wang | 4321 | Shijiazhuang |
| 3 | li | 5678 | Beijing |
+----+-------+----------+--------------+
3 rows in set (0.00 sec)
mysql> drop table users;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from users;
ERROR 1146 (42S02): Table 'test1.users' doesn't exist
3)停库
[root@Louis 2018-05-04_02-48-44]# mysqladmin -uroot -p123456 -S /mysqldata/3306/mysql.sock shutdown
4)恢复准备
[root@Louis 2018-05-04_02-48-44]# innobackupex --defaults-file=/mysqldata/3306/my.cnf --user=root --password=123456 --apply-log /backup/dk_data/2018-05-04_02-48-44
5)把备份文件拷贝到原数据目录下并授权
[root@Louis 2018-05-04_02-48-44]# cd /mysqldata/3306/data/
[root@Louis data]# ls
backup-my.cnf ib_logfile0 ib_logfile2 performance_schema test test2 xtrabackup_binlog_info xtrabackup_checkpoints
ibdata1 ib_logfile1 mysql shsnc test1 xtrabackup_binary xtrabackup_binlog_pos_innodb xtrabackup_logfile
[root@Louis data]# rm -rf test1
[root@Louis data]# ls
backup-my.cnf ib_logfile0 ib_logfile2 performance_schema test xtrabackup_binary xtrabackup_binlog_pos_innodb xtrabackup_logfile
ibdata1 ib_logfile1 mysql shsnc test2 xtrabackup_binlog_info xtrabackup_checkpoints
[root@Louis data]# cp -ap /backup/dk_data/2018-05-04_02-48-44/test1 ./test1
[root@Louis data]# ls
backup-my.cnf ib_logfile0 ib_logfile2 performance_schema test test2 xtrabackup_binlog_info xtrabackup_checkpoints
ibdata1 ib_logfile1 mysql shsnc test1 xtrabackup_binary xtrabackup_binlog_pos_innodb xtrabackup_logfile
[root@Louis data]# cd test1
[root@Louis test1]# ls
db.opt users.frm users.MYD users.MYI
[root@Louis test1]# chown -R mysql:mysql ../test1
6)重启数据库
[root@Louis test1]# /mysqldata/3306/mysql start
Starting MySQL...
7)验证数据是否恢复成功
mysql> use test1;
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> select * from users;
+----+-------+----------+--------------+
| id | name | password | address |
+----+-------+----------+--------------+
| 1 | zhang | 1234 | NULL |
| 2 | wang | 4321 | Shijiazhuang |
| 3 | li | 5678 | Beijing |
+----+-------+----------+--------------+
3 rows in set (0.00 sec)
9 单库增量备份恢复过程
1)首先对单库进行全备
[root@Louis test1]# innobackupex --defaults-file=/mysqldata/3306/my.cnf --user=root --password=123456 --databases=test1 /backup/dk_data
2)对单库进行增量备份
[root@Louis dk_data]# innobackupex --defaults-file=/mysqldata/3306/my.cnf --user=root --password=123456 --databases=test1 --incremental --incremental-basedir=/backup/dk_data/2018-05-04_06-19-22 /backup/zl_data
[root@Louis dk_data]# cd /backup/zl_data/2018-05-04_06-24-03/
[root@Louis 2018-05-04_06-24-03]# ls
backup-my.cnf ibdata1.delta ibdata1.meta test1 xtrabackup_binary xtrabackup_binlog_info xtrabackup_checkpoints xtrabackup_logfile
注:--incremental 指备份类型为增量备份,做增量备份之前首先要做一次全量备份,
所以--incremental-basedir=/backup/dk_data/2014-05-30_23-26-22的目录就是--incremental-basedir=BASEDIR
/backup/zl_data就是--incremental-basedir=INCREMENTAL-DIR-1
INCREMENTAL-DIR-1 是指第一次的增量备份,INCREMENTAL-DIR-2 是指第二次的增量备份,以此类推。
3)关闭数据库
[root@Louis 2018-05-04_06-24-03]# mysqladmin -uroot -p123456 -S /mysqldata/3306/mysql.sock shutdown
4)恢复全备份日志文件(回滚未完成的日志)
[root@Louis 2018-05-04_06-19-22]# innobackupex --defaults-file=/mysqldata/3306/my.cnf --user=root --password=123456 --apply-log --redo-only /backup/dk_data/2018-05-04_06-19-22
5)恢复增量备份日志文件
[root@Louis 2018-05-04_06-19-22]# innobackupex --defaults-file=/mysqldata/3306/my.cnf --user=root --password=123456 --apply-log --redo-only /backup/dk_data/2018-05-04_06-19-22 --incremental-dir=/backup/zl_data/2018-05-04_06-24-03
6)恢复增量备份数据文件
[root@Louis 2018-05-04_06-19-22]# cp -ap /backup/dk_data/2018-05-04_06-19-22/test1 /mysqldata/3306/data/test1
[root@Louis 2018-05-04_06-19-22]# cd /mysqldata/3306/data/test1
[root@Louis test1]# ls
db.opt users.frm users.MYD users.MYI
7)授权
[root@Louis data]# chown -R mysql:mysql test1
8)重启数据库
[root@Louis test1]# /mysqldata/3306/mysql start
Starting MySQL...
9)验证数据是否恢复成功
mysql> use test1
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> select * from users;
+----+-------+----------+--------------+
| id | name | password | address |
+----+-------+----------+--------------+
| 1 | zhang | 1234 | NULL |
| 2 | wang | 4321 | Shijiazhuang |
| 3 | li | 5678 | Beijing |
+----+-------+----------+--------------+
3 rows in set (0.00 sec)
mysql>
10 压缩备份
创建备份目录
[root@Louis test1]# mkdir -p /backup/data/yasuo
1)
xbstream 压缩方法:
[root@Louis test1]# innobackupex --defaults-file=/mysqldata/3306/my.cnf --stream=xbstream --compress --user=root --password=123456 --databases="test1 test2" /backup/data/yasuo/ > /backup/data/yasuo/backup.xbstream
[root@Louis test1]# cd /backup/data/yasuo/
[root@Louis yasuo]# ls
backup.xbstream
xbstream 解压备份方法:
[root@Louis yasuo]# xbstream -x <backup.xbstream backup.xbstream -C /backup/data/yasuo
[root@Louis yasuo]# ls
backup-my.cnf backup.xbstream ibdata1.qp test1 test2 xtrabackup_binary xtrabackup_binlog_info xtrabackup_checkpoints xtrabackup_logfile
2)
tar 压缩方法:
[root@Louis yasuo]# innobackupex --defaults-file=/mysqldata/3306/my.cnf --user=root --password=123456 --databases="ceshi test3" --stream=tar /backup/data/ | gzip >/backup/data/test_ceshi.$(date +%Y%m%d-%H%M%S).tar.gz
[root@Louis data]# ls
test_ceshi.20180504-071646.tar.gz yasuo
Tar 解压备份方法:
[root@Louis data]# mkdir tar_backup
[root@Louis data]# tar -izxvf test_ceshi.20180504-071646.tar.gz -C /backup/data/tar_backup/
3)备份到远端的方法
11 xtrabackup 的参数选项及说明
--redo-only --apply-log 组:强制备份日志时只 redo ,跳过 rollback。这在做增量备份时非常必要。
--slave-info:备份从库, 加上--slave-info 备份目录下会多生成一个 xtrabackup_slave_info文件, 这里会保存主日志文件以及偏移, 文件内容类似于:CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0
--no-lock:参数用于指定备份时不锁定表
--defaults-file: 默认配置文件的路径
--apply-log: 对xtrabackup 的--prepare 参数的封装
--copy-back:做数据恢复时将备份数据文件拷贝到 MySQL 服务器的 datadir ;
--remote-host=HOSTNAME:通过 ssh 将备份数据存储到进程服务器上;
--stream=[tar]:备份文件输出格式, tar 时使用 tar4ibd ,
--tmpdir=DIRECTORY:当有指定--remote-host or --stream 时, 事务日志临时存储的目录, 默认采用 MySQL 配置文件中所指定的临时目录 tmpdir
--use-memory=#:该参数在 prepare 的时候使用,控制 prepare 时 innodb 实例使用的内存量
--throttle=IOS:同 xtrabackup 的--throttle 参数
--sleep= :是给 ibbackup 使用的,指定每备份 1M 数据,过程停止拷贝多少毫秒,也是为了在备份时尽量减小对正常业务的影响,具体可以查看 ibbackup
的手册 。
--compress[=LEVEL]:对备份数据迚行压缩,仅支持 ibbackup,xtrabackup 还没有实现。
--uncompress:解压备份的数据文件,支持 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 都会被备份;
--socket=SOCKET:指定 mysql.sock 所在位置,以便备份进程登录 mysql.