使用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,如需转载请自行联系原作者