一、备份类型和备份工具简介


   备份的目的是在灾难发生时用来还原,因此为了保证可以还原,因此需要定期进行恢复测试,另外还需要根据实际情况制定最优的备份和恢复策略。


   1、备份类型

       ①、按备份时服务器是否继续提供服务区分:

冷备(cold backup):备份时读写都不受影响
温备(warm backup)全局施加共享锁,只能读,不能写
热备(hot backup):也叫离线备份,读写操作均中止


         不同的存储引擎对备份的支持也是不一样的:

MyISAM:
存储引擎可以使用LVM快照功能配合实现热备份,如果没有LVM,则只能实现温备份。
//
InnoDB则:
可以完全支持热备,可使用的热备工具有:xtrabackup, mysqldump等


     ②、按备份操作方式区分:

物理备份:直接复制数据文件。特点:速度快
逻辑备份:将数据导出至文本文件中。特点:速度慢、丢失浮点数精度;方便使用文本处理工具直接对其处理、可移植能力强


     ③、按是否备份全部数据还是只备份部分数据区别:

完全备份(full backup):备份全部需要备份的数据
增量备份:仅备份上次完全备份或增量备份以后变化的数据
差异备份:仅备份上次完全备份依赖变化的数据
一般情况下,根据备份策略组合使用:完全+增量;完全+差异


   那么MySQL备份需要备份那些数据呢?

     主要包括:数据、配置文件、二进制日志、事务日志


   2、常用备份工具简介

       ①、mysqldump: 逻辑备份工具,单线程,可以对InnoDB热备、MyISAM温备、Aria温备

                缺点:备份和恢复过程较慢,很难实现差异或增量备份


           mysqldumper:多线程的mysqldump

               缺点:很难实现差异或增量备份


       ②、LVM逻辑卷快照接近于热备的工具,因为要先请求全局锁,而后创建快照,并在创建完成后释放全局锁,可以使用cp、tar等工具进行物理备份,备份和恢复岁都很快

               缺点:很难实现增量备份,并且请求全局锁需要等待一段时间,在繁忙的服务器上尤其如此

备份过程如下:
mysql> FLUSH TABLES;
mysql> LOCK TABLES
然后创建快照:释放锁,而后复制数据


select语句:
备份:select clause into outfile '/path/to/somefile'
恢复:load data infile '/path/to/somefile' into table 'tb_name'



        ③、Xtarbackup: Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具。

   特点:
( 1 )备份过程快速、可靠;
( 2 )备份过程不会打断正在执行的事务;
( 3 )能够基于压缩等功能节约磁盘空间和流量;
( 4 )自动实现备份检验;
( 5 )还原速度快;


        ④、其它工具

               Innobase:商业备份工具,

               innobackup

               mysqlhostcopy:物理备份工具,几乎冷备



二、使用mysqldump对MySQL进行备份与恢复

   1、基本语法:

备份单个数据或单个数据中的指定表:
mysqldump [OPTIONS] database [tb1] [tb2]…
备份多个数据库:
mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
备份所有数据库:
mysqldump [OPTIONS] --all-databases [OPTIONS]


   2、选项[OPTIONS]说明:

--all-databases , -A
导出全部数据库。
//mysqldump -uroot -p --all-databases
--all-tablespaces , -Y
导出全部表空间。
//mysqldump -uroot -p --all-databases --all-tablespaces
--no-tablespaces , -y
不导出任何表空间信息。
//mysqldump -uroot -p --all-databases --no-tablespaces
--character-sets-dir
字符集文件的目录
//mysqldump -uroot -p --all-databases --character-sets-dir=/usr/local/mysql/share/mysql/charsets
--databases, -B
导出几个数据库。参数后面所有名字参量都被看作数据库名。
//mysqldump -uroot -p --databases test mysql
--debug
输出debug信息,用于调试。默认值为:d:t:o,/tmp/mysqldump.trace
//mysqldump -uroot -p --all-databases --debug
//mysqldump -uroot -p --all-databases --debug=” d:t:o,/tmp/debug.trace”
--debug-check
检查内存和打开文件使用说明并退出。
//mysqldump -uroot -p --all-databases --debug-check
--debug-info
输出调试信息并退出
//mysqldump -uroot -p --all-databases --debug-info
--default-character-set
设置默认字符集,默认值为utf8
//mysqldump -uroot -p --all-databases --default-character-set=latin1
--delete-master-logs
master备份后删除日志. 这个参数将自动激活--master-data。
//mysqldump -uroot -p --all-databases --delete-master-logs
--dump-slave
该选项将导致主的binlog位置和文件名追加到导出数据的文件中。设置为1时,将会以CHANGE MASTER命令输出到数据文件;设置为2时,在命令前增加说明信息。该选项将会打开--lock-all-tables,除非--single-transaction被指定。该选项会自动关闭--lock-tables选项。默认值为0。
//mysqldump -uroot -p --all-databases --dump-slave=1
//mysqldump -uroot -p --all-databases --dump-slave=2
--events, -E
导出事件。
//mysqldump -uroot -p --all-databases --events
--flush-logs
开始导出之前刷新日志。
请注意:假如一次导出多个数据库(使用选项--databases或者--all-databases),将会逐个数据库刷新日志。除使用--lock-all-tables或者--master-data外。在这种情况下,日志将会被刷新一次,相应的所以表同时被锁定。因此,如果打算同时导出和刷新日志应该使用--lock-all-tables 或者--//master-data 和--flush-logs。
//mysqldump -uroot -p --all-databases --flush-logs
--flush-privileges
在导出mysql数据库之后,发出一条FLUSH PRIVILEGES 语句。为了正确恢复,该选项应该用于导出mysql数据库和依赖mysql数据库数据的任何时候。
//mysqldump -uroot -p --all-databases --flush-privileges
--force
在导出过程中忽略出现的SQL错误。
//mysqldump -uroot -p --all-databases --force
--help
显示帮助信息并退出。
mysqldump --help
--hex-blob
使用十六进制格式导出二进制字符串字段。如果有二进制数据就必须使用该选项。影响到的字段类型有BINARY、VARBINARY、BLOB。
//mysqldump -uroot -p --all-databases --hex-blob
--host, -h
需要导出的主机信息
//mysqldump -uroot -p --host=localhost --all-databases
--ignore-table
不导出指定表。指定忽略多个表时,需要重复多次,每次一个表。每个表必须同时指定数据库和表名。例如:--ignore-table=database.table1 --ignore-table=database.table2 ……
//mysqldump -uroot -p --host=localhost --all-databases --ignore-table=mysql.user
--include-master-host-port
在--dump-slave产生的'CHANGE MASTER TO..'语句中增加'MASTER_HOST=,MASTER_PORT='
//mysqldump -uroot -p --host=localhost --all-databases --include-master-host-port
--lock-all-tables, -x
提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,并且自动关闭--single-transaction 和--lock-tables 选项。
//mysqldump -uroot -p --host=localhost --all-databases --lock-all-tables
--lock-tables, -l
开始导出前,锁定所有表。用READ LOCAL锁定表以允许MyISAM表并行插入。对于支持事务的表例如InnoDB和BDB,--single-transaction是一个更好的选择,因为它根本不需要锁定表。
请注意当导出多个数据库时,--lock-tables分别为每个数据库锁定表。因此,该选项不能保证导出文件中的表在数据库之间的逻辑一致性。不同数据库表的导出状态可以完全不同。
//mysqldump -uroot -p --host=localhost --all-databases --lock-tables
--log-error
附加警告和错误信息到给定文件
//mysqldump -uroot -p --host=localhost --all-databases --log-error=/tmp/mysqldump_error_log.err
--master-data
该选项将binlog的位置和文件名追加到输出文件中。如果为1,将会输出CHANGE MASTER 命令;如果为2,输出的CHANGE MASTER命令前添加注释信息。该选项将打开--lock-all-tables 选项,除非--single-transaction也被指定(在这种情况下,全局读锁在开始导出时获得很短的时间;其他内容参考下面的--single-transaction选项)。该选项自动关闭--lock-tables选项。
//mysqldump -uroot -p --host=localhost --all-databases --master-data=1;
//mysqldump -uroot -p --host=localhost --all-databases --master-data=2;
//mysqldump -uroot -p --host=localhost --all-databases --net_buffer_length=1024
--no-data, -d
不导出任何数据,只导出数据库表结构。
//mysqldump -uroot -p --host=localhost --all-databases --no-data
--password, -p
连接数据库密码,使用命名管道连接mysql
//mysqldump -uroot -p --host=localhost --all-databases --pipe
--port, -P
连接数据库端口号
--result-file, -r
直接输出到指定文件中。该选项应该用在使用回车换行对(\\r\\n)换行的系统上(例如:DOS,Windows)。该选项确保只有一行被使用。
//mysqldump -uroot -p --host=localhost --all-databases --result-file=/tmp/mysqldump_result_file.txt
--routines, -R
导出存储过程以及自定义函数。
//mysqldump -uroot -p --host=localhost --all-databases --routines
--single-transaction
该选项在导出数据之前提交一个BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于InnoDB存储引擎。本选项和--lock-tables 选项是互斥的,因为LOCK TABLES 会使任何挂起的事务隐含提交。要想导出大表的话,应结合使用--quick 选项。
//mysqldump -uroot -p --host=localhost --all-databases --single-transaction
--socket,-S
指定连接mysql的socket文件位置,默认路径/tmp/mysql.sock
//mysqldump -uroot -p --host=localhost --all-databases --socket=/tmp/mysqld.sock
--tables
覆盖--databases (-B)参数,指定需要导出的表名。
//mysqldump -uroot -p --host=localhost --databases test --tables test
--user, -u
指定连接的用户名。
--xml, -X
导出XML格式.
//mysqldump -uroot -p --host=localhost --all-databases --xml


   3、以下图数据库为例

mysql之mysqldump 、lvm-snapshot、 xtrabackup的备份_第1张图片

   开启二进制日志文件,用于日志备份与恢复

[root@localhost ~]# vim /etc/my.cnf
//开启二进制文件并指定存放路径
log_bin=/data/mydata/logbin/


mysql之mysqldump 、lvm-snapshot、 xtrabackup的备份_第2张图片


   示例1:部分备份和完全备份

       ①、使用mysqldump分别备份hellodb数据库和所有数据库

//备份hellodb数据库
[root@localhost ~]# mysqldump -u root -h localhost -p --database hellodb --lock-all-tables --flush-logs --master-data=2 > /tmp/2014-4.sql
Enter password:
[root@localhost ~]# ls /tmp/
2014-4.sql  log_bin.000001  log_bin.000002  log_bin.index
//下面备份所有数据库
[root@localhost ~]# mysqldump -u root -h localhost -p --all-databases --lock-all-tables --flush-logs --master-data=2 > /tmp/2014-4-all.sql
Enter password:
-- Warning: Skipping the data of table mysql.event. Specify the --events option explicitly.
[root@localhost ~]# ls /tmp/  
2014-4-all.sql  log_bin.000001  log_bin.000003
2014-4.sql      log_bin.000002  log_bin.index
//tmp下生成了备份的sql和二进制日志文件


       ②、删除数据库hellodb并恢复

mysql> DROP database hellodb;    //删除数据库
Query OK, 7 rows affected (0.03 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| da_test            |
| mydb               |
| mysql              |
+--------------------+
[root@localhost ~]# mysql -u root -p < /tmp/2014-4.sql    //恢复数据库
Enter password:
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| da_test            |
| hellodb            |
| mydb               |
| mysql              |
+--------------------+


       ③、全部数据库的删除与恢复步骤同上


   示例2、增量备份与恢复

       以数据库da_test为例


    ①、先将数据库da_test备份

[root@localhost ~]# mysqldump -u root -p --database da_test --lock-all-tables --flush-logs --master-data=2 > /tmp/da_test.sql
Enter password:
[root@localhost ~]# ls /tmp/
2014-4-all.sql  da_test.sql     log_bin.000002  log_bin.000004
2014-4.sql      log_bin.000001  log_bin.000003  log_bin.index


    ②、在数据库da_test下test表中插入2条新的内容,并删除数据库da_test

mysql> INSERT INTO test values(8,'jerry',4,'Female','test for logbin',19);
mysql> INSERT INTO test values(9,'cat',5,'Female','test for logbin',11);
mysql> select * from test;
+-----+--------------+-------+--------+------------------------+-----+
| TID | Name         | Class | Gender | Course                 | Age |
+-----+--------------+-------+--------+------------------------+-----+
|   1| Ling Huchong |     1| Male   | Hamogong               |  24|
|   2| Huang Rong   |     2| Female | Chilian Sehnzhang      |  19|
|   3| Lu Wushuang  |     2| Female | Jiuyang Shenzhang      |  18|
|   4| Zhu Ziliu    |     3| Male   | Pixie Jianfa           |  52|
|   5| Chen Jialuo  |     1| Male   | Xianglong Shiba Zhang  |  22|
|   6| OU Yangfeng  |     3| Male   | Shengxiang Bannuo Gong |  70|
|   7| tom          |     1| Male   | NULL                   |  11|
|   8| jerry        |     4| Female | test forlogbin        |  19|
|   9| cat          |     5| Female | test forlogbin        |  11|
+-----+--------------+-------+--------+------------------------+-----+
mysql> DROP DATABASE da_test;    //删除da_test
Query OK, 3 rows affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |
| mydb               |
| mysql              |


     ③、查看二进制文件进行增量备份

           先查看现在操作在二进制文件中记录的位置

mysql> SHOW MASTER STATUS;
+----------------+----------+--------------+------------------+
| File           | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------+----------+--------------+------------------+
| log_bin.000004 |     3485 |              |                  |
+----------------+----------+--------------+------------------+
1 row in set (0.00 sec)

       查看日志:

mysqlbinlog --stop-position=3485 /tmp/log_bin.000004

mysql之mysqldump 、lvm-snapshot、 xtrabackup的备份_第3张图片

   从上图可以看到,使用--stop-position=3485,最后面的几行就是我们的增量操作,新插入到test表中的两条信息。

       ④、进行增量备份

[root@localhost ~]# mysqlbinlog --start-position=3223 --stop-position=3485 /tmp/log_bin.000004 > /tmp/insert.sql
[root@localhost ~]# ls /tmp/
2014-4-all.sql  2014-4.sql  da_test.sql  insert.sql  log_bin.000001  log_bin.000002  log_bin.000003  log_bin.000004  log_bin.000005  log_bin.index


       ⑤、恢复增量备份

//先恢复增量备份之前备份的数据库da_test
[root@localhost ~]# mysql -u root -p < /tmp/da_test.sql  
mysql> use da_test;
mysql> select * from test;
+-----+--------------+-------+--------+------------------------+-----+
| TID | Name         | Class | Gender | Course                 | Age |
+-----+--------------+-------+--------+------------------------+-----+
|   1 | Ling Huchong |     1 | Male   | Hamogong               |  24 |
|   2 | Huang Rong   |     2 | Female | Chilian Sehnzhang      |  19 |
|   3 | Lu Wushuang  |     2 | Female | Jiuyang Shenzhang      |  18 |
|   4 | Zhu Ziliu    |     3 | Male   | Pixie Jianfa           |  52 |
|   5 | Chen Jialuo  |     1 | Male   | Xianglong Shiba Zhang  |  22 |
|   6 | OU Yangfeng  |     3 | Male   | Shengxiang Bannuo Gong |  70 |
|   7 | tom          |     1 | Male   | NULL                   |  11 |
+-----+--------------+-------+--------+------------------------+-----+


//再恢复增量备份
[root@localhost ~]# mysql -u root -p < /tmp/insert.sql  
Enter password:
mysql> select * from test;
+-----+--------------+-------+--------+------------------------+-----+
| TID | Name         | Class | Gender | Course                 | Age |
+-----+--------------+-------+--------+------------------------+-----+
|   1 | Ling Huchong |     1 | Male   | Hamogong               |  24 |
|   2 | Huang Rong   |     2 | Female | Chilian Sehnzhang      |  19 |
|   3 | Lu Wushuang  |     2 | Female | Jiuyang Shenzhang      |  18 |
|   4 | Zhu Ziliu    |     3 | Male   | Pixie Jianfa           |  52 |
|   5 | Chen Jialuo  |     1 | Male   | Xianglong Shiba Zhang  |  22 |
|   6 | OU Yangfeng  |     3 | Male   | Shengxiang Bannuo Gong |  70 |
|   7 | tom          |     1 | Male   | NULL                   |  11 |
|   8 | jerry        |     4 | Female | test for logbin        |  19 |
|   9 | cat          |     5 | Female | test for logbin        |  11 |
+-----+--------------+-------+--------+------------------------+-----+



三、使用LVM逻辑卷快照对MySQL进行备份与恢复

    前提及注意事项:        

事务日志跟数据文件必须在同一个卷上;
创建快照卷之前,要请求MySQL的全局锁;在快照创建完成之后释放锁;
请求全局锁完成之后,做一次日志滚动;做二进制日志文件及位置标记(手动进行);
日志文件与数据库目录不在同一目录下


   1、请求全局锁,并滚动日志

mysql> flush tables with read lock;
mysql> flush logs;


   2、进行位置标记

[root@localhost data]# mysql -e "show master status;" > /data/mydata/binlog/position.txt
[root@localhost data]# cat /data/mydata/binlog/position.txt
File    Position    Binlog_Do_DB    Binlog_Ignore_DB
log_bin.000026  106


  3、创建快照并释放全局锁

[root@localhost mydata]# lvcreate -L 1G -s -n mydata-snap -p r /dev/mydata/mylv
  Logical volume "mydata-snap" created
mysql> unlock tables;    //释放全局锁
Query OK, 0 rows affected (0.00 sec)


   4、创建快照并备份

[root@localhost ~]# mount /dev/mydata/mydata-snap /mnt/ -o ro    //以只读模式挂载快照
[root@localhost ~]# mkdir -pv /backup/2014-04-20    //创建备份目录
[root@localhost ~]# cp -a /mnt/* /backup/2014-04-20/    //将快照内容拷进备份目录
[root@localhost ~]# umount /mnt    //卸载快照
[root@localhost ~]# lvremove /dev/mydata/mydata-snap    //删除快照


   5、恢复数据

       前提:将数据库databases全部删掉

   mysql之mysqldump 、lvm-snapshot、 xtrabackup的备份_第4张图片

       ①、提取备份之后的所有事件至某sql脚本中

[root@localhost ~]# mysqlbinlog --start-position=106 /data/mydata/binlog/log_bin.000020 > /data/mydata/binlog/backAfter.txt


       ②、还原数据,修改权限及属主属组等,并启动mysql

[root@localhost data]# cp -a /backup/2014-04-20/* /data/mydata/data/
[root@localhost data]# chown -R mysql.mysql /data/

   mysql之mysqldump 、lvm-snapshot、 xtrabackup的备份_第5张图片


       ③、及时点还原

mysql> set session sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)
mysql> source /data/mydata/binlog/backAfter.txt
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> set session sql_log_bin=1;



四、使用Xtrabackup对MySQL进行备份与恢复

       PS:Xtrabackup只能在MYSQL5.6以上版本用哦,为此,我装了个MariaDB来演示本次实验

mysql之mysqldump 、lvm-snapshot、 xtrabackup的备份_第6张图片

   

   1、安装Xtrabackup

     下载:percona-xtrabackup-2.1.8-733.rhel6.x86_64.rpm

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


   2、创建一个最小权限的用户进行备份

MariaDB [(none)]> create user 'backup'@'localhost' identified by 'backup';
MariaDB [(none)]> revoke all privileges,grant option from 'backup'@'localhost';
MariaDB [(none)]> grant reload,lock tables,replication client on *.* to 'backup'@'localhost';
MariaDB [(none)]> flush privileges;

   3、完全备份

[root@localhost ~]# innobackupex --user=backup --password=backup /backup
...
...
...
innobackupex: Backup created in directory '/backup/2014-04-20_18-30-30'
innobackupex: MySQL binlog position: filename 'mysql-bin.000001', position 546472
140420 18:30:39  innobackupex: Connection to database server closed
140420 18:30:39  innobackupex: completed OK!


       注意:    

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

innobackupex --apply-log /backup/2014-04-20_18-30-30/
...
...
...
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: FTS optimize thread exiting.
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 1673750
140420 18:37:01  innobackupex: completed OK!


   4、恢复数据

       注意:恢复不用启动MySQ

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

      先删除database;

//我是移到/tmp/mydata/
[root@localhost mydata]# mv /data/mydata/* /tmp/mydata/

       恢复数据:

[root@localhost mydata]# innobackupex --copy-back /backup/2014-04-20_18-30-30/
...
...
...
innobackupex: Starting to copy InnoDB log files
innobackupex: in '/backup/2014-04-20_18-30-30'
innobackupex: back to original InnoDB log directory '/data/mydata'
innobackupex: Copying '/backup/2014-04-20_18-30-30/ib_logfile0' to '/data/mydata/ib_logfile0'
innobackupex: Copying '/backup/2014-04-20_18-30-30/ib_logfile1' to '/data/mydata/ib_logfile1'
innobackupex: Finished copying back files.
140420 19:01:55  innobackupex: completed OK!

//别忘了改权限
[root@localhost mydata]# chown -R mysql.mysql /data/mydata/

mysql之mysqldump 、lvm-snapshot、 xtrabackup的备份_第7张图片


   5、innobackupex增量备份

命令:
innobackupex --incremental /backup --incremental-basedir=BASEDIR
BASEDIR:指的是完全备份所在的目录,此命令执行结束后,innobackupex命令
会在/backup目录中创建一个新的以时间命名的目录以存放所有的增量备份数据。另外,在执行过增量备份之后再一次进行增量备份时,
其--incremental-basedir应该指向上一次的增量备份所在的目录。
需要注意的是,增量备份仅能应用于InnoDB或XtraDB表,
对于MyISAM表而言,执行增量备份时其实进行的是完全备份。

增量备份与整理完全备份有着一些不同,尤其要注意的是:
(1)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”。“重放”之后,所有的备份数据将合并到完全备份上。
(2)基于所有的备份将未提交的事务进行“回滚”。


  具体备份与恢复操作:

       插入两条新的语句

INSERT INTO test values(8,'jerry',4,'Female','test for logbin',19);
mysql> INSERT INTO test values(9,'cat',5,'Female','test for logbin',11);

       备份:

//根据前面的完全备份,生成新的增量备份目录2014-04-20_19-46-52
[root@localhost mydata]# innobackupex --incremental /backup --incremental-basedir=/backup/2014-04-20_18-30-30/
[root@localhost mydata]# ls /backup/
2014-04-20_18-30-30  2014-04-20_19-46-52
//
//再做新的增量备份,生成2014-04-20_19-49-35
[root@localhost mydata]# innobackupex --incremental /backup --incremental-basedir=/backup/2014-04-20_18-30-30
[root@localhost mydata]# ls /backup/
2014-04-20_18-30-30  2014-04-20_19-46-52  2014-04-20_19-49-35

       将增量备份合并到完整备份中:

[root@localhost mydata]# innobackupex --apply-log --redo-only /backup/2014-04-20_18-30-30/
//
//将2014-04-20_19-46-52合并到完整备份中
[root@localhost mydata]# innobackupex --apply-log --redo-only /backup/2014-04-20_18-30-30/ --incremental-dir=/backup/2014-04-20_19-46-52/
//
//将2014-04-20_19-49-35合并到完整备份中
[root@localhost mydata]# innobackupex --apply-log --redo-only /backup/2014-04-20_18-30-30/ --incremental-dir=/backup/2014-04-20_19-49-35/


       删除/data/mydata下数据,然后恢复

[root@localhost mydata]# rm -rf /tmp/mydata/*
[root@localhost mydata]# mv /data/mydata/* /tmp/mydata/
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
[root@localhost mydata]# innobackupex --copy-back /backup/2014-04-20_18-30-30/
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| da_test            |
| hellodb            |
| information_schema |
| mydb               |
| mysql              |
| performance_schema |
| test               |
+--------------------+
MariaDB [(none)]> use da_test;
Database changed
MariaDB [da_test]> select * from test;    //增量信息也成功还原了
+-----+--------------+-------+--------+------------------------+-----+
| TID | Name         | Class | Gender | Course                 | Age |
+-----+--------------+-------+--------+------------------------+-----+
|   1 | Ling Huchong |     1 | Male   | Hamogong               |  24 |
|   2 | Huang Rong   |     2 | Female | Chilian Sehnzhang      |  19 |
|   3 | Lu Wushuang  |     2 | Female | Jiuyang Shenzhang      |  18 |
|   4 | Zhu Ziliu    |     3 | Male   | Pixie Jianfa           |  52 |
|   5 | Chen Jialuo  |     1 | Male   | Xianglong Shiba Zhang  |  22 |
|   6 | OU Yangfeng  |     3 | Male   | Shengxiang Bannuo Gong |  70 |
|   7 | tom          |     1 | Male   | NULL                   |  11 |
|   8 | jerry        |     4 | Female | test for logbin        |  19 |
|   9 | cat          |     5 | Female | test for logbin        |  11 |
+-----+--------------+-------+--------+------------------------+-----+


   6、Xtrabackup的“流”及“备份压缩”功能

Xtrabackup对备份的数据文件支持“流”功能,即可以将备份的数据通过
STDOUT传输给tar程序进行归档,而不是默认的直接保存至某备份目录中。
要使用此功能,仅需要使用--stream选项即可。如:

[root@localhost backup]# innobackupex --stream=tar  /backup/2014-04-20_18-30-30/ | gzip > /backup/`date +%F_%H-%M-%S`.tar.gz



五、备份策略


        1、将数据和备份放在不同的磁盘设备上;异机或异地备份存储较为理想;

        2、备份的数据应该周期性地进行还原测试;

        3、每次灾难恢复后都应该立即做一次完全备份;

        4、针对不同规模或级别的数据量,要定制好备份策略;

        5、二进制日志应该跟数据文件在不同磁盘上,并周期性地备份好二进制日志文件;


   从备份中恢复应该遵循步骤:

        1、停止MySQL服务器;

        2、记录服务器的配置和文件权限;

        3、将数据从备份移到MySQL数据目录;其执行方式依赖于工具;

        4、改变配置和文件权限;

        5、以限制访问模式重启服务器;mysqld的--skip-networking选项可跳过网络功能;

             方法:编辑my.cnf配置文件,添加如下项:

             skip-networking

             socket=/tmp/mysql-recovery.sock

        6、载入逻辑备份(如果有);而后检查和重放二进制日志;

        7、检查已经还原的数据;

        8、重新以完全访问模式重启服务器;

             注释前面在my.cnf中添加的选项,并重启;