Xtrabackup简介
Percona XtraBackup是开源免费的MySQL数据库热备份软件,它能对InnoDB和XtraDB存储引擎的数据库非阻塞地备份(对于MyISAM的备份一样须要加表锁)。XtraBackup支持全部的Percona Server、MySQL、MariaDB和Drizzle。html
XtraBackup优点mysql
一、无需中止数据库进行InnoDB热备正则表达式 二、增量备份MySQLsql 三、流压缩到传输到其它服务器数据库 四、能比较容易地建立主从同步服务器 五、备份MySQL时不会增大服务器负载app |
Xtrabackup安装ssh
CentOS6.5_X86-64bit下的安装方法:ide
首先咱们须要到官网去得到软件包,我这里使用的是rpm格式的:
percona-xtrabackup-2.1.8-733.rhel6.x86_64.rpm
http://www.percona.com/downloads/XtraBackup/LATEST/RPM/rhel6/x86_64/
percona-toolkit-2.2.4-1.noarch.rpm工具
http://www.percona.com/downloads/percona-toolkit/2.0.4/
由于这个套件工具里面包含了几个工具,这些工具是用perl脚本编写的;在安装是须要依赖于几个perl的软件包,在咱们的系统CD里面就已经有了,因此我这里就搭建了一个本地yum源来安装了
[root@Master ~]# yum install \ percona-xtrabackup-2.1.8-733.rhel6.x86_64.rpm \ percona-toolkit-2.2.4-1.noarch.rpm |
Xtrabackup工具介绍
安装XtraBackup后,其实会有几个工具:
[root@Master ~]# rpm -ql percona-xtrabackup /usr/bin/innobackupex /usr/bin/innobackupex-1.5.1 /usr/bin/xbcrypt /usr/bin/xbstream /usr/bin/xtrabackup /usr/bin/xtrabackup_55 /usr/bin/xtrabackup_56 /usr/share/doc/percona-xtrabackup-2.1.8 /usr/share/doc/percona-xtrabackup-2.1.8/COPYING [root@Master ~]# 每一个工具介绍以下: innobackupex: 这个是实际上是下面三个工具的一个perl脚本封装,能够备份MyISAM, InnoDB, XtraDB表。 xtrabackup: 一个由C编译而来的二进制文件,只能备份InnoDB和XtraDB数据。 xbcrypt: 用来加密或解密备份的数据。 xbstream: 用来解压或压缩xbstream格式的压缩文件。 建议使用perl封装的innobackupex来做数据库备份,由于比较容易使用。因此下面只介绍innobackupex的使用。其它的使用参考: http://www.percona.com/doc/percona-xtrabackup/2.1/manual.html |
Xtrabackup备份的实现
1.准备工做:
(1)实现若是要使用一个最小权限的用户进行备份,则可基于以下命令建立此类用户:
MariaDB [(none)]> CREATE USER 'larry'@'localhost' IDENTIFIED BY 'QAZWSX123'; MariaDB [(none)]> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'larry'@'localhost'; MariaDB [(none)]> GRANT RELOAD,LOCK TABLES, REPLICATION CLIENT ON *.* TO 'larry'@'localhost'; MariaDB [(none)]> FLUSH PRIVILEGES; |
(2)建立备份数据存放目录:
[root@Master ~]# mkdir /backups |
2.一个完整备份的实现
(1)备份操做:(使用备份用户备份我当前系统上的全部库)
准备一个测试数据库: MariaDB [(none)]> SET sql_log_bin=0; //导入过程当中无需记录到二进制日志中 MariaDB [(none)]> source /root/hellodb.sql MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | hellodb | | information_schema | | mysql | | performance_schema | | test | +--------------------+ MariaDB [(none)]> SET sql_log_bin=1; //导入完成开启二进制日志 MariaDB [hellodb]> USE hellodb; Database changed MariaDB [hellodb]> CREATE TABLE tb1 (ID INT); MariaDB [hellodb]> SHOW TABLES; +-------------------+ | Tables_in_hellodb | +-------------------+ | classes | | coc | | courses | | scores | | students | | tb1 | | teachers | | toc | +-------------------+ MariaDB [hellodb]> 进行一次完整备份: [root@Master ~]# innobackupex --user=larry --password=QAZWSX123 /backups .......... .......... innobackupex: Backup created in directory '/backups/2014-04-01_12-41-31' innobackupex: MySQL binlog position: filename 'maria-bin.000001', position 441 140401 12:02:20 innobackupex: Connection to database server closed 140401 12:02:20 innobackupex: completed OK! 这里我是用的是备份用户,命令执行后屏幕有大量的输出信息,这里只是截取了后面几段重要的信息: 1.它将备份数据文件存放到了我新建的备份数据存放目录,而且它保存至了一个以时间命令的目录中。 2.binlogs文件的时间点,备份时它正处于那个二进制日志文件的哪一个点上 3.完成备份当即断开与databases server的链接 4.通知备份完成 在备份目录中也有几个文件值得关注: 其中: (1)xtrabackup_checkpoints —— 备份类型(如彻底或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息;TARE 每一个InnoDB页(一般为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每一个页面相关的LSN可以代表此页面最近是如何发生改变的。 (2)xtrabackup_binlog_info —— mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置。 (3)xtrabackup_binlog_pos_innodb —— 二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前position。 (4)xtrabackup_binary —— 备份中用到的xtrabackup的可执行文件; (5)backup-my.cnf —— 备份命令用到的配置选项信息; 在使用innobackupex进行备份时,还可使用--no-timestamp选项来阻止命令自动建立一个以时间命名的目录;如此一来,innobackupex命令将会建立一个BACKUP-DIR目录来存储备份数据。 |
3.模拟数据误删除并准备一个彻底备份:
[root@Master ~]# rm -rf /mydata/data/* 通常状况下,在备份完成后,数据尚且不能用于恢复操做,由于备份的数据中可能会包含还没有提交的事务或已经提交但还没有同步至数据文件中的事务。所以,此时数据文件仍处理不一致状态。“准备”的主要做用正是经过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。 innobakupex命令的--apply-log选项可用于实现上述功能。以下面的命令: [root@Master ~]# innobackupex --user=larry --password=QAZWSX123 --apply-log /backups/2014-04-01_12-41-31/ ........ ........ ........ xtrabackup: starting shutdown with innodb_fast_shutdown = 1 InnoDB: FTS optimize thread exiting. InnoDB: Starting shutdown... InnoDB: Shutdown completed; log sequence number 2071686 140401 12:47:58 innobackupex: completed OK! 若是执行正确,其最后输出的几行信息一般如上: 在实现“准备”的过程当中,innobackupex一般还可使用--use-memory选项来指定其可使用的内存的大小,默认一般为100M。若是有足够的内存可用,能够多划分一些内存给prepare的过程,以提升其完成速度。 切记,不能再刚整理(准备)完成就用来恢复,何时须要恢复就何时整理! |
3.从一个彻底备份中恢复数据
注意:恢复不用启动MySQL innobackupex命令的--copy-back选项用于执行恢复操做,其经过复制全部数据相关的文件至mysql服务器DATADIR目录中来执行恢复过程。innobackupex经过backup-my.cnf来获取DATADIR目录的相关信息。 [root@Master ~]# innobackupex --copy-back --user=larry --password=QAZWSX123 /backups/2014-04-01_12-41-31/ ........ ........ ........ 140401 12:56:00 innobackupex: completed OK! 若是执行正确,其输出信息的最后几行一般如上: [root@Master ~]# ls /mydata/data/ //数据文件已经恢复过来 hellodb ib_logfile0 mysql test ibdata1 ib_logfile1 performance_schema xtrabackup_binlog_pos_innodb [root@Master ~]# 可是这些恢复回来的数据文件属主和属组都是root,因此须要修改成mysql. [root@Master ~]# chown -R mysql:mysql /mydata/data/ [root@Master data]# service mysqld start Starting MySQL [ OK ] [root@Master data]# |
4.验证完整备份恢复结果:
MariaDB [(none)]> use hellodb; MariaDB [hellodb]> SHOW TABLES; +-------------------+ | Tables_in_hellodb | +-------------------+ | classes | | coc | | courses | | scores | | students | | tb1 | | teachers | | toc | +-------------------+ 在完成备份恢复后咱们应当当即作一次完整备份: [root@Master data]# innobackupex --user=larry --password=QAZWSX123 /backups ....... ....... innobackupex: Backup created in directory '/backups/2014-04-01_13-06-56' innobackupex: MySQL binlog position: filename 'maria-bin.000001', position 441 140401 13:07:00 innobackupex: Connection to database server closed 140401 13:07:00 innobackupex: completed OK! |
5.使用innobackupex进行增量备份
为了实验效果再次操做一下数据库,对数据进行改动: MariaDB [hellodb]> USE hellodb; MariaDB [hellodb]> CREATE TABLE t2 (Name CHAR(20)); MariaDB [hellodb]> INSERT INTO t2 VALUE ('larry'); MariaDB [hellodb]> select * from t2; +-------+ | Name | +-------+ | larry | +-------+ 每一个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增加。这正是InnoDB表能够进行增量备份的基础,即innobackupex经过备份上次彻底备份以后发生改变的页面来实现。 要实现第一次增量备份,可使用下面的命令进行: [root@Master ~]# innobackupex --incremental /backups/ --incremental-basedir=/backups/2014-04-01_13-06-56/ ........ ........ innobackupex: Backup created in directory '/backups/2014-04-01_13-23-09' innobackupex: MySQL binlog position: filename 'maria-bin.000001', position 737 140401 13:23:14 innobackupex: Connection to database server closed 140401 13:23:14 innobackupex: completed OK! //第一次增量完成! 说明: --incremental 明确说明咱们的操做是增量备份 --incremental-basedir= 明确说明咱们是相对于谁作增量(上次彻底/上次增量),若是每一次都相对于上次的彻底备份作增量备份,那就是差别备份! 须要注意的是,增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是彻底备份。 第二次增量备份 仍是先改变一下数据: MariaDB [(none)]> CREATE DATABASE newdb; MariaDB [(none)]> USE newdb; MariaDB [newdb]> CREATE TABLE newtable (ID INT); MariaDB [newdb]> INSERT INTO newtable value (10); MariaDB [newdb]> select * from newtable; +------+ | ID | +------+ | 10 | +------+ [root@Master ~]# innobackupex --incremental /backups/ --incremental-basedir=/backups/2014-04-01_13-23-09/ 注意:此次咱们是相对于上次增量作的增量备份! ....... ....... ....... innobackupex: Backup created in directory '/backups/2014-04-01_13-43-33' innobackupex: MySQL binlog position: filename 'maria-bin.000001', position 1152 140401 13:34:11 innobackupex: Connection to database server closed 140401 13:34:11 innobackupex: completed OK! 两次增量备份完成后,若是数据又被修改,可是没有作增量备份,那么此刻只能依靠二进制文件进行恢复了: MariaDB [(none)]> USE hellodb; MariaDB [hellodb]> INSERT INTO tb1 value (30); 模拟将服务中止: [root@Master ~]# service mysqld stop Shutting down MySQL.. [ OK ] [root@Master ~]# rm -rf /mydata/data/* |
6.恢复操做:
“准备”(prepare)增量备份与整理彻底备份有着一些不一样,尤为要注意的是: (1)须要在每一个备份(包括彻底和各个增量备份)上,将已经提交的事务进行“重放”。“重放”以后,全部的备份数据将合并到彻底备份上。 (2)基于全部的备份将未提交的事务进行“回滚”。 因而,操做就变成了: # innobackupex --apply-log --redo-only BASE-DIR 接着执行: # innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1 然后是第二个增量: # innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2 其中BASE-DIR指的是彻底备份所在的目录,而INCREMENTAL-DIR-1指的是第一次增量备份的目录,INCREMENTAL-DIR-2指的是第二次增量备份的目录,其它依次类推,即若是有屡次增量备份,每一次都要执行如上操做; 准备第一次彻底备份: [root@Master ~]# innobackupex --apply-log --redo-only /backups/2014-04-01_13-06-56/ 准备第一次增量备份: [root@Master ~]# innobackupex --apply-log --redo-only /backups/2014-04-01_13-23-09/ 准备第二次增量份: [root@Master data]# innobackupex --apply-log --redo-only /backups/2014-04-01_13-06-56/ --incremental-dir=/backups/2014-04-01_13-43-33/ 用准备好的完整备份恢复数据: [root@Master data]# innobackupex --apply-log --redo-only /backups/2014-04-01_13-06-56/ --incremental-dir=/backups/2014-04-01_13-43-33/ 数据目录中的文件如今已经恢复: [root@Master ~]# ls /mydata/data/ hellodb ibdata1 ib_logfile0 ib_logfile1 mysql newdb performance_schema test 修改属主属组 [root@Master ~]# chown -R mysql:mysql /mydata/data/ 还原时间点: [root@Master ~]# mysqlbinlog /mydata/binlogs/maria-bin.000001 > /backups/inc.sql
[root@Master ~]# mysqlbinlog /mydata/binlogs/maria-bin.000001 > /backups/inc.sql [root@Master 2014-04-01_13-43-33]# mysql [root@Master 2014-04-01_13-43-33]# cd [root@Master ~]# service mysqld start Starting MySQL.. [ OK ] [root@Master ~]# mysql MariaDB [(none)]> set sql_log_bin=0; MariaDB [(none)]> source /backups/inc.sql; MariaDB [(none)]> USE newdb; MariaDB [newdb]> select * from newtable; +------+ | ID | +------+ | 10 | +------+ |
OK! 至此全部数据已经恢复回来了! |
下面在介绍一下这个备份工具的其余功能(在此不作示例)
1.Xtrabackup的“流”及“备份压缩”功能
Xtrabackup对备份的数据文件支持“流”功能,便可以将备份的数据经过STDOUT传输给tar程序进行归档,而不是默认的直接保存至某备份目录中。要使用此功能,仅须要使用--stream选项便可。如:
innobackupex --stream=tar /backup | gzip > /backup/`date +%F_%H-%M-%S`.tar.gz |
甚至也可使用相似以下命令将数据备份至其它服务器:
innobackupex --stream=tar /backup | ssh user@www.magedu.com "cat - > /backups/`date +%F_%H-%M-%S`.tar" |
此外,在执行本地备份时,还可使用--parallel选项对多个文件进行并行复制。此选项用于指定在复制时启动的线程数目。固然,在实际进行备份时要利用此功能的便利性,也须要启用innodb_file_per_table选项或共享的表空间经过innodb_data_file_path选项存储在多个ibdata文件中。对某一数据库的多个文件的复制没法利用到此功能。其简单使用方法以下:
innobackupex --parallel /path/to/backup |
同时,innobackupex备份的数据文件也能够存储至远程主机,这可使用--remote-host选项来实现:
innobackupex --remote-host=root@www.magedu.com /path/IN/REMOTE/HOST/to/backup |
2.导入或导出单张表
默认状况下,InnoDB表不能经过直接复制表文件的方式在mysql服务器之间进行移植,即使使用了innodb_file_per_table选项。而使用Xtrabackup工具能够实现此种功能,不过,此时须要“导出”表的mysql服务器启用了innodb_file_per_table选项(严格来讲,是要“导出”的表在其建立以前,mysql服务器就启用了innodb_file_per_table选项),而且“导入”表的服务器同时启用了innodb_file_per_table和innodb_expand_import选项。
(1)“导出”表
导出表是在备份的prepare阶段进行的,所以,一旦彻底备份完成,就能够在prepare过程当中经过--export选项将某表导出了:
innobackupex --apply-log --export /path/to/backup |
此命令会为每一个innodb表的表空间建立一个以.exp结尾的文件,这些以.exp结尾的文件则能够用于导入至其它服务器。
(2)“导入”表
要在mysql服务器上导入来自于其它服务器的某innodb表,须要先在当前服务器上建立一个跟原表表结构一致的表,然后才能实现将表导入:
mysql> CREATE TABLE mytable (...) ENGINE=InnoDB; |
而后将此表的表空间删除:
mysql> ALTER TABLE mydatabase.mytable DISCARD TABLESPACE; |
接下来,未来自于“导出”表的服务器的mytable表的mytable.ibd和mytable.exp文件复制到当前服务器的数据目录,而后使用以下命令将其“导入”:
mysql> ALTER TABLE mydatabase.mytable IMPORT TABLESPACE; |
3.使用Xtrabackup对数据库进行部分备份
Xtrabackup也能够实现部分备份,即只备份某个或某些指定的数据库或某数据库中的某个或某些表。但要使用此功能,必须启用innodb_file_per_table选项,即每张表保存为一个独立的文件。同时,其也不支持--stream选项,即不支持将数据经过管道传输给其它程序进行处理。
此外,还原部分备份跟还原所有数据的备份也有所不一样,即你不能经过简单地将prepared的部分备份使用--copy-back选项直接复制回数据目录,而是要经过导入表的方向来实现还原。固然,有些状况下,部分备份也能够直接经过--copy-back进行还原,但这种方式还原而来的数据多数会产生数据不一致的问题,所以,不管如何不推荐使用这种方式。
(1)建立部分备份
建立部分备份的方式有三种:正则表达式(--include), 枚举表文件(--tables-file)和列出要备份的数据库(--databases)。
(a)使用--include
使用--include时,要求为其指定要备份的表的完整名称,即形如databasename.tablename,如:
innobackupex --include='^mageedu[.]tb1' /path/to/backup |
(b)使用--tables-file
此选项的参数须要是一个文件名,此文件中每行包含一个要备份的表的完整名称;如:
#echo -e 'mageedu.tb1\nmageedu.tb2' > /tmp/tables.txt #innobackupex --tables-file=/tmp/tables.txt /path/to/backup |
(c)使用--databases
此选项接受的参数为数据名,若是要指定多个数据库,彼此间须要以空格隔开;同时,在指定某数据库时,也能够只指定其中的某张表。此外,此选项也能够接受一个文件为参数,文件中每一行为一个要备份的对象。如:
#innobackupex --databases="mageedu testdb" /path/to/backup |
(2)整理(preparing)部分备份
prepare部分备份的过程相似于导出表的过程,要使用--export选项进行:
innobackupex --apply-log --export /pat/to/partial/backup |
此命令执行过程当中,innobackupex会调用xtrabackup命令从数据字典中移除缺失的表,所以,会显示出许多关于“表不存在”类的警告信息。同时,也会显示出为备份文件中存在的表建立.exp文件的相关信息。
(3)还原部分备份
还原部分备份的过程跟导入表的过程相同。固然,也能够经过直接复制prepared状态的备份直接至数据目录中实现还原,不要此时要求数据目录处于一致状态。
OK!Xtrabackup备份工具的使用方法介绍至此!