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