溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MySQL還原備份的方法是什么

發(fā)布時(shí)間:2021-12-04 14:56:29 來(lái)源:億速云 閱讀:165 作者:iii 欄目:云計(jì)算

這篇文章主要介紹“MySQL還原備份的方法是什么”,在日常操作中,相信很多人在MySQL還原備份的方法是什么問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”MySQL還原備份的方法是什么”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

Facebook的MySQL數(shù)據(jù)庫(kù)遍布在我們位于全球的數(shù)據(jù)中心內(nèi),我們必須能在任何時(shí)間內(nèi)從任何位置發(fā)生的故障中恢復(fù)。在發(fā)生此類災(zāi)難事件后,不僅需要盡量快速可靠地恢復(fù)服務(wù),而且需要確保整個(gè)過(guò)程不會(huì)丟失任何數(shù)據(jù)。為此我們構(gòu)建了一套能夠?qū)膫浞葜谢謴?fù)數(shù)據(jù)庫(kù)的能力進(jìn)行持續(xù)不斷測(cè)試的系統(tǒng)。

我們的還原系統(tǒng)包含兩個(gè)重要組件:

  • 持續(xù)還原層(Continuous Restore Tier,CRT) - 負(fù)責(zé)對(duì)所有還原操作進(jìn)行調(diào)度和監(jiān)控。該組件會(huì)查找包含新備份的數(shù)據(jù)庫(kù),為其創(chuàng)建還原作業(yè),監(jiān)控還原過(guò)程,并確保每個(gè)備份可以成功還原。

  • ORC 還原協(xié)調(diào)器(ORC) - 由負(fù)責(zé)執(zhí)行還原的工作進(jìn)程(Peon)和負(fù)載均衡器(Warchief)組成。Warchief接收來(lái)自CRT的新建還原作業(yè)并將其分配給Peon。Peon承載了負(fù)責(zé)執(zhí)行實(shí)際還原過(guò)程的本地MySQL實(shí)例。

數(shù)據(jù)CRT會(huì)收集每個(gè)還原作業(yè)的進(jìn)度信息,借此幫助我們了解數(shù)據(jù)庫(kù)還原操作的資源需求,ORC則可以幫助我們驗(yàn)證備份的完整性。本文將側(cè)重于介紹ORC的內(nèi)部原理,尤其是內(nèi)部的Peon狀態(tài)機(jī)(State machine),以及在對(duì)單一數(shù)據(jù)庫(kù)進(jìn)行還原的過(guò)程中我們遇到并克服的挑戰(zhàn)。

備份概述

在構(gòu)建持續(xù)還原流程前,我們首先需要了解各種可用備份選項(xiàng)的本質(zhì)。目前我們主要進(jìn)行三種備份,所有備份內(nèi)容均存儲(chǔ)在HDFS中:

  1. 完整邏輯備份,使用mysqldump每幾天進(jìn)行一次。

  2. 差異(Diff)備份在所有未進(jìn)行完整備份的日子里進(jìn)行。備份過(guò)程中會(huì)再次創(chuàng)建完整轉(zhuǎn)儲(chǔ),但只存儲(chǔ)與上一次完整備份相比有差異的內(nèi)容。我們會(huì)通過(guò)元數(shù)據(jù)記錄每次差異備份是基于哪個(gè)完整備份進(jìn)行的。

  3. 二進(jìn)制日志(Binlog)備份從主數(shù)據(jù)庫(kù)持續(xù)不斷地流式傳輸至HDFS。

完整和差異備份均會(huì)將--single-transaction選項(xiàng)傳遞至mysqldump,這樣我們就可以對(duì)數(shù)據(jù)庫(kù)獲得一致的快照,該快照可取自從屬(Slave)或主(Master)實(shí)例。下文會(huì)將差異和完整備份統(tǒng)稱為轉(zhuǎn)儲(chǔ)(Dump)。

由于每天只進(jìn)行一次轉(zhuǎn)儲(chǔ)操作,因此可通過(guò)Binlog備份確保自從備份之后,數(shù)據(jù)庫(kù)所執(zhí)行的每一筆事務(wù)都能被我們記錄在案。隨后只要對(duì)轉(zhuǎn)儲(chǔ)內(nèi)容執(zhí)行還原操作將數(shù)據(jù)庫(kù)恢復(fù)至某個(gè)時(shí)點(diǎn),隨后通過(guò)Binlog對(duì)事務(wù)進(jìn)行重播(Replay),即可順利實(shí)現(xiàn)數(shù)據(jù)庫(kù)的時(shí)點(diǎn)還原。我們的所有數(shù)據(jù)庫(kù)服務(wù)器都使用了全局事務(wù)ID(GTID),因此在從Binlog備份進(jìn)行事務(wù)重播時(shí)我們可以獲得額外的一層控制能力。

除了將備份存儲(chǔ)在HDFS中,我們還會(huì)將其寫入離場(chǎng)位置

ORC:ORC還原協(xié)調(diào)器

架構(gòu)

ORC包含三個(gè)組件:

  1. Warchief - 負(fù)載均衡器。這是一種可暴露出Thrift接口的Python程序,通過(guò)接口可接收新的還原請(qǐng)求,并將其調(diào)度至可用的Peon。

  2. ORC DB - 負(fù)責(zé)維持分配給每個(gè)Peon的作業(yè)狀態(tài)、每個(gè)作業(yè)的當(dāng)前狀態(tài),以及Peon健康度狀態(tài)等信息的中央MySQL數(shù)據(jù)庫(kù)。Warchief會(huì)使用該數(shù)據(jù)庫(kù)中存儲(chǔ)的信息決定要將某個(gè)作業(yè)分配給哪個(gè)Peon,以及故障恢復(fù)過(guò)程中要使用的Peon。

  3. Peon - 負(fù)責(zé)還原操作的工作進(jìn)程。Peon也使用Python編寫,可暴露出Thrift接口,通過(guò)該接口接收有關(guān)Peon的各類狀態(tài)信息。每個(gè)Peon會(huì)定期與ORC DB進(jìn)行同步,查詢分配給自己的新作業(yè),并匯報(bào)自己的健康度狀態(tài)。運(yùn)行Peon的服務(wù)器上還運(yùn)行了一個(gè)本地MySQL實(shí)例,備份將還原至該實(shí)例中。

MySQL還原備份的方法是什么

內(nèi)部原理:Peon

Peon中包含了從HDFS獲取備份,將其載入自己的本地MySQL實(shí)例,通過(guò)Binlog重播將實(shí)例推進(jìn)至某一時(shí)點(diǎn)等操作的所有相關(guān)邏輯。Peon處理的每個(gè)還原作業(yè)會(huì)經(jīng)歷下列五個(gè)步驟:

  1. 選擇(SELECT) - 決定需要用哪個(gè)備份進(jìn)行還原(例如完整或增量,HDFS或離場(chǎng)等)。

  2. 下載(DOWNLOAD) - 將所選文件下載至磁盤。如果要還原的是完整備份,只需下載一個(gè)文件。對(duì)于差異備份,首先需要下載完整和差異備份,隨后在完整備份的基礎(chǔ)上應(yīng)用差異備份,并將最終結(jié)果存儲(chǔ)到磁盤上。無(wú)論備份類型為何,至此我們已經(jīng)在磁盤上有了一個(gè)mysqldump輸出的內(nèi)容。

  3. 加載(LOAD) - 將下載的備份載入Peon的本地MySQL實(shí)例。按照與備份文件中每張表有關(guān)的語(yǔ)句進(jìn)行解析,并行恢復(fù)每張表,這一過(guò)程類似于Percona的Mydumper。

  4. 驗(yàn)證(VERIFY) - 針對(duì)載入MySQL的數(shù)據(jù)執(zhí)行健康檢查(Sanity check)。

  5. 重播(REPLAY) - 如果有必要,在已還原備份的基礎(chǔ)上,下載二進(jìn)制日志備份并進(jìn)行事務(wù)重播。我們會(huì)使用mysqlbinlog程序篩選掉來(lái)自其他共置數(shù)據(jù)庫(kù)以及空事務(wù)的Binlog事件,隨后對(duì)同一個(gè)MySQL實(shí)例重播所需的事務(wù)。

每個(gè)步驟有自己對(duì)應(yīng)的失敗狀態(tài),因此如果某個(gè)作業(yè)在DOWNLOAD步驟失敗,將顯示為DOWNLOAD_FAILED狀態(tài),并且不會(huì)繼續(xù)進(jìn)入到LOAD步驟中。

Binlog的選擇邏輯

還原過(guò)程中最具挑戰(zhàn)的部分可能就是確定所要下載并重播的Binlog。完整和差異備份可以從主或從屬數(shù)據(jù)庫(kù)獲取,然而我們只從主數(shù)據(jù)庫(kù)創(chuàng)建Binlog備份。這意味著簡(jiǎn)單的時(shí)間戳對(duì)比已經(jīng)無(wú)法用于確定要重播的Binlog。

我們于2014年在所有服務(wù)器上部署了GTID,因此每筆事務(wù)都可以獲得一個(gè)全局唯一標(biāo)識(shí)符。此外每臺(tái)運(yùn)行MySQL的服務(wù)器也維持了一個(gè)gtid_executed(GTID集)變量,可將其作為對(duì)應(yīng)實(shí)例目前已執(zhí)行事務(wù)數(shù)量的計(jì)數(shù)器。

在具備GTID的情況下,從主數(shù)據(jù)庫(kù)重播至從屬數(shù)據(jù)庫(kù)的事務(wù)可以維持自己的GTID,這也意味著我們可以清楚地知道每筆事務(wù)是否包含在某個(gè)GTID集中。此外還可以針對(duì)服務(wù)器的gtid_executed值進(jìn)行超集/子集(Superset/subset)比較,因?yàn)樵撝祵?shí)際上就是一種嚴(yán)格遞增的計(jì)數(shù)器和數(shù)學(xué)意義上的函數(shù)。

通過(guò)配合使用這些技術(shù),即可在創(chuàng)建轉(zhuǎn)儲(chǔ)時(shí)記錄服務(wù)器的gtid_executed值,同時(shí)記錄每個(gè)Binlog文件中包含的GTID集,借此執(zhí)行一致的比較并確定Binlog中的哪些事務(wù)需要重播。此外一旦需要重播的第一筆事務(wù)確定后,無(wú)需重新對(duì)比其他GTID即可確定需要重播的所有后續(xù)事務(wù)。我們還會(huì)使用mysqlbinlog的--stop-datetime選項(xiàng)確定Binlog流要在何處停止。

到此,關(guān)于“MySQL還原備份的方法是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI