基于Xtrabackup的mysql物理备份详解


一、什么是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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南風_入弦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值