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)
到此增量恢复完成