xtrabackup包含兩個主要的工具,即xtrabackup和innobackupex,二者差別如下:
(1)xtrabackup隻能備份innodb和xtradb兩種引擎的表,而不能備份myisam引擎的表;
(2)innobackupex是一個封裝了xtrabackup的perl腳本,支援同時備份innodb和myisam,但在對myisam備份時需要加一個全局的讀鎖。還有就是myisam不支援增量備份。
1.備份過程
innobackupex備份過程如下圖:

(圖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的執行個體恢複)。恢複過程如下圖:
(圖2 innobackupex 恢複過程)
3.增量備份
innobackupex增量備份過程中的"增量"處理,其實主要是相對innodb而言,對myisam和其他存儲引擎而言,它仍然是全拷貝(全備份)
"增量"備份的過程主要是通過拷貝innodb中有變更的"頁"(這些變更的資料頁指的是"頁"的lsn大于xtrabackup_checkpoints中給定的lsn)。增量備份是基于全備的,第一次增備的資料必須要基于上一次的全備,之後的每次增備都是基于上一次的增備,最終達到一緻性的增備。增量備份的過程如下,和全備的過程很類似,差別僅在第2步。
( 圖 3 innobackupex增量備份過程)
4.增量備份恢複
和全備恢複類似,也需要兩步,一是資料檔案的恢複,如圖4,這裡的資料來源由3部分組成:全備份,增量備份和xtrabackup log。二是對未送出事務的復原,如圖5所示:
( 圖4 innobackupex 增量備份恢複過程1)
( 圖5 innobackupex增量備份恢複過程2)
5.innobackupex使用示例
(1)安裝使用xtrabackup,安裝比較簡單,我們使用二進制編譯好的就行了,這種工具無需源碼編譯,因為沒有什麼功能需要俺們定制。
(2)全量備份
建立備份使用者:
進行全備份
備份資料存放在/data/backup/下面,innobackupex會自動建立一個檔案夾,是目前系統的時間戳
測試資料就是yayun庫中的t1表 (錯誤:--host=192.168.199.1
上面的過程中處理過,主要看最後是否提示innobackupex completed ok,可以看見備份成功。我們看看/data/backup目錄下産生了什麼
可以看見有對應資料庫的名字,比如yayun,還有一個以時間戳命名的目錄。我們看看對應檔案裡面的内容,這幾個比較重要
可以看見相關檔案記錄了lsn,日志偏移量,還可以看見這次是全備份,相信聰明的童鞋們一眼就看懂了。^_^
删除資料庫,然後恢複全備(線上不要這樣搞)
恢複全備
恢複備份到mysql的資料檔案目錄,這一過程要先關閉mysql資料庫,重命名或者删除原資料檔案目錄都可以,再建立一個新的資料檔案目錄,将備份資料複制到新的資料檔案目錄下,賦權,修改權限,啟動資料庫
以上對應的目錄就是innobackupex全備份自己建立的目錄。
可以看見已經成功恢複,修改資料目錄權限,啟動mysql,效驗資料是否正常,檢視yayun庫下面的t1表中的資料。
發現資料已經成功恢複。
(3)增量備份
在進行增量備份時,首先要進行一次全量備份,第一次增量備份是基于全備的,之後的增量備份是基于上一次的增量備份,以此類推。
全備份放在/data/backup/full,增量備份放在/data/backup/incremental
廢話少說,咱們先來一次全備份
為了測試效果,我們在t1表中插入資料
現在來一次增量備份1
我們看看增量備份的大小以及檔案内容
看見增量備份的資料很小吧,就是備份改變的資料而已。
上面已經明顯說明是增量備份了,該工具很人性化吧,呵呵
我們再次向t1表插入資料,然後建立增量備份2
建立增量備份2(這次是基于上次的增量備份哦)
(4)增量備份恢複
增量備份的恢複大體為3個步驟
*恢複完全備份
*恢複增量備份到完全備份(開始恢複的增量備份要添加--redo-only參數,到最後一次增量備份去掉--redo-only參數)
*對整體的完全備份進行恢複,復原那些未送出的資料
恢複完全備份(注意這裡一定要加--redo-only參數,該參數的意思是隻應用xtrabackup日志中已送出的事務資料,不復原還未送出的資料)
将增量備份1應用到完全備份
将增量備份2應用到完全備份(注意恢複最後一個增量備份時需要去掉--redo-only參數,復原xtrabackup日志中那些還未送出的資料)
把所有合在一起的完全備份整體進行一次apply操作,復原未送出的資料:
把恢複完的備份複制到資料庫目錄檔案中,賦權,然後啟動mysql資料庫,檢測資料正确性
檢視資料是否正确
(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_slave_info檔案内容,這個内容就是為搭建從庫時需要change master to的參數:
在老的slave伺服器上進行還原,即192.168.0.20
将還原的檔案複制到新的從庫newslave,即192.168.0.100
在主庫master上添加對新從庫newslave的授權:
拷貝老的從庫的配置檔案到新的從庫newslave,并且修改server-id參數,修改完畢後,啟動新的從庫;
查找老的從庫備份後生成的xtrabackup_slave_info檔案,提取其中的master_log_file和master_log_pos資訊,然後在新的從庫上進行change master to操作:
在新的從庫上進行同步:
啟動io線程和sql線程,并觀察複制是否正常:
檢視主庫,發現已經有兩個線程(binlog dump)
正常工作,到此線上克隆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
您的支援是對部落客最大的鼓勵,感謝您的認真閱讀。本文版權歸作者所有,歡迎轉載,但請保留該聲明。
<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>