您的位置:首页 > 数据库 > MySQL

mysql备份之xtrabackup

2015-09-11 17:10 846 查看
Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。

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

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

2、 innobackupex是参考了InnoDB Hotbackup的innoback脚本修改而来的.innobackupex是一个perl脚本封装,封装了xtrabackup。主要是为了方便的 同时备份InnoDB和MyISAM引擎的表,但在处理myisam时需要加一个读锁。并且加入了一些使用的选项。如slave-info可以记录备份恢 复后,作为slave需要的一些信息,根据这些信息,可以很方便的利用备份来重做slave。

Xtrabackup的功能:

在线(热)备份整个库的InnoDB、 XtraDB表

在xtrabackup的上一次整库备份基础上做增量备份(innodb only)

以流的形式产生备份,可以直接保存到远程机器上(本机硬盘空间不足时很有用)

MySQL数据库本身提供的工具并不支持真正的增量备份,二进制日志恢复是point-in-time(时间点)的恢复而不是增量备份。

Xtrabackup工具支持对InnoDB存储引擎的增量备份,工作原理如下:

(1)首先完成一个完全备份,并记录下此时检查点的LSN(Log Sequence Number)。

(2)在进程增量备份时,比较表空间中每个页的LSN是否大于上次备份时的LSN,如果是,则备份该页,同时记录当前检查点的LSN。

首 先,在logfile中找到并记录最后一个checkpoint(“last checkpoint LSN”),然后开始从LSN的位置开始拷贝InnoDB的logfile到xtrabackup_logfile;接着,开始拷贝全部的数据文 件.ibd;在拷贝全部数据文件结束之后,才停止拷贝logfile。

因为logfile里面记录全部的数据修改情况,所以,即时在备份过程中数据文件被修改过了,恢复时仍然能够通过解析xtrabackup_logfile保持数据的一致。

官方文档:https://www.percona.com/doc/percona-xtrabackup/2.2/innobackupex/innobackupex_script.html

一.xtrabackup安装

[root@test ~]# cd /usr/local/src
[root@test src]# wget https://www.percona.com/downloads/XtraBackup/XtraBackup-2.2.9/binary/redhat/6/x86_64/Percona-XtraBackup-2.2.9-r5067-el6-x86_64-bundle.tar [root@test src]# mkdir xtrabackup
[root@test src]# tar -xvf Percona-XtraBackup-2.2.9-r5067-el6-x86_64-bundle.tar -C xtrabackup
[root@test src]# yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL
[root@test src]# rpm -ivh percona-xtrabackup-2.2.9-5067.el6.x86_64.rpm
warning: percona-xtrabackup-2.2.9-5067.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
Preparing...                ########################################### [100%]
1:percona-xtrabackup     ########################################### [100%]
[root@test src]# rpm -qa |grep  xtrabackup
percona-xtrabackup-2.2.9-5067.el6.x86_64
[root@test src]# rpm -ql percona-xtrabackup
/usr/bin/innobackupex
/usr/bin/xbcrypt
/usr/bin/xbstream
/usr/bin/xtrabackup
/usr/share/doc/percona-xtrabackup-2.2.9
/usr/share/doc/percona-xtrabackup-2.2.9/COPYING
/usr/share/man/man1/innobackupex.1.gz
/usr/share/man/man1/xbcrypt.1.gz
/usr/share/man/man1/xbstream.1.gz
/usr/share/man/man1/xtrabackup.1.gz
其中xtrabackup:是用于热备份innodb, xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构;

innobackupex:是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力。

若安装过程中报错:

Dependencies Resolved

===============================================================================================================================================================
Package                                   Arch                              Version                                     Repository                       Size
===============================================================================================================================================================
Installing:
perl-DBD-MySQL                            x86_64                            4.013-3.el6                                 base                            134 k
Installing for dependencies:
mysql-libs                                x86_64                            5.1.73-5.el6_6                              base                            1.2 M

Transaction Summary
===============================================================================================================================================================
Install       2 Package(s)

Total size: 1.4 M
Installed size: 4.4 M
Is this ok [y/N]: y
Downloading Packages:
Running rpm_check_debug
Running Transaction Test

Transaction Check Error:
file /usr/share/mysql/charsets/Index.xml from install of mysql-libs-5.1.73-5.el6_6.x86_64 conflicts with file from package MySQL-server-5.6.21-1.el6.x86_64
file /usr/share/mysql/charsets/armscii8.xml from install of mysql-libs-5.1.73-5.el6_6.x86_64 conflicts with file from package MySQL-server-5.6.21-1.el6.x86_64
file /usr/share/mysql/charsets/ascii.xml from install of mysql-libs-5.1.73-5.el6_6.x86_64 conflicts with file from package MySQL-server-5.6.21-1.el6.x86_64
file /usr/share/mysql/charsets/cp1250.xml from install of mysql-libs-5.1.73-5.el6_6.x86_64 conflicts with file from package MySQL-server-5.6.21-1.el6.x86_64
file /usr/share/mysql/charsets/cp1256.xml from install of mysql-libs-5.1.73-5.el6_6.x86_64 conflicts with file from package MySQL-server-5.6.21-1.el6.x86_64
file /usr/share/mysql/charsets/cp1257.xml from install of mysql-libs-5.1.73-5.el6_6.x86_64 conflicts with file from package MySQL-server-5.6.21-1.el6.x86_64
file /usr/share/mysql/charsets/cp850.xml from install of mysql-libs-5.1.73-5.el6_6.x86_64 conflicts with file from package MySQL-server-5.6.21-1.el6.x86_64
file /usr/share/mysql/charsets/cp852.xml from install of mysql-libs-5.1.73-5.el6_6.x86_64 conflicts with file from package MySQL-server-5.6.21-1.el6.x86_64
file /usr/share/mysql/charsets/cp866.xml from install of mysql-libs-5.1.73-5.el6_6.x86_64 conflicts with file from package MySQL-server-5.6.21-1.el6.x86_64
file /usr/share/mysql/charsets/dec8.xml from install of mysql-libs-5.1.73-5.el6_6.x86_64 conflicts with file from package MySQL-server-5.6.21-1.el6.x86_64
file /usr/share/mysql/charsets/geostd8.xml from install of mysql-libs-5.1.73-5.el6_6.x86_64 conflicts with file from package MySQL-server-5.6.21-1.el6.x86_64
file /usr/share/mysql/charsets/greek.xml from install of mysql-libs-5.1.73-5.el6_6.x86_64 conflicts with file from package MySQL-server-5.6.21-1.el6.x86_64
解决方法:

wget http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.5/MySQL-shared-compat-5.5.45-1.el6.x86_64.rpm rpm -ivh MySQL-shared-compat-5.5.45-1.el6.x86_64.rpm
yum install perl-DBD-MySQL


二.mysql备份权限
利用xtrabackup需要对mysql数据库和mysql相关目录具有相应的权限,由于我们是root用户操作,因此mysql数据目录我们暂且不用设置,但是为保证数据库安全,我们需要启用一个xtrabackup备份用户,其相关的最小权限如下:

An SQL example of creating a database user with the minimum privileges required to full backups would be:
mysql> CREATE USER 'bakuser'@'localhost' IDENTIFIED BY 'bakuser';
mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bakuser'@'localhost';
mysql> FLUSH PRIVILEGES;

三.mysql完全备份

1.备份

[root@test src]# innobackupex --defaults-file=/etc/my.cnf --user=bakuser --password=bakuser  /home/backup/
....省略....
innobackupex: Backup created in directory '/home/backup/2015-09-11_15-11-57'
innobackupex: MySQL binlog position: filename 'mysql-bin.000003', position 120
150911 15:05:53  innobackupex: Connection to database server closed
150911 15:05:53  innobackupex: completed OK!
由以上看出mysql已经完全备份到/home/backup/下2015-09-11_15-11-57目录,若我们不想自动生成时间,我们可以使用--no-stamp参数。

[root@rd-mysql-test1 backup]# ll 2015-09-11_15-11-57/
total 75864
-rw-r--r-- 1 root root      296 Sep 11 15:11 backup-my.cnf<span style="white-space:pre">	</span>备份命令用到的配置文件
drwx------ 2 root root     4096 Sep 11 15:12 city<span style="white-space:pre">		</span>
drwx------ 2 root root    45056 Sep 11 15:12 city1
-rw-r----- 1 root root 77594624 Sep 11 15:11 ibdata1
drwxr-xr-x 2 root root     4096 Sep 11 15:12 innodb
drwx------ 2 root root     4096 Sep 11 15:12 mysql
drwxr-xr-x 2 root root     4096 Sep 11 15:12 performance_schema
drwxr-xr-x 2 root root     4096 Sep 11 15:12 test
-rw-r--r-- 1 root root       21 Sep 11 15:12 xtrabackup_binlog_info<span style="white-space:pre">	</span>mysql服务器当前正在使用的二进制文件及至备份这一刻为止二进制日志的位置
-rw-r----- 1 root root       95 Sep 11 15:12 xtrabackup_checkpoints<span style="white-space:pre">	</span>备份类型(如完全或增量),备份状态(如是否已经为prepare状态)和LSN(日志序列号)。每个InnoDB页都会包含一个日志序列号,即LSN,是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的。
-rw-r--r-- 1 root root      570 Sep 11 15:12 xtrabackup_info
-rw-r----- 1 root root     2560 Sep 11 15:12 xtrabackup_logfile
2.还原

模拟数据库损坏故障:关掉数据库将/data/mysql目录删掉,并进行还原。

(1)prepare阶段

一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。

innobackupex的--apply-log参数可以实现上述功能。

##模拟数据库故障
[root@test data]# mysqladmin shutdown
[root@test data]# cd /data
[root@test data]# rm -rf mysql
##prepare阶段
[root@test data]# mkdir mysql
[root@test data]# innobackupex --apply-log /home/backup/2015-09-11_15-11-57/
....省略....
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: FTS optimize thread exiting.
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 7253509278
150911 15:30:37  innobackupex: completed OK!


除此之外,我们还可以使用--use-memory参数来加快速度,当然这需要我们的服务器有足够的内存空间。此参数的默认空间为100M。

(2)还原阶段
innobackupex命令的--copy-back选项用于执行恢复操作,其通过复制所有数据相关的文件至mysql服务器DATADIR目录中来执行恢复过程。innobackupex通过/etc/my.cnf或指定的my.cnf来获取DATADIR目录的相关信息(如果没有my.cnf则会提示找不到datadir目录,因此在还原前需要确保my.cnf已经提前建好)。

[root@test data]# innobackupex --copy-back /home/backup/2015-09-11_15-11-57/
....省略....
innobackupex: Starting to copy InnoDB log files
innobackupex: in '/home/backup/2015-09-11_15-11-57'
innobackupex: back to original InnoDB log directory '/data/mysql/innodb'
innobackupex: Copying '/home/backup/2015-09-11_15-11-57/ib_logfile2' to '/data/mysql/innodb/ib_logfile2'
innobackupex: Copying '/home/backup/2015-09-11_15-11-57/ib_logfile0' to '/data/mysql/innodb/ib_logfile0'
innobackupex: Copying '/home/backup/2015-09-11_15-11-57/ib_logfile1' to '/data/mysql/innodb/ib_logfile1'
innobackupex: Finished copying back files.

150911 15:42:39  innobackupex: completed OK!
[root@test data]# chown -R mysql.mysql mysql
[root@test data]# mysqld_safe --datadir=/data/mysql &
注意:1./data/mysql目录在正式还原之前一定要建好,另外还原完毕后需要对mysql目录设置mysql权限。

2.在完全备份后,我们还可以通过查看xtrabackup_binlog_info得到二进制的起始位置,然后通过mysqlbinlog --start-position=XXX /data/mysql/mysql-bin.000003 > bak.sql进行增量备份

四.mysql增量备份

原理:xtrabackup还支持进行增量备份:每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB表可以进行增量备份的基础,即innobackupex通过备份上次完全备份之后发生改变的页面来实现。

基本语法

innobackupex --incremental /home/backup --incremental-dir=BASEDIR

其中:BASEDIR指的是完全备份所在的目录,因此我们应该先做一个完全备份,此命令执行结束后,innobackupex命令会在/home/backup目录中创建一个新的以时间命名的目录以存放所有的增量备份数据。另外,在执行过增量备份之后再一次进行增量备份时,其--incremental-basedir应该指向上一次的增量备份所在的目录。

1.增量备份

(1)完全备份

innobackupex --defaults-conf=/etc/my.cnf --user=bakuser --password=bakuser /home/backup/

(2)第一次数据修改,在city库增加sbtest1表

mysql>use city;
mysql> create table sbtest1(id int not null primary key,name varchar(20) not null)engine=Innodb;
Query OK, 0 rows affected (0.02 sec)

mysql> insert into sbtest1 values(1,test);
ERROR 1054 (42S22): Unknown column 'test' in 'field list'
mysql> insert into sbtest1 values(3,'test3');
Query OK, 1 row affected (0.00 sec)
(3)第一次增量备份

innobackupex --defaults-conf=/etc/my.cnf --user=bakuser --password=bakuser --incremental /home/backup/ --incremental-dir=/home/backup/2015-09-11_16-23-37

(4)第二次数据修改

mysql> insert into sbtest1 values(4,'test4');
Query OK, 1 row affected (0.00 sec)
(5)第二次增量备份

innobackupex --defaults-conf=/etc/my.cnf --user=bakuser --password=bakuser --incremental /home/backup/ --incremental-dir=/home/backup/2015-09-11_16-25-05

2.还原

增量备份的还原比完全备份的还原稍微麻烦一些,下面我们来具体实验一下。

(1)prepare阶段

准备”(prepare)增量备份与整理完全备份有着一些不同,尤其要注意的是:

(a)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”。“重放”之后,所有的备份数据将合并到完全备份上。

(b)基于所有的备份将未提交的事务进行“回滚”。

语法如下:

#执行完全备份的redo
[root@test data]# innobackupex --apply-log --redo-only BASEDIR
#执行第一个增量的redo
[root@test data]# innobackupex --apply-log --redo-only BASEDIR --inremental-dir=incremental-dir-1
#最后一个增量无需redo
[root@test data]# innobackupex --apply-log BASEDIR --inremental-dir=incremental-dir-2
具体如下:

innobackupex --apply-log --redo-only /home/backup/2015-09-11_16-23-37/
innobackupex --apply-log --redo-only /home/backup/2015-09-11_16-23-37/ --incremental-dir=/home/backup/2015-09-11_16-25-05/
innobackupex --apply-log  /home/backup/2015-09-11_16-23-37/ --incremental-dir=/home/backup/2015-09-11_16-28-00/


注:最后一个增量无需--redo-only

当我们所有的增量都合并到完全备份后,我们需要对完全备份进行一次回滚

innobackupex --aply-log /home/backup/2015-09-11_16-23-37/

(2)还原阶段
innobackupex --copy-back /home/backup/2015-09-11_16-23-37/

注意:以上整个还原过程中,一旦哪个环节出问题,我们需要重新来过,此时的应用过--apply-log的备份目录将无效,因此我们需要将原始的备份仍然保留。

五.部分备份(单独的库或表)

Xtrabackup也可以实现部分备份,即只备份某个或某些指定的数据库或某数据库中的某个或某些表。但要使用此功能,必须启用innodb_file_per_table选项,即每张表保存为一个独立的文件。同时,其也不支持--stream选项,即不支持将数据通过管道传输给其它程序进行处理。此外,还原部分备份跟还原全部数据的备份也有所不同,即你不能通过简单地将prepared的部分备份使用--copy-back选项直接复制回数据目录,而是要通过导入表的方向来实现还原。当然,有些情况下,部分备份也可以直接通过--copy-back进行还原,但这种方式还原而来的数据多数会产生数据不一致的问题,因此,无论如何不推荐使用这种方式。

1.备份

备份city数据库

innobackupex --defaults-conf=/etc/my.cnf --user=bakuser --password=bakuser --databases=city /home/backup/

除了--databases方式,还可以使用--include,--table-file的方式,其中--databases和--table-file不支持通配符。

2.还原

模拟故障:关闭数据库后,删除mysql的city数据库,rm -rf /data/mysql/city

(1)prepare阶段

innobackupex --apply-log --export /home/backup/2015-09-11_16-24-39/

innobackupex会调用xtrabackup命令从数据字典中移除缺失的表,因此,会显示出许多关于“表不存在”类的警告信息。同时,也会显示出为备份文件中存在的表创建.exp文件的相关信息。

(2)还原阶段

还原部分备份的过程跟导入表的过程相同。当然,也可以通过直接复制prepared状态的备份直接至数据目录中实现还原,不过此时要求数据目录处于一致状态。

\cp -rf /home/backup/2015-09-11_16-24-39/ /data/mysql

chown -R /data/mysql

mysqld_save --datadir=/data/mysql &
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: