MySQL管理之使用XtraBackup进行热备

XtraBackup简介

XtraBackup取代innodbbackup的工具并且XtraBackup能够完全兼容innodb存储引擎,并对innodb存储引擎实现完全的物理层的热备。

官方站点:http://www.percona.com/

percona本身对mysql做了修改,并拥有更高的性能,其为percona server

并且percona server对mysql本身的修改还提供了同步复制集群功能,所以percona在圈子的影响力甚至超过了mysql官方。

对于MyISAM表只能是温备,而且也不支持增量备份

XtraBackup更多高级特性通常只能在innodb存储引擎上实现,而且高级特性还都依赖于mysql数据库对innodb引擎实现了单独表空间,否则没办法实现单表或单库导出

 

使用每表单个表空间

在使用xtrabackup之前,我们需要查看我们当前mysql是否是使用每表单个表空间,如果不是则必须将其修改为每表单独表空间

mysql> show global variables like '%innodb_file_p%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
|
innodb_file_per_table | OFF |
+-----------------------+-------+
1 row in set (0.00 sec)

这里是关闭状态,由此我们要启动这个功能,将来一旦要用到xtrabackup或各种高级功能的话建议刚安装mysql的时候直接将默认配置去写进配置文件,中途再更改的话会非常麻烦,好在我们是测试环境,需能将数据导出更改配置再进行导入

[root@test2 ~]#mysqldump -uroot --lock-all-tables --all-databases --master-data=2 --events> ./1.sql

关闭数据库

[root@test2 ~]#/etc/init.d/mysqld stop
Shutting down MySQL.. SUCCESS!

编辑配置文件加入以下参数

[root@test2 ~]# vim/etc/my.cnf

innodb_file_per_table= 1

而后删除数据文件并重新初始化

[root@test2 data]#pwd
/mydata/data

删除所有数据文件

[root@test2 data]# rm -fr *

初始化mysql

[root@test mysql]#pwd
/usr/local/mysql
[root@test mysql]# scripts/mysql_install_db --user=mysql--datadir=/mydata/data/ --basedir=/usr/local/mysql/

[root@test mysql]#/etc/init.d/mysqld start

再次查看是否是每表单独表空间

mysql> showglobal variables like '%innodb_file_per%';

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

|Variable_name | Value |

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

|innodb_file_per_table | ON |

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

1 row in set (0.00sec)

恢复数据

mysql> source~/1.sql

[root@test2 data]#ll wpdb/

total 220

-rw-r--r--. 1 mysqlmysql 61 Apr 6 11:05 db.opt

-rw-r--r--.1 mysql mysql 8646 Apr 6 11:05 students.frm

-rw-r--r--.1 mysql mysql 98304 Apr 6 11:05students.ibd

-rw-r--r--. 1 mysql mysql 8556 Apr 6 11:05 tb4.frm

-rw-r--r--. 1 mysql mysql 98304 Apr 6 11:05 tb4.ibd

如上所示每个表都有单独对应的表空间了

 

安装percona-xtrabackup

解决依赖关系

[root@test ~]# yum-y install libaio perl-Time-HiRes perl-DBD-MySQL perl-IO-Socket-SSL

首先安装percona-xtrabackup

[root@test2 tools]#rpm -ivh percona-xtrabackup-2.1.4-656.rhel6.x86_64.rpm

warning:percona-xtrabackup-2.1.4-656.rhel6.x86_64.rpm: Header V4 DSA/SHA1 Signature,key ID cd2efd2a: NOKEY
Preparing... ########################################### [100%]
1:percona-xtrabackup ###########################################[100%]

查看软件相应属性

[root@test tools]#rpm -qlpercona-xtrabackup
/usr/bin/innobackupex #
统一命令接口
/usr/bin/innobackupex-1.5.1
/usr/bin/xbcrypt
/usr/bin/xbstream #支持流式备份
/usr/bin/xtrabackup
/usr/bin/xtrabackup_55 #分别应用于mysql5.5 和5.6的工具,会根据程序自动判断mysql当前版本而后应用与之匹配的工具来进行备份的
/usr/bin/xtrabackup_56

/usr/share/doc/percona-xtrabackup-2.1.4
/usr/share/doc/percona-xtrabackup-2.1.4/COPYING

 

 

使用xtrabackup实现完全备份

xtracbackup备份innodb表的时候可以实现热备,但是备份方式比较简单,首先表结构备份的文件是直接复制的,数据文件是通过读取其相应的数据块LSN号(日志序列号)而后再去判断是否需要备份,其完全备份就是从序列号0到目前为止最新的序列号进行备份

而后增量备份的时候会从上一次备份完成或增量备份以来的序列号到当前最新的序列号进行备份的,所以它是通过来扫描每个数据块的日志序列号判定其是否需要备份以及如何进行备份的

完全备份毋庸置疑,每个块都需要备份

增量备份一定是从上一次备份的序列号向后直到更新的序列号的数据块

所以是在物理级别直接备份数据块的

 

在实现备份的时候会在相关目录下生成以下几个文件:

xtrabackup_checkpoints 检查点文件

·备份类型(如完全或增量)

·备份状态(如是否已经为prepared状态,简单来讲,所备份的数据,不能立即用来恢复,还需要对其做一次将所有的事物日志中的事物已提交的事物进行同步至数据文件,将未提交的事物进行回滚,这个过程被称为预处理过程,因此备份处理的数据如果没有做好预处理的话是不能拿来恢复的)

 

LSN(日志序列号)范围信息,比如:

·完全备份LSN号范围 0-16000

·增量备份LSN号范围 16001-17000

·第二次备份LSN号范围17001-18000

·通过LSN号码判定当前是完全还是增量,并且增量到哪种程度(从上一次到目前变化的数据)

 

对xtrabackup来讲,当我们使用完全备份+增量备份之后,如果我们期望恢复的时候期望使用完全+增量进行恢复必须知道以下几点:

1、事务日志中有些日志被提交还有些日志未被提交,而未提交的事物需要回滚;

2、一但如果在第一次增量中有一些事物在完全备份的时候没有被提交单是在做第一次增量备份的时候被提交了,在完全备份中回滚中去那么这么次还原就没有任何意义,所以使用xtra备份数据,并跟我们之前使用mysqldump恢复的流程一样,而是先使完全备份而后将完全备份做好预处理,只不过执行预处理的时候只对完全备份进行一半的处理;

3、只将已经提交的事物同步至数据文件,而未提交的事物不回滚

4、所以只要有增量未提交的事物是不能回滚的,而后在已经提交的事物同步至于数据文件以后开始向完全备份中应用第一个增量备份(假如有多个增量备份的数据),将增量备份合并至完全备份中去,所以第一个增量中有些事物已经提交了但是完全备份数据中则没有被提交过,所以对其进行合并,合并完成则将第二个增量进行合并,以此类推。

5、合并完数据之后LNS号已经是从0至当前最新的LNS号码;完后则使用二进制再对其进行恢复。

 

因此当我们有增量备份的时候,一定不能回滚未提交事物,否则增量将无法使用,如果不再回滚未提交事物,那么最后一个增量也有可能存在未提交事物,那么这时只能启动mysql 让其对数据库进行修复操作,所以最后一个阶段是依赖于mysql自身存储引擎

 

使用xtrabackup实现完全备份的话过程非常简单,但需要注意的是必须只有执行权限的用户才能够去备份

如果要使用一个最小权限的用户进行备份,则可基于如下命令创建类用户:

mysql> CREATEUSER ’bkpuser’@’localhost’ IDENTIFIED BY ’s3cret’;
mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM ’bkpuser’;
mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO ’bkpuser’@’localhost’; #授权,这三个权限是保证备份的最小权限

mysql> FLUSHPRIVILEGES;

这里由于是测试环境,我们就使用root进行备份/还原

XtraBackup 的详细介绍:请点这里
XtraBackup 的下载地址:请点这里

推荐阅读:

相关推荐