备份原理:XtraBackup基于InnoDB的crash-recovery功能。它会复制innodb的data file,由于不锁表,复制出来的数据是不一致的,在恢复的时候使用crash-recovery,使得数据恢复一致。InnoDB维护了一个redo log,又称为transaction log,事务日志,它包含了innodb数据的所有改动情况。XtraBackup在备份的时候, 一页一页地复制innodb的数据,而且不锁定表,与此同时,XtraBackup还有另外一个线程监视着transactions log,一旦log发生变化,就把变化过的log pages复制走
2、恢复
/data/xtrabackup/all-20150907-incr指向为上一次增量备份目录,/data/xtrabackup/all-20150908-incr指向为增量备份
4、将表删除测试恢复
增量备份的原理:在完整备份和增量备份文件中都有一个文件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
./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 --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
--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日志
-------------------------------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 完成
./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 完成