簡(jiǎn)介:Mysql數(shù)據(jù)庫(kù)按時(shí)間點(diǎn)恢復(fù)實(shí)戰(zhàn)
對(duì)于任何一家企業(yè)來(lái)講,數(shù)據(jù)都是最寶貴的財(cái)富。
如何保護(hù)數(shù)據(jù)完整性,數(shù)據(jù)不受損壞,在發(fā)生故障時(shí),如何保住數(shù)據(jù),在發(fā)生誤操作,黑客入侵,數(shù)據(jù)篡改等場(chǎng)景時(shí),如何基于我們的備份來(lái)進(jìn)行數(shù)據(jù)恢復(fù),是每個(gè)技術(shù)人員需要關(guān)注的關(guān)鍵點(diǎn)。
阿里云致力于服務(wù)客戶,為客戶數(shù)據(jù)庫(kù)提供連續(xù)數(shù)據(jù)保護(hù)、低成本的備份服務(wù)。它可以為多種環(huán)境的數(shù)據(jù)提供強(qiáng)有力的保護(hù),以及強(qiáng)力恢復(fù)。在發(fā)生數(shù)據(jù)丟失、數(shù)據(jù)損壞的極端情況下,RDS管控平臺(tái)具有一鍵還原的功能,基于客戶設(shè)置的需要恢復(fù)的時(shí)間點(diǎn),進(jìn)行數(shù)據(jù)全方位恢復(fù)。
1. 按時(shí)間點(diǎn)恢復(fù)的技術(shù)實(shí)現(xiàn)
如果客戶在某時(shí)間節(jié)點(diǎn)由于誤操作,導(dǎo)致數(shù)據(jù)丟失,RDS管控服務(wù)是如何進(jìn)行恢復(fù)的呢?
按時(shí)間點(diǎn)恢復(fù)的整體思路如下:一次完整的數(shù)據(jù)恢復(fù)是由物理備份+binlog恢復(fù)+binlog裁剪構(gòu)成的。
圖1
首先獲取到可用的備份集,將備份集應(yīng)用到目標(biāo)實(shí)例上,然后再目標(biāo)實(shí)例重放需要恢復(fù)的binlog文件,最后通過(guò)binlog裁剪的形式應(yīng)用sql文件,實(shí)現(xiàn)整體的恢復(fù)。
2. 按時(shí)間點(diǎn)恢復(fù)的管控流程
1. 創(chuàng)建用于恢復(fù)的目的實(shí)例
當(dāng)我們需要整體恢復(fù)源數(shù)據(jù)庫(kù)數(shù)據(jù)時(shí),我們首先需要?jiǎng)?chuàng)建一個(gè)與源實(shí)例同規(guī)格、同網(wǎng)絡(luò)環(huán)境的目標(biāo)實(shí)例。
為什么要這樣做?
因?yàn)閭浞莼謴?fù)屬于高危操作,如果直接還原到源實(shí)例,一旦出現(xiàn)備份集不可用、binlog缺失等等問(wèn)題,那么不僅丟失數(shù)據(jù)無(wú)法找回,甚至原數(shù)據(jù)都無(wú)法完好保住,所以強(qiáng)烈建議使用新實(shí)例來(lái)進(jìn)行恢復(fù)!
2. 明確備份恢復(fù)時(shí)間點(diǎn)
當(dāng)客戶在執(zhí)行了一系列數(shù)據(jù)庫(kù)操作之后,如誤刪除、誤修改等,操作之后無(wú)感知,等到業(yè)務(wù)受損、故障發(fā)生時(shí),如何定位到當(dāng)時(shí)操作的準(zhǔn)確時(shí)間點(diǎn)用于數(shù)據(jù)恢復(fù)呢?
方式1:可以通過(guò)日志審計(jì)功能找到對(duì)應(yīng)的誤操作時(shí)間點(diǎn)。
方式2:可以將binlog解析成文本,查詢對(duì)應(yīng)的誤操作時(shí)間點(diǎn)。
3. 通過(guò)備份歷史獲取可用的備份集
一般情況下,基于業(yè)務(wù)的重要程度,客戶在云上會(huì)規(guī)劃好自己的數(shù)據(jù)庫(kù)備份周期,RDS管控會(huì)基于用戶選擇的恢復(fù)時(shí)間點(diǎn)自動(dòng)尋找可用的物理備份集。
可見備份對(duì)于數(shù)據(jù)庫(kù)的高可用和災(zāi)難恢復(fù)是重中之重的!
4. 獲取備份集對(duì)應(yīng)的binlog點(diǎn)位
專有云的備份一般都基于xtrabackup工具進(jìn)行備份。xtrabackup具有熱備份、恢復(fù)快等特點(diǎn),同時(shí)會(huì)將備份結(jié)束時(shí)應(yīng)用binlog的文件和點(diǎn)位寫入相應(yīng)文件中。RDS管控會(huì)將該binlogfile和binlogpos等信息寫入數(shù)據(jù)庫(kù),當(dāng)需要備份恢復(fù)時(shí),會(huì)直接獲取該點(diǎn)位進(jìn)行恢復(fù)。
如下圖所示:
圖2
5. 將備份集還原至目的實(shí)例
1-4步驟為準(zhǔn)備工作,下面開始正式的恢復(fù)數(shù)據(jù)。恢復(fù)數(shù)據(jù)的第一步是將獲取的可用的全量物理備份集下載至目的實(shí)例上,并使用xtrabackup工具進(jìn)行還原。
//首先要停止目的實(shí)例上的mysql進(jìn)程
systemctl stop mysql
//然后合并數(shù)據(jù),假設(shè)備份解壓在/root/backup/目錄下,可以指定需要恢復(fù)的實(shí)例端口,需加--defaults-file參數(shù)指定,默認(rèn)3306。
innobackupex --apply-log /root/backup/
//刪除原目錄文件
rm -rf /data/mysql
//還原數(shù)據(jù)集,還原數(shù)據(jù)到哪個(gè)目錄是基于配置文件my.cnf的datadir決定的。該字段一定要檢查是否準(zhǔn)確
innobackupex --copy-back /root/backup/
//目錄賦權(quán)
chown -R mysql:mysql /data/mysql
6. 驗(yàn)證還原是否成功
管控服務(wù)需要驗(yàn)證還原是否成功,再?zèng)Q定是否需要向下操作,驗(yàn)證步驟也很簡(jiǎn)單粗暴,直接檢查備份恢復(fù)日志中是否有ERROR,并且最后一行是否為completed OK!
如下圖,為一次成功的備份恢復(fù)。
圖3
7. 獲取用于恢復(fù)的binlog日志
此步驟至關(guān)重要,關(guān)乎恢復(fù)是否成功,數(shù)據(jù)是否完整。
那么RDS管控服務(wù)如何獲取正確的binlog來(lái)進(jìn)行恢復(fù)呢?我們來(lái)看下圖。
圖4
例如當(dāng)前我們的備份中總共有8個(gè)binlog備份(000-008),首先通過(guò)物理備份記錄的binlog的filename和pos來(lái)獲取第一個(gè)binlog,如上圖中的binlog004;然后通過(guò)客戶設(shè)置的需要恢復(fù)的時(shí)間點(diǎn)的timestamp,來(lái)找到對(duì)應(yīng)的最后一個(gè)binlog,如上圖中的binlog007;最后將binlog004,binlog005,binlog006,binlog007這四個(gè)binlog備份下載到目的實(shí)例上進(jìn)行恢復(fù)。
如果獲取了錯(cuò)誤的binlog日志用于恢復(fù),比如誤將binlog003/binlog005設(shè)置成了第一個(gè)binlog,那么binlog003/binlog005上執(zhí)行的dml語(yǔ)句會(huì)在新實(shí)例上重新執(zhí)行一次,恢復(fù)的數(shù)據(jù)就會(huì)增多或缺失;比如誤將binlog0006或者binlog0008設(shè)置成了最后一個(gè)binlog,那么恢復(fù)的數(shù)據(jù)會(huì)缺失,且無(wú)法達(dá)到預(yù)期效果。
8. 重放relaylog
將下載的binlog復(fù)制到新實(shí)例的logdir中,并將除最后一個(gè)binlog(覆蓋恢復(fù)時(shí)間點(diǎn)的binlog)之外的binlog重命名為relaylog,然后使用新實(shí)例重放這些relaylog。
//將binlog重命名,relaylog文件名可在mysql實(shí)例中執(zhí)行show variables like '%relay%'查看.
rename mysql-bin MySQL2-relay-bin mysql-bin*
//將relay信息初始化到index文件中
ls ./MySQL2-relay-bin.0000*>MySQL2-relay-bin.index
//將這些文件復(fù)制到data文件中
cp MySQL2-relay-bin.*/data/mysql/
//文件賦權(quán)
chown -R mysql:mysql /data/mysql
//啟動(dòng)mysql實(shí)例
systemctl start mysql
//change master to一個(gè)不存在的實(shí)例,模擬此實(shí)例為一個(gè)備庫(kù),指定一個(gè)空的主庫(kù),創(chuàng)建SQL線程,然后根據(jù)備份記錄的binlogfile和binlogpos來(lái)設(shè)置。并啟動(dòng)slave的sql_thread
CHANGE MASTER TO MASTER_HOST='1.1.1.1',RELAY_LOG_FILE='MySQL2-relay-bin.000011',RELAY_LOG_POS=160338;
START SLAVE SQL_THREAD;
show slave status\G
9. 驗(yàn)證relaylog重放成功
通過(guò)show slave status\G,來(lái)進(jìn)行驗(yàn)證,此步驟一般恢復(fù)較慢,取決于數(shù)據(jù)庫(kù)binlog個(gè)數(shù)及binlog大小。
驗(yàn)證1:查看relay_log_file字段的值是否為我們?cè)贛ySQL2-relay-bin.index文件中維護(hù)的最大的值,如果是的話,則證明所有的bilog已重放成功;
驗(yàn)證2:查看Slave_SQL_Running字段是否為YES。
如下圖所示:
圖5
10. 通過(guò)mysqlbinlog功能裁剪恢復(fù)時(shí)間點(diǎn)上的binlog,并生成sql文件
至此,1-9步驟已經(jīng)恢復(fù)了絕大部分?jǐn)?shù)據(jù)了,剩余了一個(gè)覆蓋我們恢復(fù)時(shí)間點(diǎn)的binlog未進(jìn)行恢復(fù)。
那么我們?nèi)绾蝸?lái)進(jìn)行操作呢?
如下圖所示:
圖6
根據(jù)客戶的時(shí)間點(diǎn)(如需要恢復(fù)至15:00的數(shù)據(jù)),RDS管控需要將覆蓋我們恢復(fù)時(shí)間點(diǎn)的binlog根據(jù)恢復(fù)時(shí)間進(jìn)行裁剪,也就是只應(yīng)用12:00-15:00的數(shù)據(jù),15:00至18:00的數(shù)據(jù)屬于誤操作時(shí)間,不應(yīng)該拿來(lái)應(yīng)用。
//使用mysqlbinlog工具的裁剪功能對(duì)該binlog進(jìn)行裁剪
mysqlbinlog --start-position=4--stop-datetime='2021-04-23 15:00:00'-R -h127.0.0.1-uroot -pxxxx -P3306 mysql-bin.007>/tmp/mysql-bin.007.sql
11. 目的實(shí)例通過(guò)sql文件,執(zhí)行需要恢復(fù)的數(shù)據(jù)
在目的實(shí)例上執(zhí)行該sql文件。
//賦權(quán)
chown mysql:mysql /tmp/mysql-bin.007.sql
//恢復(fù)數(shù)據(jù)
mysql -uroot -pxxxx -h127.0.0.1-P3306 -f --max_allowed_packet=1073741824/root/mysql-bin.007.sql
12. 驗(yàn)證數(shù)據(jù)
至此,整體的備份恢復(fù)就已經(jīng)完成了,下面就需要客戶來(lái)進(jìn)行驗(yàn)證數(shù)據(jù),已經(jīng)將目的實(shí)例的數(shù)據(jù)恢復(fù)到源實(shí)例中。
我們是阿里云智能全球技術(shù)服務(wù)-SRE團(tuán)隊(duì),我們致力成為一個(gè)以技術(shù)為基礎(chǔ)、面向服務(wù)、保障業(yè)務(wù)系統(tǒng)高可用的工程師團(tuán)隊(duì);提供專業(yè)、體系化的SRE服務(wù),幫助廣大客戶更好地使用云、基于云構(gòu)建更加穩(wěn)定可靠的業(yè)務(wù)系統(tǒng),提升業(yè)務(wù)穩(wěn)定性。我們期望能夠分享更多幫助企業(yè)客戶上云、用好云,讓客戶云上業(yè)務(wù)運(yùn)行更加穩(wěn)定可靠的技術(shù),您可用釘釘掃描下方二維碼,加入阿里云SRE技術(shù)學(xué)院釘釘圈子,和更多云上人交流關(guān)于云平臺(tái)的那些事。
原文鏈接:https://developer.aliyun.com/article/784887?
版權(quán)聲明:本文內(nèi)容由阿里云實(shí)名注冊(cè)用戶自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,阿里云開發(fā)者社區(qū)不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。具體規(guī)則請(qǐng)查看《阿里云開發(fā)者社區(qū)用戶服務(wù)協(xié)議》和《阿里云開發(fā)者社區(qū)知識(shí)產(chǎn)權(quán)保護(hù)指引》。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,填寫侵權(quán)投訴表單進(jìn)行舉報(bào),一經(jīng)查實(shí),本社區(qū)將立刻刪除涉嫌侵權(quán)內(nèi)容。
到此這篇關(guān)于Mysql數(shù)據(jù)庫(kù)按時(shí)間點(diǎn)恢復(fù)實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)Mysql恢復(fù)數(shù)據(jù)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- Mysql的Binlog數(shù)據(jù)恢復(fù):不小心刪除數(shù)據(jù)庫(kù)詳解
- MySQL數(shù)據(jù)庫(kù)運(yùn)維之?dāng)?shù)據(jù)恢復(fù)的方法
- Navicat for MySQL定時(shí)備份數(shù)據(jù)庫(kù)及數(shù)據(jù)恢復(fù)詳解
- 詳解如何通過(guò)Mysql的二進(jìn)制日志恢復(fù)數(shù)據(jù)庫(kù)數(shù)據(jù)
- 關(guān)于mysql數(shù)據(jù)庫(kù)誤刪除后的數(shù)據(jù)恢復(fù)操作說(shuō)明
- 淺談mysqldump使用方法(MySQL數(shù)據(jù)庫(kù)的備份與恢復(fù))
- mysql二進(jìn)制日志文件恢復(fù)數(shù)據(jù)庫(kù)
- 教你自動(dòng)恢復(fù)MySQL數(shù)據(jù)庫(kù)的日志文件(binlog)