xtrabackup 备份与恢复

xtrabackup是Percona公司CTO Vadim参与开发的一款基于InnoDB的在线热备份工具,具有开源,免费,支持在线热备,备份恢复速度快,占用磁盘空间小等特点,并且支持不同情况下的多种备份形式

xtrabackup包含两个主要的工具,即xtrabackup和innobackupex,二者区别如下:
- xtrabackup只能备份innodb和xtradb两种引擎的表,而不能备份myisam引擎的表;
- innobackupex是一个封装了xtrabackup的Perl脚本,支持同时备份innodb和myisam,但在对myisam备份时需要加一个全局的读锁。还有就是myisam不支持增量备份。

2.备份过程

xtrabackup 备份与恢复_第1张图片

备份开始时首先会开启一个后台检测进程,实时检测mysql redo的变化,一旦发现redo中有新的日志写入,立刻将日志记
入后台日志文件xtrabackup_log中。之后复制innodb的数据文件和系统表空间文件ibdata1,待复制结束后,执行flush
tables with read lock操作
,复制.frm,MYI,MYD,等文件(执行flush tableswith read lock的目的是为了防止数据表发生
DDL操作,并且在这一时刻获得binlog的位置
)最后会发出unlock tables,把表设置为可读可写状态,最终停止
xtrabackup_log。

3.全备恢复
这一阶段会启动xtrabackup内嵌的innodb实例,回放xtrabackup日志xtrabackup_log,将提交的事务信息变更应用到
innodb数据/表空间,同时回滚未提交的事务(这一过程类似innodb的实例恢复)。恢复过程如下图:

xtrabackup 备份与恢复_第2张图片

4.增量备份
innobackupex增量备份过程中的"增量"处理,其实主要是相对innodb而言,对myisam和其他存储引擎而言,它仍然是全
拷贝(全备份)

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

xtrabackup 备份与恢复_第3张图片

5.增量备份恢复
和全备恢复类似,也需要两步,一是数据文件的恢复,如图4,这里的数据来源由3部分组成:全备份,增量备份和xtrabackup log。二是对未提交事务的回滚,如图5所示:

xtrabackup 备份与恢复_第4张图片

6.xtrabackup文件
backup-my.cnf
此文件包含了备份所需要的my.cnf的选项,如innodb_data_file_path ,innodb_log_file_in_group ,innodb_log_file_size等,
在恢复过程中innobackupex会依赖于该文件的选项
xtrabakcup_checkpoints
该文件记录备份的类型(full-backuped,incremental)备份状态以及备份信息的LSN信息,增量备份依赖于该信息
xtrabackup_binlog_info
该文件记录数据库备份的时候的二进制文件信息和位置,这是备份后数据库的位置,可以用来搭建主从
xtrabackup_logfile
该文件是--apply-log操作的时候,所需要的数据。如果该文件很大,则--apply-log需要的时间会比较长


7.备份恢复实验

场景1.全库备份全库恢复

(1).全备
innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --no-timestamp /u01/backup/`date +%H-%M`.dbname

(2).恢复全备
--关闭数据库
mysqladmin -uroot -p shutdown
--备份旧的数据目录
mv /u01/mysql-xxxx/data /u01/mysql-xxxx/data_bak && mkdir -p /u01/mysql-xxxx/data
--日志包含了redo以及undo的操作,应用过程类似与mysql hang机后的recovery操作,完成后备份处于一致性状态
innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log /u01/backup/23-04.dbname
--从备份目录拷贝数据,索引,日志到my.cnf文件里规定的初始位置
innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back /u01/backup/23-04.dbname
--更改权限
chown -R mysql:mysql /u01/mysql-xxxx/data   ---具体情况具体分析
--开启数据库
service mysql start
completed OK!
 

场景2.单数据库备份

(1).单库备份
innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --no-timestamp --databases=proddb /u01/backup/`date +%H-%M`.dbname
(2).恢复单库
--关闭数据库
mysqladmin -uroot -p shutdown

--innobackupex prepare部分表空间
innobackupex --defaults-file=/etc/my.cnf --no-timestamp --apply-log  --export --user root  /u01/backup/23-32.dbname

--恢复到一个新的数据库
mysql初始化
mysqld --defaults-file=/etc/my.cnf --initialize-insecure --basedir=/u01/mysql-xxxx --datadir=/u01/mysql-xxxx/data/test1 --user=root
关闭新的mysqld实例

恢复数据
cp -rf /u01/backup/23-32.dbname/* /u01/mysql-xxxx/data/test1/

修改权限
chown mysql:mysql -R /u01/mysql-xxxx/test1/

--开启数据库
service mysql start
completed OK!
 

场景3.增量备份恢复

(1).全备
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| wwj |
| wwj2 |
+--------------------+
6 rows in set (0.04 sec)

mysql> select * from wwj.t3;
+------+------+
| idt3 | idt4 |
+------+------+
| 3 | 30 |
| 6 | 60 |
| 5 | 500 |
+------+------+
3 rows in set (0.01 sec)

mysql> select * from wwj2.t1;
+----+------+
| id | name |
+----+------+
| 1 | gjb |
+----+------+
1 row in set (0.02 sec)

innobackupex --defaults-file=/etc/my5.7_3306.cnf --user=root --password=root --no-timestamp /mysql/backup/`date +%H-%M`.dbname

(2).增量备份1
insert into wwj.t3 values(7,70);
insert into wwj2.t1 values(null,'haha2');

innobackupex --defaults-file=/etc/my5.7_3306.cnf --user=root --password=root --no-timestamp --incremental-basedir=/mysql/backup/09-39.dbname --incremental /mysql/backup/`date +%H-%M`.dbname.incr

(3).增量备份2
insert into wwj.t3 values(8,80);
insert into wwj2.t1 values(null,'haha33');

innobackupex --defaults-file=/etc/my5.7_3306.cnf --user=root --password=root --no-timestamp --incremental-basedir=/mysql/backup/10-29.dbname.incr --incremental /mysql/backup/`date +%H-%M`.dbname.incr

(4).查看checkpoint
backup_type = full-backuped
from_lsn = 0
to_lsn = 2499663
last_lsn = 2499672
compact = 0
recover_binlog_info = 0
------------------------------
backup_type = incremental
from_lsn = 2499663
to_lsn = 2500376
last_lsn = 2500385
compact = 0
recover_binlog_info = 0
------------------------------
backup_type = incremental
from_lsn = 2500376
to_lsn = 2501066
last_lsn = 2501075
compact = 0
recover_binlog_info = 0

(5).继续执行事务
insert into wwj.t3 values(9,90);
insert into wwj.t3 values(10,100);
insert into wwj.t3 values(11,110);

(6).恢复前合并全备和增量目录
innobackupex --defaults-file=/etc/my5.7_3306.cnf --user=root --apply-log --redo-only /mysql/backup/09-39.dbname
innobackupex --defaults-file=/etc/my5.7_3306.cnf --user=root --apply-log --redo-only /mysql/backup/09-39.dbname --incremental-dir=/mysql/backup/10-29.dbname.incr
innobackupex --defaults-file=/etc/my5.7_3306.cnf --user=root --apply-log --redo-only /mysql/backup/09-39.dbname --incremental-dir=/mysql/backup/10-37.dbname.incr
合并后结果
backup_type = log-applied
from_lsn = 0
to_lsn = 2501066
last_lsn = 2501075
compact = 0
recover_binlog_info = 0

(7).再次准备
innobackupex --defaults-file=/etc/my5.7_3306.cnf --user=root --apply-log /mysql/backup/09-39.dbname

(8).关闭数据库
/usr/local/mysql/bin/mysqladmin -S /tmp/mysql3306.sock shutdown -p

(9).删除数据库
(10).恢复
innobackupex --defaults-file=/etc/my5.7_3306.cnf --user=root --copy-back /mysql/backup/09-39.dbname

(11).启动数据库
/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my5.7_3306.cnf --user=mysql &

 

 

 

 

 

 

 

你可能感兴趣的:(Mysql,管理总结)