使用xtrabackup对Mysql备份恢复

  1. 云栖社区>
  2. 博客>
  3. 正文

使用xtrabackup对Mysql备份恢复

白海生 2017-10-17 23:54:08 浏览1288
备份原理:XtraBackup基于InnoDB的crash-recovery功能。它会复制innodb的data file,由于不锁表,复制出来的数据是不一致的,在恢复的时候使用crash-recovery,使得数据恢复一致。InnoDB维护了一个redo log,又称为transaction log,事务日志,它包含了innodb数据的所有改动情况。XtraBackup在备份的时候, 一页一页地复制innodb的数据,而且不锁定表,与此同时,XtraBackup还有另外一个线程监视着transactions log,一旦log发生变化,就把变化过的log pages复制走
增量备份的原理:在完整备份和增量备份文件中都有一个文件xtrabackup_checkpoint会记录备份完成时的检查点lsn,在进行新的增量备份时,xtrabackup会比较表空间中每页的lsn是否大于上次备份完成的lsn,若果是,则备份该页,并记录当前检查点lsn

恢复原理:使用备份文件进行恢复是基于:InnoDB启动时会先去检查data file和transaction log,查看两者的一致性,然后进行crash recovery


一、全备恢复过程

1、全备
./innobackupex  --defaults-file=/etc/my.cnf  --no-timestamp --user root --socket=/var/lib/mysql/mysql.sock --password root /work/bak/all-20170607-bak

171018 23:19:41 Backup created in directory '/work/bak/all-20170607-bak/'
MySQL binlog position: filename 'binlog.000003', position '154'
171018 23:19:41 [00] Writing /work/bak/all-20170607-bak/backup-my.cnf
171018 23:19:41 [00]        ...done
171018 23:19:41 [00] Writing /work/bak/all-20170607-bak/xtrabackup_info
171018 23:19:41 [00]        ...done
xtrabackup: Transaction log of lsn (2561401) to (2561410) was copied.
171018 23:19:41 completed OK!


备份目录下相关文件

[root@ttt all-20170607-bak]# ll
total 12336
-rw-r-----. 1 root root      426 Oct 18 23:19 backup-my.cnf
drwxr-x---. 2 root root     4096 Oct 18 23:19 bhs
-rw-r-----. 1 root root      306 Oct 18 23:19 ib_buffer_pool
-rw-r-----. 1 root root 12582912 Oct 18 23:19 ibdata1
drwxr-x---. 2 root root     4096 Oct 18 23:19 mysql
drwxr-x---. 2 root root     4096 Oct 18 23:19 performance_schema
drwxr-x---. 2 root root    12288 Oct 18 23:19 sys
-rw-r-----. 1 root root       18 Oct 18 23:19 xtrabackup_binlog_info
-rw-r-----. 1 root root      113 Oct 18 23:19 xtrabackup_checkpoints
-rw-r-----. 1 root root      562 Oct 18 23:19 xtrabackup_info
-rw-r-----. 1 root root     2560 Oct 18 23:19 xtrabackup_logfile
[root@ttt all-20170607-bak]# more xtrabackup_binlog_info
binlog.000003 154
[root@ttt all-20170607-bak]# 
[root@ttt all-20170607-bak]# more xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 2561401
last_lsn = 2561410
compact = 0
recover_binlog_info = 0

模拟删除库bhs下的test表


--no-timestamp 自定义备份文件名字,若不加会自动命名


2、恢复
./innobackupex  --defaults-file=/etc/my.cnf --user root --socket=/var/lib/mysql/mysql.sock --password root  --apply-log /work/bak/all-20170607-bak

--apply-log恢复已提交的前滚,没提交回滚

InnoDB: 96 redo rollback segment(s) found. 1 redo rollback segment(s) are active.
InnoDB: 32 non-redo rollback segment(s) are active.
InnoDB: Waiting for purge to start
InnoDB: 5.7.13 started; log sequence number 2561557
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: FTS optimize thread exiting.
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 2561576
171018 23:39:21 completed OK!

3、到备份集目录下 cp -R * /mysql/

[root@ttt mysql]# ll
total 12
drwxr-x---.  6 root  root  4096 Oct 18 23:41 all-20170607-bak
drwxr-xr-x.  6 mysql mysql 4096 Oct 18 21:46 data
drwxr-xr-x. 10 mysql mysql 4096 Oct 11 15:05 mysql
[root@ttt mysql]# pwd
/mysql      

4、mysqladmin -u root -p shutdown   之后将之前的mysql的数据目录备份  mv data data.bak,然后将cp过来的备份集 mv  all-20170607-bak data,修改data的权限  
5、重启mysql,完成全备恢复

查看验证表test是否存在:存在
mysql> show tables;
+---------------+
| Tables_in_bhs |
+---------------+
| test          |
+---------------+
1 row in set (0.00 sec)



二、增量备份恢复

1、全备
./innobackupex --no-timestamp --defaults-file=/etc/my.cnf --user root --socket=/tmp/mysql.sock --password 12345 /mysql/mysql/data/bak/all-20150906-bak


2、插入数据,做一次增量备份

./innobackupex --no-timestamp --user root --socket=/tmp/mysql.sock --password --defaults-file=/etc/my.cnf --incremental--incremental-basedir=/data/all-20150906-bak  /data/xtrabackup/all-20150907-incr

--incremental-basedir=/data/all-20150906-bak 为全备份目录     /data/xtrabackup/all-20150907-incr为增量备份
3、继续插入数据,再做一次增量备份


./innobackupex --no-timestamp --user root --socket=/tmp/mysql.sock --password --defaults-file=/etc/my.cnf--incremental--incremental-basedir=/data/xtrabackup/all-20150907-incr /data/xtrabackup/all-20150908-incr

/data/xtrabackup/all-20150907-incr指向为上一次增量备份目录,/data/xtrabackup/all-20150908-incr指向为增量备份
4、将表删除测试恢复

5、
./innobackupex --user root --socket=/tmp/mysql.sock --password --defaults-file=/etc/my.cnf --apply-log --redo-only /data/xtrabackup/all-20150906-bak
-------------------------------redo-only只应用redo日志

将第一次增量备恢复到全备内
./innobackupex --user root --socket=/tmp/mysql.sock --password --defaults-file=/etc/my.cnf --apply-log --redo-only /data/xtrabackup/all-20150906-bak --incremental-dir=/data/xtrabackup/all-20150907-incr
将第二次增量备恢复到全备内
./innobackupex --user root --socket=/tmp/mysql.sock --password --defaults-file=/etc/my.cnf --apply-log --redo-only /data/xtrabackup/all-20150906-bak --incremental-dir=/data/xtrabackup/all-20150908-incr

最后一步
./innobackupex --user root --socket=/tmp/mysql.sock --password --defaults-file=/etc/my.cnf --apply-log /data/xtrabackup/all-20150906-bak


6、到备份集目录下 cp -R * /mysql/
关库mysqladmin -u root -p shutdown (底层copy-关不关都行)
将应用的mysql全备份  mv data data_bak
然后将cp过来的备份集 mv  all-20150903-bak data
之后改权限重启mysql       完成