MySQL xtrabackup全量备份+增量备份+二进制日志恢复实战

全量备份与增量备份(注意每次备份from_lsn,to_lsn的值变化) 


 使用innobackupex进行增量备份,每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB表可以进行增量备份的基础,即innobackupex通过备份上次完全备份之后发生改变的页面来实现。在进行增量备份时,首先要进行一次全量备份,第一次增量备份是基于全备的,之后的增量备份都是基于上一次的增量备份的,以此类推。

需要注意的是,增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是完全备份。

做增量备份前,首先要进行一次全量备份。


全量备份:
[root@localhost ~]# innobackupex --user=root --password=root --no-timestamp --bakcup /backup/full

[root@localhost full]# cat xtrabackup_binlog_info
mysql-bin.000002	411
[root@localhost full]# cat xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 2635485
last_lsn = 2635494


全量备份之后,在次期间业务数据变化了,打个比方如下
mysql> insert into mytest values(1);
mysql> commit;

--------------------------------------------------------------------------------------

第一次增量备份 基于full的基础上在做增量备份
[root@localhost ~]#  innobackupex --user=root --password=root --no-timestamp --incremental-basedir=/backup/full --incremental /backup/inc1

[root@localhost backup]# cd inc1/
[root@localhost inc1]# cat xtrabackup_binlog_info
mysql-bin.000002	668
[root@localhost inc1]# cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 2635485
to_lsn = 2635839
last_lsn = 2635848



第一次增量备份之后,在次期间业务数据变化了,打个比方如下
mysql> insert into mytest values(2);
mysql> commit;

------------------------------------------------------------------------------------

第二次增量备份,第二次增量备份的是基于第一次增量备份的,所以目录需要修改为第一次增量备份的目录,这样相当于在第一次增量备份的基础上做了第二次增量备份
[root@localhost ~]#  innobackupex --user=root --password=root --no-timestamp --incremental-basedir=/backup/inc1 --incremental /backup/inc2


[root@localhost inc2]# cat xtrabackup_binlog_info
mysql-bin.000002	925
[root@localhost inc2]# cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 2635839
to_lsn = 2636177
last_lsn = 2636186



下面还会产生业务数据,这些数据就写在binlog里面了(binlog不能丢,丢了就恢复不到最近的状态了),恢复全量备份+两次增量备份+binlog恢复  这样就是完整的数据恢复
[root@localhost ~]# mkdir /binlog
[root@localhost ~]# cd /var/lib/mysql
[root@localhost mysql]# mv mysql-bin.* /binlog/
[root@localhost mysql]# ll /binlog/
total 12
-rw-r----- 1 mysql mysql 177 Jun 30 15:45 mysql-bin.000001
-rw-r----- 1 mysql mysql 925 Jun 30 15:49 mysql-bin.000002
-rw-r----- 1 mysql mysql  38 Jun 30 15:45 mysql-bin.index


删除数据库,这个时候不能跑路,应该对数据库进行恢复了,利用全备+2次增量备份+binlog
[root@localhost mysql]# rm -rf *

-----------------------------------------------------------------------------------------
全备
from_lsn = 0
to_lsn = 2635485

第一次增量备份
from_lsn = 2635485
to_lsn = 2635839

第二次增量备份
from_lsn = 2635839
to_lsn = 2636177

0----->2635485----->2635839----->2636177 你有没有发现一个规律,每次备份起始点是基于上一次备份的to_lsn的位置

mysql-bin.000002 411 全量--->mysql-bin.000002 668 第一次增量--->mysql-bin.000002	925 第二次增量

 

使用全量备份和增量备份进行恢复


[root@localhost mysql]# systemctl stop mysqld

基于全量的恢复  合并全备数据目录,确保数据的一致性
--redo-only只应用redo日志,不执行undo回滚未提交的数据,等最后一次增量备份合并完成后再进行应用undo日志回滚数据。
[root@localhost ~]# innobackupex --apply-log --use-memory=32m --redo-only /backup/full
[root@localhost ~]# ls /var/lib/mysql
ib_buffer_pool


[root@localhost backup]# cd full/
[root@localhost full]# cat xtrabackup_binlog_info
mysql-bin.000002	411
[root@localhost full]# cat xtrabackup_checkpoints
backup_type = log-applied   #可以看到全量恢复之后状态由full-backuped--> log-applied
from_lsn = 0
to_lsn = 2635485
last_lsn = 2635494


全量恢复0---->2635485
前面的全量备份和两次增量备份0----->2635485----->2635839----->2636177

-----------------------------------------------------------------------------------

第一次增量恢复  将增量备份数据合并到全备数据目录当中
[root@localhost ~]# innobackupex --apply-log --use-memory=32m --redo-only --incremental-dir=/backup/full/inc1 /backup/full
[root@localhost full]# cat xtrabackup_binlog_info
mysql-bin.000002	668
[root@localhost full]# cat xtrabackup_checkpoints
backup_type = log-applied
from_lsn = 0
to_lsn = 2635839
last_lsn = 2635848
全量恢复+第一次增量恢复0---->2635839
前面的全量备份和两次次增量备份 0----->2635485----->2635839----->2636177

----------------------------------------------------------------------------------------

第二次增量恢复  将增量备份数据合并到全备数据目录当中
[root@localhost ~]# innobackupex --apply-log --use-memory=32m  --incremental-dir=/backup/inc2 /backup/full

[root@localhost full]# cat xtrabackup_binlog_info
mysql-bin.000002	925
[root@localhost full]# cat xtrabackup_checkpoints
backup_type = full-prepared
from_lsn = 0
to_lsn = 2636177
last_lsn = 2636186
全量恢复+第一次增量恢复+第二次增量恢复 0------>2636177
前面的全量备份和两次增量备份 0----->2635485----->2635839----->2636177

 

恢复数据文件


[root@localhost ~]# rm -rf * /var/lib/mysql
[root@localhost ~]# innobackupex --copy-back /backup/full
[root@localhost ~]# ll /var/lib/mysql
total 122924
-rw-r----- 1 root root      302 Jun 30 16:03 ib_buffer_pool
-rw-r----- 1 root root 12582912 Jun 30 16:03 ibdata1
-rw-r----- 1 root root 50331648 Jun 30 16:03 ib_logfile0
-rw-r----- 1 root root 50331648 Jun 30 16:03 ib_logfile1
-rw-r----- 1 root root 12582912 Jun 30 16:03 ibtmp1
drwxr-x--- 2 root root     4096 Jun 30 16:03 mysql
drwxr-x--- 2 root root     8192 Jun 30 16:03 performance_schema
drwxr-x--- 2 root root     8192 Jun 30 16:03 sys
drwxr-x--- 2 root root       56 Jun 30 16:03 test
-rw-r----- 1 root root       21 Jun 30 16:03 xtrabackup_binlog_pos_innodb
-rw-r----- 1 root root      540 Jun 30 16:03 xtrabackup_info
-rw-r----- 1 root root        1 Jun 30 16:03 xtrabackup_master_key_id

[root@localhost ~]# chown -R mysql. /var/lib/mysql
[root@localhost ~]# systemctl start mysqld


这个时候恢复只是恢复到最后一次备份时候状态,还需要借助Binlog来恢复备份之后产生的数据

 

利用binlog恢复到数据库崩溃前状态


借助binlog进行恢复到最近的状态,从925位置开始恢复
[root@localhost backup]# cd inc2
[root@localhost inc2]# cat xtrabackup_binlog_info 
mysql-bin.000002	925


[root@localhost ~]# mysqlbinlog --start-position=925 /binlog/mysql-bin.000002 > inc.sql
[root@localhost ~]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.30-log MySQL Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> source inc.sql;
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.01 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.01 sec)

至此数据库恢复完毕到数据库崩溃前状态

 

 总结


(1)增量备份需要使用参数--incremental指定需要备份到哪个目录,使用incremental-dir指定全备目录;

(2)进行数据备份时,需要使用参数--apply-log redo-only先合并全备数据目录数据,确保全备数据目录数据的一致性;

(3)再将增量备份数据使用参数--incremental-dir合并到全备数据当中;

(4)最后通过最后的全备数据进行恢复数据,注意,如果有多个增量备份,需要逐一合并到全备数据当中,再进行恢复。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章