Xtrabackup原理-以及部署測試

Xtrabackup只使用InnoDB引擎,在InnoDB內部維護一個redo日誌文件,也就是事務日誌。該日誌會存儲每一個InnoDB表數據的修改記錄信息。當InnoDB啓動的時候,會檢查數據文件和事物日誌,同時會執行兩個步驟:
應用前滾已經提交的事物日誌到數據文件,同時將修改過但還沒有提交的數據進行回滾

Xtrabackup在啓動時就會記錄LSN,並且複製所有的數據文件。在複製的過程中,數據會有改動(新加或刪除等)。那將會是數據庫處於一個不同的時間點。 此時,xtrabackup會運行一個後臺進程,用來監控事物日誌,並不斷從事物日誌中複製最新的修改信息。xtrabackup是必須持續的做這個操作,是因爲事物日誌是會輪轉重複的寫入的,並且事物日誌可以被重複使用。所有xtrabackup在啓動的時候,就把事務日誌中修改的數據都記錄下來了。

Xtrabackup增量備份的原理
1.首先完成一個全備,並記錄此時檢查點LSN;
2.然後增量備份時,比較表空間中每個頁的LSN是不是大於上次備份的LSN,若是則備份改頁並記錄當時檢查點的LSN(日誌順序號)
增量備份
在InnoDB 中,每個page中都記錄着LSN-日誌順序號信息,每當數據產生變化,page的LSN就會自動增加,xtrabackupd的增量備份就是依據這一原理進行的。xtrabackup將上次備份以來LSN改變的page進行備份。給予這個原因 所以第一次要做全備,之後可以基於此進行增量備份以及恢復。
增量備份優點:
1.數據庫太大沒有足夠的空間全量備份,增量備份能有效節省空間,且效率高;
2.支持熱備份,備份換成不鎖表[針對InnoDB],不阻塞數據庫的讀寫;
3.每天只產生少量數據,也可採用遠程備份,節省本地空間;
4.備份恢復基於文件操作,降低直接對數據庫操作風險;
5.備份效率高,恢復效率也高;

實戰xtrabackup-部署
OS:Centos 6.7
application: percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm

#安裝依賴
yum install -y perl-DBD-MySQL per-DBI perl-Time-HiRes libaio* rsync perl l perl-Digest-MD5 perl perl-devel libaio libaio-devel
#rpm安裝會提示缺少libev.so.4()(64bit)
解決辦法:安裝libv.so()(64bit)
地址:http://rpmfind.net/linux/RPM/index.html 搜索libev.so.4()(64bit),下載
rpm -ivh libev-4.04-2.e16.x86_64.rpm
缺什麼都可以在上面的鏈接找到

#安裝庫以及主程序
rpm -ivh libev-4.04-2.el6.x86_64.rpm
rpm -ivh percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm

#檢查安裝結果

Xtrabackup 應用參數
常用參數:
 --user=USER #指定備份用戶,不指定的話爲當前系統用戶
 --password=PASSWD #指定備份用戶密碼
 --port=PORT #指定數據庫端口
 --defaults-group=GROUP-NAME #在多實例的時候使用
 --host=HOST #指定備份的主機,可以爲遠程數據庫服務器
 --apply-log #回滾日誌
 --database #指定需要備份的數據庫,多個數據庫之間以空格分開
 --defaults-file #指定mysql的配置文件
 --copy-back #將備份數據複製回原始位置
 --incremental #增量備份,後面跟要增量備份的路徑
 --incremental-basedir=DIRECTORY #增量備份時使用指向上一次的增量備份所在的目錄
 --incremental-dir=DIRECTORY #增量備份還原的時候用來合併增量備份到全量,用來指定全備路徑
 --redo-only #對增量備份進行合併
 --rsync #加快本地文件傳輸,適用於non-InnoDB數據庫引擎。不與--stream
共用
 --safe-slave-backup
 --no-timestamp #生成的備份文件不以時間戳爲目錄.
#創建全備-目錄
/home/backup/full
#創建增備-目錄
/home/backup/inc

#全量備份and 恢復
全量備份
innobackupex --defaults-file=/etc/my.cnf --use-memory=4G --user=root --password='12345678' --socket=/tmp/mysql.sock /home/backup/full
innobackupex --defaults-file=/etc/my.cnf --use-memory=4G --user=root --password='lNWj9s0n4c4G2C7L' --socket=/tmp/mysql.sock /home/backup/full
lNWj9s0n4c4G2C7L

說明:
  上面的命令在我的/data/backup/full 目錄生成了一個文件夾【2017-01-20_10-52-43】
  一般情況下,這個備份不能用於恢復,因爲備份的數據中可能含有尚未提交的事務或者已經提交的事務但尚未同步至數據文件的事務,此時數據文件處於不一致的狀態。
  因此,我們現在就是要通過回滾未提交的事務及同步已經提交的事務至數據文件也使得數據文件處於一致性狀態。

#開啓apply-log恢復過程
innobackupex --user=root --password --defaults-file=/etc/my.cnf --apply-log /home/backup/full/2018-08-05_17-58-56

#恢復演練
1)關閉數據庫,備份原數據,創建新的數據目錄
mv /home/mysql/data /home/mysql/data_bak
mkdir -p /home/mysql/data
chown mysql.mysql -R /home/mysql/data
innobackupex --defaults-file=/etc/my.cnf --copy-back --rsync /home/backup/full/2018-08-05_19-51-06/
恢復

innobackupex --defaults-file=/etc/my.cnf --copy-back --rsync /home/backup/full

#第一次增量備份
innobackupex --defaults-file=/etc/my.cnf --user=root --password=12345678 --incremental /home/backup/inc --incremental-basedir=/home/backup/full/2018-08-05_21-00-05/

innobackupex --defaults-file=/etc/my.cnf --user=root --password=12345678 --incremental /home/backup/inc1 --incremental-basedir=/home/backup/full/2018-08-07_15-22-53/

--incremental-basedir 指的是完全備份所在的目錄

此命令執行結束後,innobackupex命令會在/home/backup/inc1目錄中創建一個新的以時間命名的目錄以存放所有的增量備份數據。

另外,在執行過增量備份之後再一次進行增量備份時,其--incremental-basedir應該指向上一次的增量備份所在的目錄。

需要注意的是,增量備份僅能應用於InnoDB或XtraDB表,對於MyISAM表而言,執行增量備份時其實進行的是完全備份。

檢查增量的結果

#第二次增量
mkdir -p /home/backup/inc2
#執行
innobackupex --defaults-file=/etc/my.cnf --user=root --password='12345678' --socket=/tmp/mysql.sock --incremental /home/backup/inc2 --incremental-basedir=/home/backup/inc/2018-08-05_21-11-30

innobackupex --defaults-file=/etc/my.cnf --user=root --password='12345678' --socket=/tmp/mysql.sock --incremental /home/backup/inc2/ --incremental-basedir=/home/backup/inc1/2018-08-07_15-39-15/

innobackupex --defaults-file=/etc/my.cnf --user=root --password='12345678' --socket=/tmp/mysql.sock --incremental /home/backup/inc2 --incremental-basedir=/home/backup/inc1/2018-08-07_15-39-15/
#第三次增量

如果需要恢復的話需要先執行如下操作

innobackupex --apply-log --redo-only /home/backup/full/2018-08-05_21-00-05/
innobackupex --apply-log --redo-only /home/backup/full/2018-08-05_21-00-05 --incremental-dir=/home/backup/inc/2018-08-05_21-11-30/
innobackupex --apply-log --redo-only /home/backup/full/2018-08-07_15-22-53 --incremental-dir=/home/backup/inc1/2018-08-07_15-39-15/

如果存在多次增量備份的話,就多次執行如下命令。此處執行鍼對的是第二次增量備份

innobackupex --apply-log --redo-only /home/backup/full/2018-08-05_21-00-05 --incremental-dir=/home/backup/inc2/2018-08-05_21-22-02/

恢復演習:
模擬環境,誤刪兩個數據庫-進行恢復

drop database db_wifi;
drop database performance_schema;

備份:
全備:full
innobackupex --defaults-filr=/etc/my.cnf --user=root --password='12345678' --socket=/tmp/mysql.sock /home/backup/full
增備:inc
innobackupex --defaults-file=/etc/my.cnf --user=root --password=12345678 --incremental /home/backup/inc --incremental-basedir=/home/backup/full/2018-08-05_21-00-05/

備份過程
一【全備】
innobackupex --defaults-filr=/etc/my.cnf --user=root --password='123456' --socket=/tmp/mysql.sock /home/backup/full
innobackupex --defaults-file=/etc/my.cnf --use-memory=4G --socket=/tmp/mysql.sock --user=root --password='NcfmFocqgi2XTvVi' /home/backup/full
二【開啓apply-log恢復過程】
innobackupex --defaults-filr=/etc/my.cnf --user=root --password='123456' --apply-log /home/backup/full/2018-09-17_15-09-41
三 【第一次增量】
innobackupex --defaults-file=/etc/my.cnf --user=root --password='123456' --incremental /home/backup/inc1 --incremental-basedir=/home/backup/full/2018-09-17_15-09-41/
四 【第二次增量】
innobackupex --defaults-file=/etc/my.cnf --user=root --password='123456' --incremental /home/backup/inc2 --incremental-basedir=/home/backup/inc1/2018-09-17_15-14-54/
五 【第三次增量】
innobackupex --defaults-file=/etc/my.cnf --user=root --password='123456' --incremental /home/backup/inc3 --incremental-basedir=/home/backup/inc2/2018-09-17_15-18-02/
恢復總結:
增量備份的還原3步驟:1.恢復完整備份;2.恢復增量備份到完整備份(第一個恢復的增量備份要添加--redo-only參數,最後一個恢復的增量備份去掉--redo-only參數);3.對整體的完整備份進行恢復,回滾未提交的數據。
預備增量備份:1.需要先預備全備,但是隻重做已提交事務,不回滾未提交事務,然後應用到全備,也是隻重做已提交事務,不回滾未提交事務 ;2.回滾未提交事務
1.恢復前需要回滾未提交的事務以及同步已經提交的事務至數據文件使數據文件處於一致性狀態
#實例#
innobackupex --apply-log --redo-only /home/backup/full/2018-08-05_21-00-05/

2.將增量備份合進全備中-有多個增量備份就相對應執行幾次(有點累)
小節點:你想恢復到第幾次增備點,就將增備合併進全備中 1+1=2
#實例#-恢復到第一次增量節點
innobackupex --apply-log --redo-only /home/backup/full/2018-08-07_15-22-53 --incremental-dir=/home/backup/inc1/2018-08-07_15-39-15/
3.停數據庫並刪除數據
service mysqld.service stop
rm -rf /home/mysql/data

4.執行恢復-恢復到你需要的時間上 -注意看後面的事從全備恢復,這是因爲第2步已經將增量數據合進全備中啦
innobackupex --defaults-file=/etc//my.cnf --user=root --password=12345678 --copy-back /data/backup/full/2017-01-20_10-52-43
innobackupex --defaults-file=/etc/my.cnf --user=root --password=12345678 --copy-back /home/backup/full/2018-08-08_20-46-16/
5.賦權要不然數據庫起不起來
chown mysql.mysql -R data

總結
第一階段:檢查與連接的準備階段
執行備份命令之後,備份開始,XtraBackup工具嘗試去連接MySQL服務器,連接成功之後,執行MySQL版本檢查,版本檢查完畢。使用給定的用戶、密碼、端口、socket文件連接使用5.7.22版本的MySQL服務器。

第二階段:持續拷貝redo log
這部分內容並沒有在備份的輸出日誌裏體現,推測通過開啓general log可以看到,也不一定,也許要通過源碼才能看到。
修正:我的測試備份環境是一個靜止的數據庫,在備份時,既沒有發生寫操作,也沒有發生讀操作。所以沒有看到一直在做"輸出看到大量log scanned up to (xxx),對應就是持續掃描redo log"

第三階段:拷貝ibdata1和ibd文件
xtrabackup進程開始執行一系列工作
1、調用系統函數posix_fadvise(),該函數是用來清理緩存的,不太理解此處使用的意圖?瞭解的童鞋給我科普下,謝謝。
2、進入到/data/mysql/mysql3306/data目錄下面
3、把打開文件請求限制調整爲65535
4、使用以下InnoDB配置:
innodb_data_home_dir = .
#innodb數據存放在當前目錄
innodb_data_file_path = ibdata1:100M:autoextend
#innodb共享表空間文件爲1個,初始大小爲100M,類型爲自動擴展
innodb_log_group_home_dir = ./
#innodb日誌文件存放在當前目錄
innodb_log_files_in_group = 3
#innodb日誌文件個數爲3個
innodb_log_file_size = 104857600
#innodb日誌文件大小爲100M
5、使用O_DIRECT標誌,目的爲繞過緩衝區高速緩存,直接把數據傳遞到文件或設備,實際就是無需緩存來拷貝數據
6、默認使用單線程進行備份
7、日誌掃描到2643241字節的位置
8、形成一個表表空間的列表
9、爲mysql/plugin分配表空間爲2,舊的最大值是0
10、把ibdata1文件拷貝到備份目錄下面,直到完成
11、把ibd文件拷貝到備份目錄下面,直到所有的ibd文件拷貝完成

第四階段:備份非事務表的準備階段
innobackupex進程開始執行一系列工作
1、掃描日誌文件到2643241,這是已經寫入redo的LSN
2、執行FLUSH TABLES,關閉所有打開的表,使用NO_WRITE_TO_BINLOG選項,也就是該語句不會被記錄到binlog裏面
3、執行FTWRL,使用全局讀鎖來鎖定整個實例

第五階段:備份非事務表
開始拷貝非innodb引擎表和文件,包括所有的.frm文件等,直到所有的都拷貝完成
修正:
.frm文件:保存了每個表的元數據,包括表結構的定義等;
.ibd文件:InnoDB引擎開啓了獨立表空間(my.ini中配置innodb_file_per_table = 1)產生的存放該表的數據和索引的文件。

第六階段:整個備份完成後的後續工作
1、開始寫xtrabackup_binlog_info文件,此處推測,獲取執行過的GTID值和位點信息的語句在general log裏面有記錄
2、執行引擎的日誌刷新,也就是把日誌刷新到磁盤
3、最後的檢查點是2643232字節的位置,也就是數據持久化到的LSN
4、停止拷貝線程
5、掃描日誌文件到2643241
6、執行UNLOCK TABLES,釋放全局讀鎖
7、開始拷貝ib_buffer_pool,直到拷貝完成,這是一堆數字,不知道做什麼用處,瞭解的童鞋給我科普下,謝謝。
修正:拷貝緩衝池裏的數據,以備恢復後,可以快速加載和預熱訪問量最高的數據。
8、打印出備份結束的位點和執行過的GTID值
9、寫backup-my.cnf文件
10、寫xtrabckup_info
11、LSN從2643232到2643241的事務日誌拷貝完成
12、打印備份成功的標誌,completed OK!

故障記錄:
InnoDB: Error number 24 means 'Too many open files'
網上解釋

修改ulimit
ulimit -n 65535
使用 ulimit -n 65535 可即時修改,但重啓後就無效了。(注ulimit -SHn 65535 等效 ulimit -n 65535,-S指soft,-H指hard)
有如下三種修改方式:
1.在/etc/rc.local 中增加一行 ulimit -SHn 65535
2.在/etc/profile 中增加一行 ulimit -SHn 65535
3.在/etc/security/limits.conf最後增加如下兩行記錄

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