天天看點

xtrabackup 詳解(已糾正)

xtrabackup包含兩個主要的工具,即xtrabackup和innobackupex,二者差別如下:

(1)xtrabackup隻能備份innodb和xtradb兩種引擎的表,而不能備份myisam引擎的表;

(2)innobackupex是一個封裝了xtrabackup的perl腳本,支援同時備份innodb和myisam,但在對myisam備份時需要加一個全局的讀鎖。還有就是myisam不支援增量備份。

1.備份過程

innobackupex備份過程如下圖:

xtrabackup 詳解(已糾正)

                                                                                (圖1 innobackupex備份過程,本文中所有圖都是google所得)

在圖1中,備份開始時首先會開啟一個背景檢測程序,實時檢測mysql redo的變化,一旦發現redo中有新的日志寫入,立刻将日志記入背景日志檔案xtrabackup_log中。之後複制innodb的資料檔案和系統表空間檔案ibdata1,待複制結束後,執行flush tables with read lock操作,複制.frm,myi,myd,等檔案(執行flush tableswith

read lock的目的是為了防止資料表發生ddl操作,并且在這一時刻獲得binlog的位置)最後會發出unlock tables,把表設定為可讀可寫狀态,最終停止xtrabackup_log。

2.全備恢複

這一階段會啟動xtrabackup内嵌的innodb執行個體,回放xtrabackup日志xtrabackup_log,将送出的事務資訊變更應用到innodb資料/表空間,同時復原未送出的事務(這一過程類似innodb的執行個體恢複)。恢複過程如下圖:

xtrabackup 詳解(已糾正)

                                                       (圖2 innobackupex 恢複過程)

3.增量備份

innobackupex增量備份過程中的"增量"處理,其實主要是相對innodb而言,對myisam和其他存儲引擎而言,它仍然是全拷貝(全備份)

"增量"備份的過程主要是通過拷貝innodb中有變更的"頁"(這些變更的資料頁指的是"頁"的lsn大于xtrabackup_checkpoints中給定的lsn)。增量備份是基于全備的,第一次增備的資料必須要基于上一次的全備,之後的每次增備都是基于上一次的增備,最終達到一緻性的增備。增量備份的過程如下,和全備的過程很類似,差別僅在第2步。

xtrabackup 詳解(已糾正)

                                                                            ( 圖 3 innobackupex增量備份過程)

4.增量備份恢複

和全備恢複類似,也需要兩步,一是資料檔案的恢複,如圖4,這裡的資料來源由3部分組成:全備份,增量備份和xtrabackup log。二是對未送出事務的復原,如圖5所示:

xtrabackup 詳解(已糾正)

                                                   ( 圖4 innobackupex 增量備份恢複過程1)

xtrabackup 詳解(已糾正)

       ( 圖5 innobackupex增量備份恢複過程2)

5.innobackupex使用示例

(1)安裝使用xtrabackup,安裝比較簡單,我們使用二進制編譯好的就行了,這種工具無需源碼編譯,因為沒有什麼功能需要俺們定制。

(2)全量備份

建立備份使用者:

xtrabackup 詳解(已糾正)
xtrabackup 詳解(已糾正)

進行全備份

備份資料存放在/data/backup/下面,innobackupex會自動建立一個檔案夾,是目前系統的時間戳

xtrabackup 詳解(已糾正)
xtrabackup 詳解(已糾正)

測試資料就是yayun庫中的t1表 (錯誤:--host=192.168.199.1

xtrabackup 詳解(已糾正)
xtrabackup 詳解(已糾正)

上面的過程中處理過,主要看最後是否提示innobackupex completed ok,可以看見備份成功。我們看看/data/backup目錄下産生了什麼

xtrabackup 詳解(已糾正)
xtrabackup 詳解(已糾正)

可以看見有對應資料庫的名字,比如yayun,還有一個以時間戳命名的目錄。我們看看對應檔案裡面的内容,這幾個比較重要

xtrabackup 詳解(已糾正)
xtrabackup 詳解(已糾正)

可以看見相關檔案記錄了lsn,日志偏移量,還可以看見這次是全備份,相信聰明的童鞋們一眼就看懂了。^_^

删除資料庫,然後恢複全備(線上不要這樣搞)

恢複全備

恢複備份到mysql的資料檔案目錄,這一過程要先關閉mysql資料庫,重命名或者删除原資料檔案目錄都可以,再建立一個新的資料檔案目錄,将備份資料複制到新的資料檔案目錄下,賦權,修改權限,啟動資料庫

以上對應的目錄就是innobackupex全備份自己建立的目錄。

xtrabackup 詳解(已糾正)
xtrabackup 詳解(已糾正)

可以看見已經成功恢複,修改資料目錄權限,啟動mysql,效驗資料是否正常,檢視yayun庫下面的t1表中的資料。

xtrabackup 詳解(已糾正)
xtrabackup 詳解(已糾正)

發現資料已經成功恢複。

(3)增量備份

在進行增量備份時,首先要進行一次全量備份,第一次增量備份是基于全備的,之後的增量備份是基于上一次的增量備份,以此類推。

全備份放在/data/backup/full,增量備份放在/data/backup/incremental

xtrabackup 詳解(已糾正)
xtrabackup 詳解(已糾正)

廢話少說,咱們先來一次全備份

為了測試效果,我們在t1表中插入資料

xtrabackup 詳解(已糾正)
xtrabackup 詳解(已糾正)

現在來一次增量備份1

xtrabackup 詳解(已糾正)
xtrabackup 詳解(已糾正)

我們看看增量備份的大小以及檔案内容

看見增量備份的資料很小吧,就是備份改變的資料而已。

xtrabackup 詳解(已糾正)
xtrabackup 詳解(已糾正)

上面已經明顯說明是增量備份了,該工具很人性化吧,呵呵

我們再次向t1表插入資料,然後建立增量備份2

xtrabackup 詳解(已糾正)
xtrabackup 詳解(已糾正)

建立增量備份2(這次是基于上次的增量備份哦)

xtrabackup 詳解(已糾正)
xtrabackup 詳解(已糾正)
xtrabackup 詳解(已糾正)
xtrabackup 詳解(已糾正)

(4)增量備份恢複

增量備份的恢複大體為3個步驟

*恢複完全備份

*恢複增量備份到完全備份(開始恢複的增量備份要添加--redo-only參數,到最後一次增量備份去掉--redo-only參數)

*對整體的完全備份進行恢複,復原那些未送出的資料

恢複完全備份(注意這裡一定要加--redo-only參數,該參數的意思是隻應用xtrabackup日志中已送出的事務資料,不復原還未送出的資料)

将增量備份1應用到完全備份

xtrabackup 詳解(已糾正)
xtrabackup 詳解(已糾正)

将增量備份2應用到完全備份(注意恢複最後一個增量備份時需要去掉--redo-only參數,復原xtrabackup日志中那些還未送出的資料)

把所有合在一起的完全備份整體進行一次apply操作,復原未送出的資料:

把恢複完的備份複制到資料庫目錄檔案中,賦權,然後啟動mysql資料庫,檢測資料正确性

xtrabackup 詳解(已糾正)
xtrabackup 詳解(已糾正)

檢視資料是否正确

xtrabackup 詳解(已糾正)
xtrabackup 詳解(已糾正)

(5)克隆slave

在日常工作中,我們有時候需要線上添加從庫,比如線上有一主一從兩個資料庫,但是由于業務的需要,一台從庫的讀取無法滿足現在的需求,這樣就需要我們線上添加從庫,由于出于安全考慮,我們通常需要在從庫上進行線上克隆slave。

克隆slave時,常用參數--slave-info和--safe-slave-backup。

--slave-info會将master的binlog檔案名和偏移量位置儲存到xtrabackup_slave_info檔案中

--safe-slave-backup會暫停slave的sql線程直到沒有打開的臨時表的時候開始備份。備份結束後sql線程會自動啟動,這樣操作的目的主要是確定一緻性的複制狀态。

下面的例子,将介紹一主一從情況下線上搭建新的從庫,環境如下:

master 192.168.0.10    #主庫

slave    192.168.0.20    #從庫

newslave 192.168.0.100 # 新的從庫

在上述示例中,newslave即為要新搭建的從庫。在老的從庫上面進行備份:

這裡的/data/cloneslave 目錄要不存在,如果存在是會報錯的。

檢視目錄下生成的檔案:

xtrabackup 詳解(已糾正)
xtrabackup 詳解(已糾正)

檢視xtrabackup_slave_info檔案内容,這個内容就是為搭建從庫時需要change master to的參數:

在老的slave伺服器上進行還原,即192.168.0.20

将還原的檔案複制到新的從庫newslave,即192.168.0.100

在主庫master上添加對新從庫newslave的授權:

xtrabackup 詳解(已糾正)
xtrabackup 詳解(已糾正)

拷貝老的從庫的配置檔案到新的從庫newslave,并且修改server-id參數,修改完畢後,啟動新的從庫;

查找老的從庫備份後生成的xtrabackup_slave_info檔案,提取其中的master_log_file和master_log_pos資訊,然後在新的從庫上進行change master to操作:

在新的從庫上進行同步:

啟動io線程和sql線程,并觀察複制是否正常:

xtrabackup 詳解(已糾正)
xtrabackup 詳解(已糾正)

檢視主庫,發現已經有兩個線程(binlog dump)

xtrabackup 詳解(已糾正)
xtrabackup 詳解(已糾正)

正常工作,到此線上克隆slave就結束啦。

參考:

<a target="_blank" href="http://www.cnblogs.com/gomysql/p/3650645.html">http://www.cnblogs.com/gomysql/p/3650645.html</a>

<a target="_blank" href="http://blog.csdn.net/jesseyoung/article/details/42046111">http://blog.csdn.net/jesseyoung/article/details/42046111</a>

<a target="_blank" href="http://fengwan.blog.51cto.com/508652/1432347">http://fengwan.blog.51cto.com/508652/1432347</a>

<a target="_blank" href="http://www.percona.com/doc/percona-xtrabackup/2.1/">http://www.percona.com/doc/percona-xtrabackup/2.1/</a>

<a target="_blank" href="http://realtimedba.blogspot.com/2013/06/my-sqlxtra-backup.html">http://realtimedba.blogspot.com/2013/06/my-sqlxtra-backup.html</a>

作者:atlas

您的支援是對部落客最大的鼓勵,感謝您的認真閱讀。本文版權歸作者所有,歡迎轉載,但請保留該聲明。

xtrabackup 詳解(已糾正)
xtrabackup 詳解(已糾正)

<a target="_blank" href="http://home.cnblogs.com/u/gomysql/">yayun</a>

<a target="_blank" href="http://home.cnblogs.com/u/gomysql/followees">關注 - 3</a>

<a target="_blank" href="http://home.cnblogs.com/u/gomysql/followers">粉絲 - 32</a>

<a target="_blank">+加關注</a>

(請您對文章做出評價)

錯誤參考:

http://blog.csdn.net/u010098331/article/details/50913718

http://blog.csdn.net/u010098331/article/details/50907063

http://blog.csdn.net/u010098331/article/details/50913744

<a target="_blank"></a>