为什么要备份:

备份的几个重要理由:

灾难恢复、需求改变、审计、测试等;如"测试"定期用最新的生产环境中的数据更新到测试环境服务器

需要考虑的问题:

1、在不导致严重后果的情况下,可以容忍丢失多少数据?需要故障恢复,还是可以接受自从上次日常备份后所有的数据丢失?

2、恢复需要在多长时间内完成?哪种类型的宕机是可以接受的?哪种影响是应用和用户可以接受的?当情况发生时,又该怎样持续提供服务等?

3、需要恢复什么?常见的是恢复整个服务器、单个数据库、单个表,或只是特定的事务或语句等

备份类型:

根据数据库是否需要在线备份还是离线备份,可分为以下几点:

热备份:备份期间不需要服务停机,业务不受影响

温备份:备份期间仅允许读的请求

冷备份:备份期间需要关闭Mysql服务或读写请求都不受影响

备份方式:

完全备份:full backup备份全部数据集

增量备份:incrementalbackup 上次完全备份或增量备份以来改变的数据

差异备份:differentialbackup 上次完全备份以来改变的数据

恢复数据时需要用到的备份文件:

完全+增量备份方式

需要完全备份+增量备份+二进制文件

完全+差异备份方式

需要完全备份+差异备份+二进制文件

逻辑备份还是物理备份:

逻辑备份:

优点:

逻辑备份可以使用编辑器或文本处理工具进行编辑或查看

恢复非常简单

比较灵活

与存储引擎无关

有助于避免数据损坏

缺点:

必须由数据库服务器完成逻辑备份工作,因此需要使用服务器更多资源

备份出的数据占用更大的空间

浮点数可能会丢失精度

数据还原之后,索引需要重建

物理备份:

优点:

备份与恢复数据比较简单

InnoDBMyISAM的物理备份容易跨平台、操作系统和Mysql版本

恢复速度比较快,不需要重新构建索引

缺点:

InnoDB的原始文件会比逻辑备份大得多

物理备份不是总可以跨平台、操作系统及Mysql版本;文件名大小写敏感和浮点格式有可能会有问题

备份的对象:

数据文件、配置文件、代码:存储过程,存储函数、触发器等、二进制日志、事务日志、中继日志、服务器配置、管理脚本、任务计划等

计划Mysql备份方案:

1、在生产环境中,对于数据来说,备份是必要的;并选择适合的备份类型

2、保留多个备份集

3、定期从备份中抽取数据进行恢复测试

4、保存进制日志文件以用于基于故障时间点恢复,数据不宜于二进制文件放在同一个位置

5、如果不借助于备份工具备份,需要验证备份是否正常

6、通过测试演练整个数据的备份和恢复,测试恢复所需要的资源(如:CPU、磁盘空间、时间及网络带宽等)

7、对于安全性要考虑周全,如果有人能接触到生产服务器,他是否能访问备份服务器


使用Mysqldump备份工具实现完全备份,并结合二进制日志实现增量备份

特点:逻辑备份工具、支持InnoDB热备份、MyISAM温备份;备份与恢复较慢

使用LVM逻辑卷快照功能实现几乎热血备份的完全备份,并结合二进制日志实现增量备份;简单介绍"mylvmbackup"一键备份工具的使用

特点:几乎接近于热备份、物理备份、备份与恢复较快

使用Xtrabackup备份工具实现完全备份与增量备份

特点:物理备份工具、支持InnoDB热备份、MyISAM温备份、速度较快


一、环境准备

1、安装Mysql数据库服务器

######安装编译环境
[root@localhost ~]# yum -y groupinstall "Server Platform Development" "Development tools"
######安装编译工具
[root@localhost ~]# yum install -y cmake
######创建Mysql用户
[root@localhost ~]# useradd -r mysql
######解压并安装Mysql
[root@localhost ~]# tar xf mysql-5.5.33.tar.gz
[root@localhost ~]# cd mysql-5.5.33
[root@localhost mysql-5.5.33]# cmake . \
> -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \   #安装路径
> -DMYSQL_DATADIR=/mydata/data \              #数据存放路径
> -DSYSCONFDIR=/etc \                         #主配置文件目录
> -DWITH_INNOBASE_STORAGE_ENGINE=1 \          #下面三项启用支持的存储引擎
> -DWITH_ARCHIVE_STORAGE_ENGINE=1 \
> -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
> -DWITH_READLINE=1 \                         #支持readline库
> -DWITH_SSL=system \                         #支持SSL加密
> -DWITH_ZLIB=system \                        #支持ZLIB压缩
> -DWITH_LIBWRAP=0 \                          #支持Libwrap库
> -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \         #Sock文件路径
> -DDEFAULT_CHARSET=utf8 \                    #默认字符集
> -DDEFAULT_COLLATION=utf8_general_ci         #默认字符集排序规则
######编译并安装
[root@localhost mysql-5.5.33]# make && make install
注释: 如果想清理此前的编译所生成的文件,则需要使用如下命令
make clean
rm CMakeCache.txt

2、为Mysql提供主配置文件与Sysv服务脚本

######为Mysql提供主配置文件
[root@localhost mysql-5.5.33]# cp support-files/my-large.cnf /etc/my.cnf
######为Mysql提供Sysv服务脚本
[root@localhost mysql-5.5.33]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
######赋于Sysv脚本执行权限
[root@localhost mysql-5.5.33]# chmod +x /etc/rc.d/init.d/mysqld
######将Mysqld加入系统服务
[root@localhost mysql-5.5.33]# chkconfig --add mysqld
[root@localhost mysql-5.5.33]# chkconfig mysqld on

3、让系统识别源码包安装的软件

[root@localhost mysql]# echo "PATH=/usr/local/mysql/bin:$PATH" >> /etc/profile
[root@localhost mysql]# . /etc/profile
[root@localhost mysql]# ln -s /usr/local/mysql/include /usr/include/mysql
[root@localhost ~]# echo "/usr/local/mysql/lib" >> /etc/ld.so.conf
[root@localhost ~]# ldconfig

4、修改Mysql主配置文件

[root@localhost mysql]# vim /etc/my.cnf
datadir = /mydata/data            #添加此行,数据存放目录
innodb_file_per_table = 1         #启用InnoDB表每表一个文件,默认所有数据库使用一个表空间
log-bin=/binlog/mysql-bin         #修改二制作存放目录

5、为Mysql创建数据库与二进制存放目录

######创建数据、二进制存放目录与备份目录
[root@localhost ~]# mkdir -p /backup /mydata/data  /binlog
######修改Mysql二进制与数据及备份目录的属主、属组为Mysql用户
[root@localhost mysql]# chown -R mysql.mysql /mydata/data
[root@localhost mysql]# chown -R mysql.mysql /binlog /backup
######修改Mysql安装目录的属组为Mysql组
[root@localhost mysql]# chown -R :mysql *

6、初始化Mysql并启动服务

[root@localhost mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/mydata/data
[root@localhost ~]# service mysqld start
Starting MySQL......... SUCCESS!
######修改Mysql的root用户密码
[root@localhost ~]# mysqladmin -uroot password 'root@pass'

7、创建测试数据库与表并插入数据

[root@localhost ~]# mysql -uroot -proot@pass
mysql> create database allen;
mysql> use allen;
mysql> create table tab1 (ID tinyint unsigned not null primary key auto_increment,Name char(20) not null unique key,Age tinyint unsigned,Gender char(1) default 'M');
mysql> insert into tab1 (Name,Age,Gender) values ('Zhang WuJi',26,'M'),('Zhao Min',24,'F');

二、使用Mysqldump备份工具备份

1、使用Mysqldump对"allen"数据库做备份并且滚动二进制日志,记录日志位置

[root@localhost ~]# mysqldump -uroot -proot@pass --lock-all-tables --routines --events --triggers --master-data=2 --flush-logs --databases allen > /backup/allen_`date +%F`.sql
注释:
-u                        #指定用户名
-p                        #指定用户密码
-h                        #指定主机地址
-A|--all-databases        #备份所有数据库
--databases               #备份指定数据库
--single-transcation      #基于此项可以实现对InnoDB表做热备份,但不需要使用
--lock-all-tables         #执行备份时为所有表请求加锁
-E|--events               #备份事件调度器代码
--opt                     #同时启动各种高级选项
-R|--routines             #备份存储过程和存储函数
--flush-logs              #备份之前刷新日志
--triggers                #备份触发器
--master-data=2           #该选项将会记录binlog的日志位置与文件名并追加到文件中,如果为1将会输出CHANGE MASTER命令,主从下有用
######更多选项请参考man手册

2、备份二进制日志文件并查看已备份的数据文件

[root@localhost ~]# cp /binlog/mysql-bin.00000* /backup/
[root@localhost ~]# ls /backup/
allen_2013-09-06.sql  mysql-bin.000001  mysql-bin.000002  mysql-bin.000003  mysql-bin.000004

3、在"allen"数据库中新添加数据来模拟做增量备份,并查看当前日志文件及所处位置

mysql> create table tab2 (ID tinyint unsigned not null primary key auto_increment,Name char(20) not null unique key,Age tinyint unsigned,Gender char(1) default 'M');
mysql> insert into tab2 (Name,Age,Gender) values ('Liang ShanBo',26,'M'),('Zhu YingTai',24,'F');
mysql> show master status; #查看二进制日志文件所处位置
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 |     1289 |              |                  |
+------------------+----------+--------------+------------------+

4、做增量备份,基于上一次完全备份到目前日志所处的位置

######查看数据库备份的二进制日志
[root@localhost ~]# less /backup/allen_2013-09-06.sql
######从下面可以看出二进制日志文件及完全备份后日志所处位置"107"
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=107;
######基于二进制日志做增量备份,
[root@localhost ~]# mysqlbinlog --start-position=107 /binlog/mysql-bin.000004 > /backup/allen_incremental.sql
注释:
--start-position     #指定从哪个位置开始导出二进制日志
--stop-position      #指定到哪个位置结束;如果到最后可以不用指定
--start-datetime     #指定从哪个时间开始 时间格式:"2013-09-06 14:50:26"
--stop-datetime      #指定到哪个时间结束

5、向"allen"数据库新添加两条记录,然后模拟误操作把数据库删除了,怎么恢复到当前数据

mysql> insert into tab2 (Name,Age,Gender) values ('Zhu BaJie',26,'M'),('Sun WuKong',24,'F');
mysql> drop database allen;
mysql> show master status; #查看二进制文件及所处位置
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 |     1644 |              |                  |
+------------------+----------+--------------+------------------+

6、恢复数据到当前数据,需要恢复完整备份+增量备份+增量备份后删除之前的二进制文件

######查看二进制文件,下面可以看出删除操作是在"1561"时做的
[root@localhost ~]# mysqlbinlog  /binlog/mysql-bin.000004
# at 1561
#130906  5:31:04 server id 1  end_log_pos 1644  Query   thread_id=5 exec_time=0 error_code=0
SET TIMESTAMP=1378416664/*!*/;
drop database allen
######导出删除之前至增量备份后的二进制日志数据
[root@localhost ~]# mysqlbinlog --start-position=1289 --stop-position=1561 /binlog/mysql-bin.000004  > /backup/allen_1561.sql
[root@localhost ~]# mysql -uroot -proot@pass
mysql> set global sql_log_bin=0;            #关闭二进制日志记录,因为恢复数据对我们来说记录没有意义
mysql> source /backup/allen_2013-09-06.sql  #恢复完整备份
mysql> source /backup/allen_incremental.sql #恢复增量备份
mysql> source /backup/allen_1561.sql        #恢复增量后至删除前的数据
mysql> set global sql_log_bin=1;            #开启二进制日志记录
mysql> use allen;                           #切换到"allen"数据库
mysql> show tables;                         #查看数据表已经恢复
+-----------------+
| Tables_in_allen |
+-----------------+
| tab1            |
| tab2            |
+-----------------+
mysql> select * from tab1;                  #查看表内数据也已经完全恢复
+----+------------+------+--------+
| ID | Name       | Age  | Gender |
+----+------------+------+--------+
|  1 | Zhang WuJi |   26 | M      |
|  2 | Zhao Min   |   24 | F      |
+----+------------+------+--------+
mysql> select * from tab2;
+----+--------------+------+--------+
| ID | Name         | Age  | Gender |
+----+--------------+------+--------+
|  1 | Liang ShanBo |   26 | M      |
|  2 | Zhu YingTai  |   24 | F      |
|  3 | Zhu BaJie    |   26 | M      |
|  4 | Sun WuKong   |   24 | F      |
+----+--------------+------+--------+

注释:如果在生产环境中需要做数据库完全备份,如果数据库整个系统崩溃,需要另外找一台服务器安装好Mysql服务,初始化并启动,然后使用备份文件与二进制文件进行恢复,所以一定要保存好备份文件与二进制文件


三、使用LVM逻辑卷快照备份

前提:使用LVM逻辑卷来做快照备份的话,需要Mysql的数据目录与二进制日志文件目录都在LVM逻辑卷组上

1、创建LVM逻辑卷 逻辑卷详细介绍点此处

######分区,不做详细介绍
[root@localhost ~]# fdisk /dev/sdb
Command (m for help): n
p
Partition number (1-4): 1
First cylinder (1-7832, default 1):
Last cylinder, +cylinders or +size{K,M,G} (1-7832, default 7832): +10G
Command (m for help): n
p
Partition number (1-4): 2
First cylinder (1307-7832, default 1307):
Last cylinder, +cylinders or +size{K,M,G} (1307-7832, default 7832): +10G
Command (m for help): t
Partition number (1-4): 1
Hex code (type L to list codes): 8e
Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): 8e
Command (m for help): p
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        1306    10490413+  8e  Linux LVM
/dev/sdb2            1307        2612    10490445   8e  Linux LVM
Command (m for help): w
######让内核重新读取分区表,如果读取不到需要重启
[root@localhost ~]# partx /dev/sdb
######创建逻辑卷并挂载,不做详细介绍
[root@localhost ~]# pvcreate /dev/sdb{1,2}
  Physical volume "/dev/sdb1" successfully created
  Physical volume "/dev/sdb2" successfully created
[root@localhost ~]# vgcreate myvg /dev/sdb{1,2}
  Volume group "myvg" successfully created
[root@localhost ~]# lvcreate -L +10G -n mylv myvg
  Logical volume "mylv" created
[root@localhost ~]#
[root@localhost ~]# mkfs.ext4 /dev/myvg/mylv[root@localhost ~]# mkdir /mydata /backup
[root@localhost ~]# vim /etc/fstab
/dev/myvg/mylv          /mydata                 ext4    defaults        0 0
[root@localhost ~]# mount -a
######创建Mysql数据与二进制日志存放目录并修改权限
[root@localhost ~]# mkdir /mydata/{data,binlog}
[root@localhost ~]# chown -R mysql:mysql /mydata/*

2、修改Mysql主配置文件数据存放目录与二进制文件存放目录并初始化

[root@localhost ~]# vim /etc/my.cnf
datadir = /mydata/data
log-bin=/mydata/binlog/mysql-bin
[root@localhost mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/mydata/data/
[root@localhost mysql]# service mysqld start
Starting MySQL... SUCCESS!

3、创建数据库并添加数据

mysql> create database allen;
mysql> use allen;
mysql> create table tab1 (ID tinyint unsigned not null primary key auto_increment,Name char(20) not null unique key,Age tinyint unsigned,Gender char(1) default 'M');
mysql> insert into tab1 (Name,Age,Gender) values ('Zhang WuJi',26,'M'),('Zhao Min',24,'F');

4、登录Mysql数据库,请求为所有表加锁,记得一定不要关闭终端,否则表锁将会失效,并滚动日志

mysql> flush tables with read lock;    #为所有表请求加锁
mysql> flush logs;                     #刷新日志
mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 |      107 |              |                  |
+------------------+----------+--------------+------------------+

5、另外迅速开启一个终端窗口,为逻辑卷创建快照;逻辑卷:"/dev/myvg/mylv"

[root@localhost ~]# lvcreate -L 500M -s -p r -n mylv-snap /dev/myvg/mylv
  Logical volume "mylv-snap" created

6、快照做完后,快速释放读锁

mysql> unlock tables;

7、挂载快照卷,备份出数据,卸载快照卷并删除

[root@localhost ~]# mount /dev/myvg/mylv-snap /mnt/
mount: block device /dev/mapper/myvg-mylv--snap is write-protected, mounting read-only
[root@localhost ~]# cp -rp /mnt/* /backup/
[root@localhost ~]# umount /mnt/
######删除快照卷
[root@localhost ~]# lvremove /dev/myvg/mylv-snap
Do you really want to remove active logical volume mylv-snap? [y/n]: y
  Logical volume "mylv-snap" successfully removed

这样一次完整的LVM完全备份就算是完成了,下面我们来测试一下是否能正常使用

8、停止Mysql服务,删除数据目录下的所有文件来模拟数据库损坏;并恢复数据

[root@localhost ~]# service mysqld stop
Shutting down MySQL... SUCCESS!
[root@localhost ~]# rm -rf /mydata/*
######恢复已备份的数据
[root@localhost ~]# cp -rp /backup/* /mydata/
######启动Mysql服务
[root@localhost ~]# service mysqld start
Starting MySQL SUCCESS!
注释:如果不能启动,请检查数据目录权限;属主、属组是否为Mysql用户

9、登录Mysql服务器,验证数据是否恢复

mysql> select * from allen.tab1;    #数据已经成功恢复
+----+------------+------+--------+
| ID | Name       | Age  | Gender |
+----+------------+------+--------+
|  1 | Zhang WuJi |   26 | M      |
|  2 | Zhao Min   |   24 | F      |
+----+------------+------+--------+

注释:这里就不在演示使用LVM做完完整备份后Mysql出现问题,其操作与恢复流程与使用"mysqldump"备份工具一样,先使用完全备份恢复,再使用二进制日志进行恢复;使用二进制恢复时,请找好二进制日志到上一次备份的位置,避免不必要的错误发生;然后使用"mysqlbinlog"导出并使用批处理的方式导入数据库

Mylvmbackup

1、介绍一下Mylvmbackup工具的使用,mylvmbackup是基于LVM逻辑卷快照做的备份,简单的说也就是LVM备份方法的简便版本,配置好主配置文件直接执行提供的脚本文件即可完成备份;此工具只能做备份操作,这里只介绍如何配置安装及备份

2、使用此工具做备份前提当然数据目录必须存放在LVM逻辑卷上,而且需要给快照卷剩余足够的空间做备份;如果需要恢复,解压缩备份文件,恢复操作同上

3、下载并安装mylvmbackup; 软件版本:mylvmbackup-0.14-0.noarch.rpm 点此下载

[root@localhost ~]# yum -y install mylvmbackup-0.14-0.noarch.rpm
[root@localhost ~]# rpm -ql mylvmbackup
/etc/mylvmbackup.conf    #主配置文件
/usr/bin/mylvmbackup     #执行程序

4、主配置文件介绍

[root@localhost ~]# vim /etc/mylvmbackup.conf
[mysql]                #连接数据库配置
user=root
password=root@pass
host=localhost
port=3306
socket=/tmp/mysql.sock
mycnf=/etc/my.cnf
[lvm]                  #LVM逻辑卷的配置
vgname=myvg            #卷组名称
lvname=mylv            #逻辑卷名称
backuplv=mysql_snap    #快照卷名称
lvsize=5G
[fs]                   #文件系统配置
xfs=0
mountdir=/mnt          #挂载目录
backupdir=/backup      #备份目录,也可以备份到行程主机
[misc]                 #定义备份选项
backuptype=tar         #定义备份的类型
backupretention=0
prefix=backup          #定义备份文件名前缀
suffix=_mysql          #定义备份文件名后缀
tararg=cvf             #定义tar参数,默认为cvf
tarfilesuffix=.tar.gz  #定义备份文件后缀名格式
datefmt=%Y%m%d_%H%M%S  #定义备份文件名时间戳格式
keep_snapshot=0        #是否保留snaphot
keep_mount=0           #是否卸载snaphot
quiet=0                #定义记录日志类型
注释:其他配置保持输入即可

5、备份数据库并验证备份文件

[root@localhost ~]# mylvmbackup
######出现以下信息表示备份成功,下面意思是删除快照卷成功
20130906 11:55:33 Info: Running: lvremove -f /dev/myvg/mysql_snap
  Logical volume "mysql_snap" successfully removed
20130906 11:55:34 Info: DONE: Removing snapshot
######查看备份文件,已经成功备份
[root@localhost ~]# ls /backup/
backup-20130906_115532_mysql.tar.gz




四、使用Xtrabackup备份恢复

简介:

Xtrabackup是一个对InnoDB、XtraDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是一个很好的开源备份恢复工具。xtrabackup可以基于上一次整库备份基础上做增量备份(InnoDB、StraDB);可以以流的形式备份,并直接保存到远程机器上

注释:这里就不在配置环境了,直接接着使用上一次LVM备份恢复的环境

1、下载并安装Xtrabackup工具 软件版本:percona-xtrabackup-2.1.4-656.rhel6.x86_64.rpm 点此下载

[root@localhost ~]# yum -y install percona-xtrabackup-2.1.4-656.rhel6.x86_64.rpm

2、创建并授权Mysql数据库用户有备份权限

[root@localhost ~]# mysql -uroot -proot@pass
mysql> create user 'backup'@'localhost' identified by 'mypass';     #创建用户并设置密码
mysql> revoke all privileges,grant option from 'backup'@'localhost';#去掉用户的所有默认权限
mysql> grant reload,lock tables,replication client,event on *.* to 'backup'@'localhost';  #重新为用户授权
mysql> flush privileges;   #刷新使其重新授权表
注释: 用户授权规则为最小权限

3、完全备份:

[root@localhost ~]# innobackupex --user=backup --password=mypass /backup/
######下面表示已经备份成功
innobackupex: Backup created in directory '/backup/2013-09-06_07-47-33'
innobackupex: MySQL binlog position: filename 'mysql-bin.000005', position 744
130906 07:47:36  innobackupex: Connection to database server closed
130906 07:47:36  innobackupex: completed OK!

注释:备份完成后,会在"/backup"目录下生成一个以当前日期时间为名称的目录;使用innobakupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。当然在备份时"innobackupex"还会在备份目录中生成一些文件如:

(3.1)、xtrabackup_checkpoints —— 备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息;每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的

(3.2)、xtrabackup_binlog_info —— mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置

(3.3)、xtrabackup_binlog_pos_innodb —— 二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前position

(3.4)、xtrabackup_binary —— 备份中用到的xtrabackup的可执行文件

(3.5)、backup-my.cnf —— 备份命令用到的配置选项信息

(3.6)、使用innobackupex进行备份时,还可以使用"--no-timestamp"选项来阻止命令自动创建一个以时间命名的目录;如此一来,innobackupex命令将会创建一个BACKUP-DIR目录来存储备份数据

4、准备(prepare)一个完全备份

在备份完成后,数据不能直接用于恢复,因为备份的数据中可以会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务;因此,此时的数据文件仍处于不一致状态,"准备"的工作就是通过回滚未提交的事务及同步已提交的事务到数据文件使用数据文件处于一致性状态

######为防止意外错误,先关闭Mysql服务
[root@localhost ~]# service mysqld stop
Shutting down MySQL. SUCCESS!
######删除数据目录下的所有文件
[root@localhost ~]# rm -rf /mydata/data/*
######准备一个完全备份
[root@localhost ~]# innobackupex --apply-log /backup/2013-09-06_07-47-33/
######出现以下信息表示已经成功
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
130906  8:26:36  InnoDB: Starting shutdown...
130906  8:26:40  InnoDB: Shutdown completed; log sequence number 1603596
130906 08:26:40  innobackupex: completed OK!
注释:
--apply-log  #作用是把备份时没有提交的事务回滚,已经提交的事务同步的数据文件中

(4.1)、在“准备”的过程中,innobackupex还可以使用"--use-memory"选项来指定其可以使用的内存的大小,默认通常为100M。如果有足够的内存可用,可以多划分一些内存给prepare的过程,以提高其完成速度

5、完全恢复数据库

[root@localhost ~]# innobackupex --copy-back /backup/2013-09-06_07-47-33/
######出现以下提示表示已经恢复成功
innobackupex: Starting to copy InnoDB log files
innobackupex: in '/backup/2013-09-06_07-47-33'
innobackupex: back to original InnoDB log directory '/mydata/data'
innobackupex: Copying '/backup/2013-09-06_07-47-33/ib_logfile0' to '/mydata/data'
innobackupex: Copying '/backup/2013-09-06_07-47-33/ib_logfile1' to '/mydata/data'
innobackupex: Finished copying back files.
130906 08:40:24  innobackupex: completed OK!
注释:
--copy-back    #用于恢复操作,通过复制所有数据相关的文件至Mysql服务器的数据目录来执行恢复过程

6、验证是否已经成功恢复

[root@localhost ~]# service mysqld start
Starting MySQL.. SUCCESS!
[root@localhost ~]# mysql -uroot -proot@pass
mysql> select * from allen.tab1;    #已经成功恢复数据
+----+------------+------+--------+
| ID | Name       | Age  | Gender |
+----+------------+------+--------+
|  1 | Zhang WuJi |   26 | M      |
|  2 | Zhao Min   |   24 | F      |
+----+------------+------+--------+
注释:如果启动不成功,请查看数据目录下文件属主、属组权限是否为Mysql用户

7、使用"innobackupex"做增量备份,首先需要添加几条数据到数据库中

[root@localhost ~]# mysql -uroot -proot@pass
mysql> use allen;
mysql> insert into tab1 (Name,Age,Gender) values ('Liang ShanBo',26,'M'),('Zhu YingTai',24,'F'),('BaJie',500,'M'),('WuKong',800,'M');

8、进行增量备份

######创建增量备份存储目录
[root@localhost ~]# mkdir /incremental
######执行增量备份
[root@localhost ~]# innobackupex -user=backup -password=mypass --incremental /incremental/ --incremental-basedir=/backup/2013-09-06_07-47-33/
######出现以下信息表示已经成功
innobackupex: Backup created in directory '/incremental/2013-09-06_09-08-16'
innobackupex: MySQL binlog position: filename 'mysql-bin.000007', position 420
130906 09:08:20  innobackupex: Connection to database server closed
130906 09:08:20  innobackupex: completed OK!
注释:
--incremental             #指定增量备份数据存放目录
--incremental-basedir=DIR #指定上一次备份所在的目录

9、再添加一些数据进行增量备份

[root@localhost ~]# mysql -uroot -proot@pass
mysql> use allen;
mysql> insert into tab1 (Name,Age,Gender) values ('Guan Yin',26,'M'),('Ru Lai',24,'F');
######再次做增量备份是基于上一次增量备份来做
[root@localhost ~]# innobackupex -user=backup -password=mypass --incremental /incremental/ --incremental-basedir=/incremental/2013-09-06_09-08-16/
######增量备份成功
innobackupex: Backup created in directory '/incremental/2013-09-06_09-17-49'
innobackupex: MySQL binlog position: filename 'mysql-bin.000007', position 687
130906 09:17:52  innobackupex: Connection to database server closed
130906 09:17:52  innobackupex: completed OK!

注释:增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是完全备份

10、删除数据库文件来模拟数据库损坏,实现对增量备份进行恢复

[root@localhost ~]# service mysqld stop
[root@localhost ~]# rm -rf /mydata/data/*
######准备第一个备份文件为完全备份
[root@localhost ~]# innobackupex --apply-log --redo-only /backup/2013-09-06_07-47-33/
######准备第二个增量备份文件基于完全备份
[root@localhost ~]# innobackupex --apply-log --redo-only /backup/2013-09-06_07-47-33/ --incremental-dir=/incremental/2013-09-06_09-08-16/
######准备第二个增量备份文件基于完全备份
[root@localhost ~]# innobackupex --apply-log --redo-only /backup/2013-09-06_07-47-33/ --incremental-dir=/incremental/2013-09-06_09-17-49/
注释:需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”,“重放”之后,所有的备份数据将合并到完全备份上;如果有更多的增量备份文件,依次如此,一个一个的合并到完全备份上
--redo-only    #作用是备份时提交的但还在事务日志中的应用到数据文件,但是还没有提交的并不回流
--incremental-dir=DIR #指定恢复的增量备份目录,这个选项会使增量备份文件中的数据合并到完全备份

11、恢复数据并启动Mysql服务验证

[root@localhost ~]# innobackupex --copy-back /backup/2013-09-06_07-47-33/
######恢复成功
innobackupex: Starting to copy InnoDB log files
innobackupex: in '/backup/2013-09-06_07-47-33'
innobackupex: back to original InnoDB log directory '/mydata/data'
innobackupex: Copying '/backup/2013-09-06_07-47-33/ib_logfile0' to '/mydata/data'
innobackupex: Copying '/backup/2013-09-06_07-47-33/ib_logfile1' to '/mydata/data'
innobackupex: Finished copying back files.
130906 09:53:33  innobackupex: completed OK!
[root@localhost ~]# chown -R mysql:mysql /mydata/data/*
[root@localhost ~]# service mysqld start
Starting MySQL.. SUCCESS!
[root@localhost ~]# mysql -uroot -proot@pass
mysql> select * from allen.tab1;     #数据已经成功恢复
+----+--------------+------+--------+
| ID | Name         | Age  | Gender |
+----+--------------+------+--------+
|  1 | Zhang WuJi   |   26 | M      |
|  2 | Zhao Min     |   24 | F      |
|  3 | Liang ShanBo |   26 | M      |
|  4 | Zhu YingTai  |   24 | F      |
|  5 | BaJie        |  255 | M      |
|  6 | WuKong       |  255 | M      |
|  7 | Guan Yin     |   26 | M      |
|  8 | Ru Lai       |   24 | F      |
+----+--------------+------+--------+

这里就不在演示备份完成后Mysql出现问题,其操作与恢复流程与使用"mysqldump"备份工具一样,使用完全备份+完全备份后到现在所有的增量备份+最后一次做增量备份到当前时间的二进制日志文件进行恢复;使用二进制恢复时,请找好二进制日志到上一次备份的位置,避免不必要的错误发生;然后使用"mysqlbinlog"导出并使用批处理的方式导入数据库!!!