使用Xtrabackup备份工具

         使用Xtrabackup备份工具


MySQL自带工具的缺点

1.mysqldump效率比较低,备份和还原的速度都很慢,任何数据插入和更新操作都会被挂起


2.mysqlhotcopy  mysqlhotcopy 是专门针对myisam 数据表进行备份,备份的过程中,任何数据插入和更新操作都会被挂起


xtrabackup 是 percona 的一个开源项目

可以热备份innodb ,XtraDB,MyISAM

主要包括两个工具

xtrabackup、innobackupex

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

innobackupex则封装了xtrabackup,是一个脚本封装,能同时备份innodb和myisam


xtrabackup做完整备份 增量 差异

         恢复



os             Red Hat Enterprise Linux Server release 6.4 (Santiago)

mysql-server   MySQL-server-5.6.15-1.el6.x86_64

xtrbackup      percona-xtrabackup-2.1.6-702.rhel6.x86_64.rpm





percona-xtrabackup 软件提供2个备份命令


/usr/bin/xtrabackup_55  ->  备份 MySQL-server-5.5

/usr/bin/xtrabackup_56  ->  备份 MySQL-server-5.6


xtrabackup_56 备份命令常用选项

注意: xtrabackup只能对innodb表 和 XtraDB表做备份,且只能备份表中的数据,不能备份表结构,所有用xtrabackup进行数据恢复时 表一定要存在。


--datadir=/var/lib/mysql   指定数据库目录

--backup  备份数据

--prepare 恢复数据

--target-dir  指定数据备份目录  

--incremental-basedir  指定对哪个数据备份目录做增量备份

--incremental-dir  指定用哪个增量备份目录做数据恢复



一、用xtrabackup 做完整备份

1、[root@localhost ~]# mysql -uroot -p123


2、mysql> create database  test10;


3、mysql> create table test10.a(id int)engine=innodb;


4、mysql> insert into test10.a values(10),(10),(10),(10),(10);


5、创建存放完整备份文件的目录

[root@localhost ~]# mkdir  /databasedir/first -p


6、对服务器上的所有库做完整备份(xtrabackup_56命令没有对某个库做完整备份的选项)

[root@localhost ~]# xtrabackup_56  --datadir=/var/lib/mysql/ --backup  --target-dir=/databasedir/first



二、模拟数据丢失,用完整备份文件恢复数据


1、mysql> delete from   test10.a;


2、用完整备份文件恢复数据

[root@localhost ~]# xtrabackup_56  --prepare  --target-dir=/databasedir/first/

[root@localhost ~]# cp /databasedir/first/test10/* /var/lib/mysql/test10/

cp: overwrite `/var/lib/mysql/test10/a.ibd'? y

[root@localhost ~]#


3、mysql> quit;


4、重启数据库服务//重启之后数据库才能重新加载日志文件,才能备份成功

[root@localhost ~]#

[root@localhost ~]# service  mysql  restart

Shutting down MySQL.. SUCCESS!

Starting MySQL... SUCCESS!

[root@localhost ~]#



5、

[root@localhost ~]# mysql -uroot -p123

mysql> select * from test10.a;

+------+

| id   |

+------+

|   10 |

|   10 |

|   10 |

|   10 |

|   10 |

+------+

5 rows in set (0.00 sec)


mysql>



这样xtrabackup做数据的完整备份与完整恢复就完成了。



三、用xtrabackup做数据的增量备份


1、向test10下的a表插入新的记录条目

mysql> insert into test10.a values(80),(80),(80),(80),(80);


2、创建存放新的记录备份文件的目录

[root@localhost ~]# mkdir  /databasedir/two


3、用xtrabackup做数据的增量备份

[root@localhost ~]# xtrabackup_56  --datadir=/var/lib/mysql/  --backup  --incremental-basedir=/databasedir/first/  --target-dir=/databasedir/two


4、第二次向test10下的a表插入新的记录条目


mysql> insert into test10.a values(300),(300),(300),(300),(300);


5、创建存放新的记录备份文件的目录

[root@localhost ~]# mkdir /databasedir/three


6、用xtrabackup做数据的增量备份


[root@localhost ~]# xtrabackup_56  --datadir=/var/lib/mysql/  --backup  --incremental-basedir=/databasedir/two/  --target-dir=/databasedir/three



四、用完整备份+增量备份恢复数据

1、模拟数据丢失

mysql> delete from test10.a;


2、用备份文件恢复数据

[root@localhost ~]# xtrabackup_56 --prepare --target-dir=/databasedir/first/

[root@localhost ~]# xtrabackup_56 --prepare --target-dir=/databasedir/first --incremental-dir=/databasedir/two/

[root@localhost ~]# xtrabackup_56 --prepare --target-dir=/databasedir/first --incremental-dir=/databasedir/three/


3、把恢复后的数据拷贝到test10数据库目录下

[root@localhost ~]# cp /databasedir/first/test10/* /var/lib/mysql/test10/



4、重启数据库服务

[root@localhost ~]#

[root@localhost ~]# service  mysql  restart

Shutting down MySQL.. SUCCESS!

Starting MySQL... SUCCESS!

[root@localhost ~]#



5、

[root@localhost ~]# mysql -uroot -p123

mysql> select * from test10.a;

+------+

| id   |

+------+

|   10 |

|   10 |

|   10 |

|   10 |

|   10 |

|   80 |

|   80 |

|   80 |

|   80 |

|   80 |

|  300 |

|  300 |

|  300 |

|  300 |

|  300 |

+------+

15 rows in set (0.00 sec)


mysql>



这样完整备份+增量备份恢复数据ok了。



做完实验之后查看一下各自目录下的日志文件和check_point文件


xtrabackup工作原理


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保持数据的一致。


  C、Xtrabackup备份原理


  XtraBackup基于InnoDB的crash-recovery功能。它会复制innodb的data file,由于不锁表,复制出来的数据是不一致的,在恢复的时候使用crash-recovery,使得数据恢复一致。


  InnoDB维护了一个redo log,又称为transaction log,事务日志,它包含了innodb数据的所有改动情况。当InnoDB启动的时候,它会先去检查data file和transaction log,并且会做二步操作:


  XtraBackup在备份的时候, 一页一页地复制innodb的数据,而且不锁定表,与此同时,XtraBackup还有另外一个线程监视着transactions log,一旦log发生变化,就把变化过的log pages复制走。为什么要急着复制走呢? 因为transactions log文件大小有限,写满之后,就会从头再开始写,所以新数据可能会覆盖到旧的数据。


  在prepare过程中,XtraBackup使用复制到的transactions log对备份出来的innodb data file进行crash recovery。




      本文转自Jx战壕  51CTO博客,原文链接:http://blog.51cto.com/xujpxm/1386298,如需转载请自行联系原作者


上一篇:SAP UI5 视图如何使用工程里的 sample data 作为 JSON model 的数据源


下一篇:关于Db4o的查询测试及疑惑