xtrabackup 全备、增量备份恢复


1、  xtrabackup原理

1 xtrabackup只能备份innodb和xtradb两种引擎的表,而不能备份myisam引擎的表;

2 innobackupex是一个封装了xtrabackup的Perl脚本,支持同时备份innodb和myisam,但在对myisam备份时需要加一个全局的读锁。还有就是myisam不支持增量备份。


(1)全备原理


1 首先会启动一个xtrabackup_log后台检测的进程,实时检测mysql redo的变化,一旦发现redo有新的日志写入,立刻将日志写入到日志文件xtrabackup_log
2 复制innodb的数据文件和系统表空间文件idbdata1到对应的以默认时间戳为备份目录的地方
3 复制结束后,执行flush table with read lock操作
4 复制.frm .myd .myi文件
5 并且在这一时刻获得binary log 的位置
6 将表进行解锁unlock tables
7 停止xtrabackup_log进程

全备恢复原理

全备+二进制日志的恢复

启动xtrabackup内嵌的innodb实例,将xtrabackup日志xtrabackup_Log进行回放,将提交的事务信息变更应用到innodb数据或表空间,同时回滚未提交的事务


(2)增量备份原理

增量备份主要是通过拷贝innodb中有变更的页(指的是LSN大于xtrabackup_checkpoints中的LSN号)。增量备份是基于全备的,第一次增量备份的数据是基于上一次全备,之后的每一次增量备份都是基于上一次的增量备份,最终达到一致性的增量备份,增量备份的过程中,和全备很类似,区别在于第二步


2、软件的安软
[root@dgt ~]# yum install libev-4.15-1.el6.rf.x86_64   rsync


[root@dgt ~]# rpm -ivh percona-xtrabackup-24-2.4.6-2.el6.x86_64.rpm 
warning: percona-xtrabackup-24-2.4.6-2.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
Preparing...                ########################################### [100%]
   1:percona-xtrabackup-24  ########################################### [100%]


创建备份用户
grant reload,lock tables, PROCESS ,replication client on *.* to 'backup'@'localhost' identified by 'Az.123456' ; 
flush privileges; 


grant PROCESS  on *.* to 'backup'@'localhost';


创建备份目录:
Mkdir   –p  /backup/full
Mkdir   -p  /backup/inc



全备数据库
(1)-创建全备
innobackupex --defaults-file=/etc/my.cnf --user=backup --password='Az.123456'  --socket=/var/lib/mysql/mysql.sock   /backup/

(2)模拟误删除
mysql> drop database test;



恢复数据库

(1)应用日志到全备上
/etc/init.d/mysqld stop
innobackupex --apply-log /backup/2017-04-11_18-43-29

(2)原库改名称
[root@dgt lib]# mv /var/lib/mysql  /var/lib/mysql_bak

(3) 全备文件恢复到目标数据库
innobackupex --defaults-file=/etc/my.cnf --copy-back --rsync /backup/2017-04-11_18-43-29


[root@dgt lib]# chown mysql.mysql mysql -R
 /etc/init.d/mysqld start




增量备份
(1)先做全备
innobackupex --defaults-file=/etc/my.cnf --user=backup --password='Az.123456'  --socket=/var/lib/mysql/mysql.sock   /backup/full

---查看检查点
[root@dgt 2017-04-12_10-18-59]# cat xtrabackup_checkpoints 
backup_type = full-backuped
from_lsn = 0
to_lsn = 274529749
last_lsn = 274529758
compact = 0
recover_binlog_info = 0

---做增量数据
mysql> create table t2(id int,name char(10));
mysql> insert into t2 values(1,'aaaa');
mysql> insert into t2 values(2,'cccc');

mysql> select * from t2;
+------+------+
| id   | name |
+------+------+
|    1 | aaaa |
|    2 | cccc |
+------+------+
2 rows in set (0.00 sec)

(2)增量备份 (第一次增量备份的目录/backup/inc/one,第一次备份的基础是全备)
innobackupex --defaults-file=/etc/my.cnf --user=backup --password='Az.123456' --socket=/var/lib/mysql/mysql.sock --incremental /backup/inc/one --incremental-basedir=/backup/full/2017-04-12_10-18-59  --parallel=2  --no-timestamp


[root@dgt one]# cat xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 274529749
to_lsn = 274532033
last_lsn = 274532042
compact = 0
recover_binlog_info = 0

mysql>  insert into t2 values(3,'ddd');
Query OK, 1 row affected (0.09 sec)


mysql>  insert into t2 values(4,'eeee');
Query OK, 1 row affected (0.06 sec)


(2)二次增量备份  (二次增量备份是在一次增量备份的基础上,所以--incremental-basedir 是前一次增量备份的目录/backup/inc/one)
innobackupex --defaults-file=/etc/my.cnf --user=backup --password='Az.123456' --socket=/var/lib/mysql/mysql.sock --incremental /backup/inc/two --incremental-basedir=/backup/inc/one  --parallel=2  --no-timestamp


[root@dgt two]# cat xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 274532033
to_lsn = 274534286
last_lsn = 274534295
compact = 0
recover_binlog_info = 0



增量备份的恢复需要有3个步骤
1 恢复完全备份
2 恢复增量备份到完全备份(开始恢复的增量备份要添加--redo-only参数,到最后一次增量备份要去掉--redo-only)
3 对整体的完全备份进行恢复,回滚未提交的数据


(1)恢复完全备份
恢复基础备份加--redo-only,该参数的意思是,只应用xtabackup日志中已经提交的数据,不回滚还未提交的数据
innobackupex --apply-log --redo-only /backup/full/2017-04-12_10-18-59


(2)将增量1应用到完全备份(将增量备份/backup/inc/one 应用到基础备份全备上)

 innobackupex --apply-log --redo-only  /backup/full/2017-04-12_10-18-59 --incremental-dir=/backup/inc/one

(3)如果有增量2,那么将增量2应用到完全备份
(将增量备份2应用到全备上,注意,这是最后一次增量备份恢复,所以要把redo-only参数去掉,回滚xtrabackup中未提交的数据)
innobackupex --apply-log /backup/full/2017-04-12_10-18-59 --incremental-dir=/backup/inc/two


(4)把所有合在一起的完全备份整体进行一次apply操作,回滚未提交的数据
innobackupex   --apply-log  /backup/full/2017-04-12_10-18-59  


service mysqld stop
mv  /var/lib/mysql   /var/lib/mysql_bak2

(5)把恢复完的备份复制到数据文件目录中,给权限,重启数据库
innobackupex --defaults-file=/etc/my.cnf --copy-back --rsync  /backup/full/2017-04-12_10-18-59  


chown -R mysql.mysql  /var/lib/mysql
service mysqld restart


mysql> select * From t2;
+------+------+
| id   | name |
+------+------+
|    1 | aaaa |
|    2 | cccc |
|    3 | ddd  |
|    4 | eeee |
+------+------+
4 rows in set (0.00 sec)

到此增量恢复完成

你可能感兴趣的:(mysql)