xtrabackup实现mysql数据库的彻底备份和增量备份

一、简介mysql

      Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上唯一一款开源的可以对innodb和xtradb数据库进行热备的工具。特色:sql

     (1)备份过程快速、可靠数据库

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

     (3)可以基于压缩等功能节约磁盘空间和流量app

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

     (5)还原速度快工具

     Xtrabackup提供了两种命令行工具:spa

           xtrabackup:专用于备份InnoDB引擎的数据;命令行

           innobackupex:这是一个perl脚本,在执行过程当中会调用xtrabackup命令,这样用该命令便可以实现备份InnoDB,也能够备份MyISAM引擎的对象,可是对于InnoDB能够进行彻底备份和增量备份,而MyISAM只能进行彻底备份不能增量备份;日志

二、安装

      # rpm -ivh percona-xtrabackup-2.2.10-1.el5.i386.rpm

三、若是要使用一个最小权限的用户进行备份,则可基于以下命令建立此类用户

     # mysql

     mysql> CREATE USER  'bkpuser' @ 'localhost'  IDENTIFIED BY  'luochen';

     mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM  'luochen';

     mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO  'luochen'@'localhost';

     mysql> FLUSH PRIVILEGES;

四、彻底备份

     # innobackupex --user=DBUSER --password=DBUSERPASS   /path/to/BACKUP-DIR/

     使用innobakupex备份时,其会调用xtrabackup备份全部的InnoDB表,复制全部关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命令的目录中。

     在备份的同时,innobackupex还会在备份目录中建立以下文件:

     ( 1 )xtrabackup_checkpoints —— 备份类型(如彻底或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息;每一个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目录来存储备份数据。

五、准备(prepare)一个彻底备份

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

     innobakupex命令的--apply-log选项可用于实现上述功能。以下面的命令:

     # innobackupex --apply-log  /path/to/BACKUP-DIR

     若是执行正确,其最后输出的几行信息一般以下:

     xtrabackup: starting shutdown with innodb_fast_shutdown = 1

     120407  9:01:36  InnoDB: Starting shutdown...

     120407  9:01:40  InnoDB: Shutdown completed; log sequence number 92036620

     120407 09:01:40  innobackupex: completed OK!

     在实现“准备”的过程当中,innobackupex一般还可使用--use-memory选项来指定其可使用的内存的大小,默认一般为100M。若是有足够的内存可用,能够多划分一些内存给prepare的过程,以提升其完成速度。

六、从一个彻底备份中恢复数据

     innobackupex命令的--copy-back选项用于执行恢复操做,其经过复制全部数据相关的文件至mysql服务器DATADIR目录中来执行恢复过程。innobackupex经过backup-my.cnf来获取DATADIR目录的相关信息。

     # innobackupex --copy-back  /path/to/BACKUP-DIR

     若是执行正确,其输出信息的最后几行一般以下:

     innobackupex: Starting to copy InnoDB log files

     innobackupex: in '/backup/2012-04-07_08-17-03'

     innobackupex: back to original InnoDB log directory '/mydata/data'

     innobackupex: Finished copying back files.

     120407 09:36:10  innobackupex: completed OK!

     请确保如上信息的最行一行出现“innobackupex: completed OK!”。

     当数据恢复至DATADIR目录之后,还须要确保全部数据文件的属主和属组均为正确的用户,如mysql,不然,在启动mysqld以前还须要事先修改数据文件的属主和属组。如:

     # chown -R  mysql:mysql  /mydata/data/

七、使用innobackupex进行增量备份

     每一个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增加。这正是InnoDB表能够进行增量备份的基础,即innobackupex经过备份上次彻底备份以后发生改变的页面来实现。

     要实现第一次增量备份,可使用下面的命令进行:

     # innobackupex --incremental /backup --incremental-basedir=BASEDIR

     其中,BASEDIR指的是彻底备份所在的目录,此命令执行结束后,innobackupex命令会在/backup目录中建立一个新的以时间命名的目录以存放全部的增量备份数据。另外,在执行过增量备份以后再一次进行增量备份时,其--incremental-basedir应该指向上一次的增量备份所在的目录。

     须要注意的是,增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是彻底备份。

   “准备”(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指的是第二次增量备份的目录,其它依次类推,即若是有屡次增量备份,每一次都要执行如上操做

八、从彻底备份和增量备份中恢复数据  

     # service mysqld  stop

     # rm -rf /mydata/data/*

     # innobackupex --copy-back /back/彻底备份目录

     # cd /mydata/data

     # chown -R mysql.mysql /mydata/data

     # service mysqld start

     最后验证数据是否恢复回来

九、导入或导出单张表

     默认状况下,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;

相关文章
相关标签/搜索