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)最後通過最後的全備數據進行恢復數據,注意,如果有多個增量備份,需要逐一合併到全備數據當中,再進行恢復。

 

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