xtrabackup应用总结

Xtrabackup介绍

xtrbackup简介

       Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。

Xtrabackup有两个主要的工具:xtrabackup、innobackupex

(1)xtrabackup只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表

(2)innobackupex-1.5.1则封装了xtrabackup,是一个脚本封装,所以能同时备份处理innodb和myisam,但在处理myisam时需要加一个读锁

(3)使用帮助:http://www.percona.com/docs/wiki/percona-xtrabackup:start

官网:http://www.percona.com/

xtrbackup优势

(1)备份过程快速、可靠;

(2)备份过程不会打断正在执行的事务;

(3)能够基于压缩等功能节约磁盘空间和流量;

(4)自动实现备份检验;

(5)还原速度快

(6)支持增量备份MySQL

(7)比较容易的创建主从同步

(8)备份MySQL时不会增大服务器负载

xtrabackup备份InnoDB原理

XtraBackup基于InnoDB的crash-recovery功能进行备份。

crash-recovery是这样的:

  InnoDB内部会维护一个redo日志文件,我们也可以叫做事务日志文件,事务日志文件会存储每一个InnoDB表数据的更改记录。当 InnoDB启动时,InnoDB会检查数据文件和事务日志,并执行两个步骤:1.应用已经提交的事务日志到数据文件;2.将事务日志里还未提交的更改回滚。

  xtrabackup在启动时会记住 log sequence number(LSN,每条事务记录的唯一编号),并且复制所有的数据文件,复制过程需要一段时间,所以这段时间数据库的更改就会使备份文件和实际数据不一致。xtrabackup解决此问题的方式是,xtrabackup会开启一个后台进程,用于监视事务日志,并将备份期间事务日志里的更改记录下来。

  以上是xtrabackup备份的过程,恢复的第一步是准备(prepare)过程。在此过程,xtrabackup根据所记录的事务日志里的变化,模仿InnoDB启动时的动作对数据进行‘崩溃恢复’,执行完这个过程后,数据就可以用于还原数据库了。

  但是以上机制只能备份和恢复Innodb引擎的表,对于myisam表,precona 将xtrabackup通过perl封装成innobackupex脚本,此脚本提供了对myisam表的备份支持。innobackupex脚本会在 xtrabackup执行完InnoDB表的备份后,执行flush tables with read lock 来阻止对数据库的写入,并对myisam相关文件进行备份,最后释放锁。

Xtrabackup部署

版本选择

Xtrabackup 2.1.x版本的支持MySQL 5.5 and 5.6 servers

Xtrabackup 2.0.x版本的支持MySQL 5.0, 5.1, 5.5 and 5.6 servers

系统环境

[root@mysql]# cat /etc/issue
CentOS release 6.6 (Final)
Kernel \r on an \m
[root@mysql]# uname -r
2.6.32-504.el6.x86_64
[root@mysql]# uname -m
x86_64

安装部署

[root@mysql]# rpm -ivh http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
[root@mysql]# yum install percona-xtrabackup -y
[root@mysql]# rpm -qa mysql-server
mysql-server-5.1.73-5.el6_6.i686
[root@mads ~]# rpm -qa *backup*  
percona-xtrabackup-20-2.0.8-587.rhel6.i686

Xtrabackup应用实战(备份还原)

全量备份

1)创建当天备份数据保存的路径
mkdir -p /backup/mysql/full/2015-05-07
2)全量备份服务器的数据(不压缩) innobackupex --user=root --password=strong --host=localhost --port=3306 --defaults-file=/etc/my.cnf /backup/mysql/full/2015-05-07/ [root@mysql ]# ls -al total 10280 drwxr-xr-x 4 root root 4096 Jul 13 06:32 . drwxr-xr-x 3 root root 4096 Jul 13 06:31 .. -rw-r--r-- 1 root root 260 Jul 13 06:31 backup-my.cnf -rw-r----- 1 root root 10485760 Jul 13 06:31 ibdata1 drwxr-xr-x 2 root root 4096 Jul 13 06:32 mysql drwxr-xr-x 2 root root 4096 Jul 13 06:32 test -rw-r--r-- 1 root root 10 Jul 13 06:32 xtrabackup_binary -rw-r--r-- 1 root root 4 Jul 13 06:32 xtrabackup_binlog_info -rw-r----- 1 root root 73 Jul 13 06:32 xtrabackup_checkpoints -rw-r----- 1 root root 2560 Jul 13 06:32 xtrabackup_logfile 注: backup-my.cnf: 备份命令用到的配置选项信息 xtrabackup_binlog_info: 备份时所用的二进制日志信息(记录了在备份时,正在用的二进制日志文件及pos值,这个在数据恢复时用) xtrabackup_checkpoints: 备份的信息(备份类型(完全或增量)、备份状态(是否已经为prepared状态)、LSN(日志序列号)范围信息),可以查看此备份是全备份还是增量备份 xtrabackup_info: xtrabackup相关的信息

全量备份恢复

1) 停止mysql
[root@mysqll]# service mysql stop

2) 模拟数据丢失
[root@lmysql]# mv /var/lib/mysql /var/lib/mysql_bak

3) 用已有的全量备份文件进行数据恢复
通过--apply-log指明将日志应用到数据文件上
[root@localhost full]# /usr/bin/innobackupex --user=root --password=123456789 --defaults-file=/etc/my.cnf  --apply-log /backup/mysql/full/2015-05-07/2015-05-07_18-14-25/
[root@localhost full]# chown -R mysql:mysql /var/lib/mysql  # 修改所有者,所属组
[root@localhost full]# service mysql start # 启动mysql
[root@localhost full]# mysql -u root -p  # 登录查看数据是否恢复
Enter password: 
MariaDB [(none)]> show databases;  # 发现数据已经恢复
   +------------------------+
    |   Database                   |
    +------------------------+
    | information_schema   |
    |mysql                           |
    | performance_schema |
    | test_db                        |
    +------------------------+

增量备份

1)开启二进制日志
[root@localhost ~]# vi /etc/my.cnf
[mysqld]
datadir="/var/lib/mysql"
log-bin=/data/mysql/log/mysql-bin
[root@localhost ~]#  service mysql restart
2)增量备份是建立在全量备份的基础上的所以先确保有一次全量备份,全量备份前面已经介绍

3) 我们往数据库中添加数据,进行第一次增量备份
MariaDB [test_db]> insert into test_table1 values(6,'xiaoming');
Query OK, 1 row affected (0.00 sec)

MariaDB [test_db]> select * from test_table1;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    2 | lisi     |
|    3 | wangwu   |
|    4 | zhaoliu  |
|    5 | guqi     |
|    6 | xiaoming |
+------+----------+
6 rows in set (0.00 sec)
[root@localhost ~]# mkdir -p /backup/mysql/increment/2015-05-07 # 创建增量备份保存的路径

4) 进行第一次增量备份
[root@localhost ~]# /usr/bin/innobackupex --user=root --password=123456789 --defaults-file=/etc/my.cnf  --incremental-force-scan --incremental /backup/mysql/increment/2015-05-07 --incremental-basedir=/backup/mysql/full/2015-05-07/2015-05-07_18-14-25/ 

# 第一次增量备份 (如果是mariadb不添加--incremental-force-scan参数可能会因为不支持FLUSH CHANGED_PAGE_BITMAPS而报错导致增量备份失败)
第一次增量备份生成的文件夹为/backup/mysql/increment/2015-05-07/2015-05-07_18-41-41/

5) 再次往数据表中插入内容
MariaDB [test_db]> insert into test_table1 values(7,'xiaohong');
Query OK, 1 row affected (0.05 sec)

6)进行第二次增量备份
[root@localhost ~]# /usr/bin/innobackupex --user=root --password=123456789 --defaults-file=/etc/my.cnf  --incremental-force-scan --incremental /backup/mysql/increment/2015-05-07 --incremental-basedir=/backup/mysql/increment/2015-05-07/2015-05-07_18-41-41/
第二次增量备份生成的文件夹为/backup/mysql/increment/2015-05-07/2015-05-07_18-48-32/

7)查看最后一次增量备份时所对应的二进制日志及位置
[root@localhost ~]# cat /backup/mysql/increment/2015-05-07/2015-05-07_18-48-32/xtrabackup_binlog_info 
mysql-bin.000001    833    0-1-3
MariaDB [(none)]> show master status
    -> ;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      833 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)  # 可以看到如果没有在增量备份后再对数据库进行增删改操作。则从增量备份中得出的信息和从二进制日志中看到的是一样的。

 

增量还原

恢复增量备份
增量备份的还原操作跟完整的还原有点不一样,首先必须使用--apply-log --redo-only对完整备份的目录及所有增量备份目录进行操作,然后就可以像还原完整备份时的操作了。(apply increment log to full data)
1 模拟数据丢失
[root@localhost ~]# service mysql stop
[root@localhost ~]# rm -rf /var/lib/mysql
[root@localhost ~]# mkdir /var/lib/mysql

2 通过--apply-log --redo-only指明将日志应用到数据文件上
[root@localhost ~]# /usr/bin/innobackupex --user=root --password=123456789 --defaults-file=/etc/my.cnf  --apply-log --redo-only /backup/mysql/full/2015-05-07/2015-05-07_18-14-25/

3 把第一次增量备份的数据应用到全量备份上
[root@localhost ~]# /usr/bin/innobackupex --user=root --password=123456789 --defaults-file=/etc/my.cnf --apply-log --redo-only /backup/mysql/full/2015-05-07/2015-05-07_18-14-25/  --incremental-dir=/backup/mysql/increment/2015-05-07/2015-05-07_18-41-41/

4 把第二次增量备份的数据应用到全量备份上
[root@localhost ~]# /usr/bin/innobackupex --user=root --password=123456789 --defaults-file=/etc/my.cnf --apply-log --redo-only /backup/mysql/full/2015-05-07/2015-05-07_18-14-25/  --incremental-dir=/backup/mysql/increment/2015-05-07/2015-05-07_18-48-32/

5 恢复数据(这里和全量备份的恢复相同了)
[root@localhost ~]# /usr/bin/innobackupex --user=root --password=123456789 --defaults-file=/etc/my.cnf  --copy-back /backup/mysql/full/2015-05-07/2015-05-07_18-14-25/

6 更改权限,启动服务,登录mysql,查看数据是否恢复
[root@localhost ~]# chown -R mysql:mysql /var/lib/mysql
[root@localhost ~]# service mysql start
MariaDB [test_db]> select * from test_table1;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    2 | lisi     |
|    3 | wangwu   |
|    4 | zhaoliu  |
|    5 | guqi     |
|    6 | xiaoming |
|    7 | xiaohong |
+------+----------+
7 rows in set (0.00 sec)  # 数据已经恢复

补充

增量备份常用参数说明

--redo-only            # 将一个增量备份与全备份进行合并,形成一个新的全备份(之后用这个新的全备份进行数据的恢复)
--incremental              # 指定进行增量备份
--incremental-basedir      # 进行增量备份时,用来指定上一次的备份(全备份或上一次的增量备份)
--incremental-dir             # 数据恢复时,用来指定上一次的备份(全备份或上一次的增量备份)

--user=                      # 指定数据库备份用户
--password=              # 指定数据库备份用户密码
--port=                      # 指定数据库端口
--host=                      # 指定备份主机
--socket=                   # 指定socket文件路径
--databases=              # 备份指定数据库,多个空格隔开,如--databases="dbname1 dbname2",不加备份所有库
--defaults-file=           # 指定my.cnf配置文件
--apply-log                 # 日志回滚
--incremental=                      # 增量备份,后跟增量备份路径
--incremental-basedir=         # 增量备份,指上次增量备份路径
--redo-only                            # 合并全备和增量备份数据文件
--copy-back                           # 将备份数据复制到数据库,数据库目录要为空
--no-timestamp                     # 生成备份文件不以时间戳为目录名
--stream=                               # 指定流的格式做备份,--stream=tar,将备份文件归档
--remote-host=user@ip DST_DIR         # 备份到远程主机

 待完善内容

  • 整理完善备份还原案例
  • 全备、增量备份及还原脚本的编写
  • 备份数据校验及检测机制
  • 完善的流程说明文档

 

posted @ 2016-07-23 21:44  每天进步一点点!!!  阅读(256)  评论(0编辑  收藏  举报