MYSQL专题-使用Binlog日志恢复MySQL数据
大家有沒(méi)有碰到過(guò)由于誤操作把測(cè)試數(shù)據(jù)庫(kù)的一張表給刪除了,導(dǎo)致測(cè)試的數(shù)據(jù)都被刪除了,然后手足無(wú)措,測(cè)試把你一定數(shù)落,頓時(shí)感覺(jué)自己要死了?今天就教你即使誤刪了也可以將刪除的數(shù)據(jù)恢復(fù),以后誤刪再也不用驚嚇了。當(dāng)然,實(shí)際操作中最好還是認(rèn)真對(duì)待,小心操作。還有就是在大公司內(nèi),數(shù)據(jù)也不是你想刪就能刪掉的,有無(wú)數(shù)權(quán)限/備份阻攔著你,所以通常情況下你都不會(huì)有機(jī)會(huì),但還是備著以防萬(wàn)一。
Binlog簡(jiǎn)述
MySql數(shù)據(jù)恢復(fù)主要依賴的是Binlog日志,在之前的文章中MYSQL專題-MySQL三大日志binlog、redo log和undo log也有講過(guò),大家有興趣可以去看看,這里簡(jiǎn)單介紹一下:
- binlog是記錄所有數(shù)據(jù)庫(kù)表結(jié)構(gòu)變更(例如CREATE、ALTER TABLE…)以及表數(shù)據(jù)修改(INSERT、UPDATE、DELETE…)的二進(jìn)制日志;
- binlog不會(huì)記錄SELECT和SHOW這類操作,因?yàn)檫@類操作對(duì)數(shù)據(jù)本身并沒(méi)有修改,但你可以通過(guò)查詢通用日志來(lái)查看MySQL執(zhí)行過(guò)的所有語(yǔ)句。
通過(guò)Binlog日志,我們解決以下的問(wèn)題:
- 恢復(fù)數(shù)據(jù):(今天要說(shuō)的重點(diǎn));
- 數(shù)據(jù)庫(kù)復(fù)制:主從數(shù)據(jù)庫(kù)是通過(guò)將binlog傳給從庫(kù),從庫(kù)有兩個(gè)線程,一個(gè)I/O線程,一個(gè)SQL線程,I/O線程讀取主庫(kù)傳過(guò)來(lái)的binlog內(nèi)容并寫(xiě)入到relay log,SQL線程從relay log里面讀取內(nèi)容,寫(xiě)入從庫(kù)的數(shù)據(jù)庫(kù);
- 審計(jì):用戶可以通過(guò)二進(jìn)制日志中的信息來(lái)進(jìn)行審計(jì),判斷是否有對(duì)數(shù)據(jù)庫(kù)進(jìn)行注入攻擊。
所以說(shuō),想要能夠恢復(fù)數(shù)據(jù),首先你得打開(kāi)Mysql的binlog,在平常你自己安裝的單機(jī)Mysql中,默認(rèn)情況下不會(huì)開(kāi)啟。下面就一步步地實(shí)踐下如何開(kāi)啟你服務(wù)器上的Binlog日志。
Binlog開(kāi)啟(Windows示范)
首先進(jìn)入數(shù)據(jù)庫(kù)控制臺(tái),運(yùn)行指令:
可以看到我們的binlog是開(kāi)啟的(MySql8.0.21默認(rèn)是開(kāi)啟的狀態(tài),8.0以后都是默認(rèn)開(kāi)啟,加了反而會(huì)報(bào)錯(cuò)),如果你的是低版本的沒(méi)有開(kāi)啟,輸入 net stop mysql停止MySql,修改mysql的配置文件my.ini。添加如下配置:
輸入 net start mysql重啟mysql服務(wù),然后再執(zhí)行show variables like 'log_bin’就可以看到已經(jīng)開(kāi)啟了,執(zhí)行 show binary logs,發(fā)現(xiàn)有對(duì)應(yīng)的binlog日志:
當(dāng)然你也可以到對(duì)應(yīng)的Mysql安裝目錄的data中進(jìn)行查看:
如果想關(guān)閉binlog日志,低版本的直接去掉就行,自動(dòng)默認(rèn)的加入skip-log-bin,然后重啟即可。需要說(shuō)明的是,每當(dāng)我們重啟MySQL一次,會(huì)自動(dòng)生成一個(gè)binlog文件。我們也可以手動(dòng)的來(lái)刷新binlog文件,通過(guò) flush logs,同樣會(huì)新創(chuàng)建一個(gè)binlog文件。實(shí)際上當(dāng)服務(wù)器在重啟時(shí),也會(huì)調(diào)用flush logs操作。
Binlog實(shí)操
首先新建數(shù)據(jù)庫(kù)binLogTest,新建一張表tableLog1,SQL代碼如下:
CREATE DATABASE `binLogTest` ; USE `binLogTest`; DROP TABLE IF EXISTS `tableLog1`; CREATE TABLE `tableLog1` (`id` int(11) DEFAULT NULL,`name` varchar(20) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;然后插入兩條數(shù)據(jù),分別是 (1,‘tom’),(2,‘jack’)
INSERT INTO `tableLog1` VALUES (1,'tom'),(2,'jack');執(zhí)行完成以后,我們?cè)倏刂婆_(tái)使用show master status看以下binlog日志的狀態(tài):
可以看到,現(xiàn)在我們正在使用 binlog.0000004 ,并且這個(gè)文件現(xiàn)在正在記錄到1207行。
然后,使用flush logs來(lái)主動(dòng)刷新一次binlog,然后再次查看狀態(tài):
可以看到,現(xiàn)在日志文件在 binlog.000005 文件中,位置為156。也就是我們主動(dòng)刷新了一次binlog,生成了新的binlog.000005,而binlog.000004則已經(jīng)歸檔了,不會(huì)再寫(xiě)入新的日志進(jìn)去了。
接下來(lái)我們?cè)俨迦雰蓷l數(shù)據(jù):
可以看到我們已經(jīng)成功插入了4條數(shù)據(jù):
我們?cè)俅蝔lush logs,把binlog.000005日志存檔,開(kāi)啟新的binlog.000006日志,這樣,每次我們插入的數(shù)據(jù)彼此獨(dú)立。實(shí)際情況下,binlog會(huì)比較復(fù)雜,這里也是做了簡(jiǎn)化,為了理解更方便。
然后我們刪除id為4的數(shù)據(jù),并且再次刷新binlog,如此一來(lái),binlog.000006里面只有一條刪除操作:
我們來(lái)好好觀察下binlog.00005和binlog.00006兩個(gè)binlog,使用命令:show binlog events in 'binlog.000005’和show binlog events in ‘binlog.000006’:
一條插入操作的完整日志如上面標(biāo)注所示。我們的目的是恢復(fù)誤刪的數(shù)據(jù),其實(shí)就是將binlog.000005日志的插入記錄重演一遍,而不需要理會(huì)binlog.000006的操作(因?yàn)閯h除是一個(gè)誤操作)。在實(shí)際的線上環(huán)境中,我們肯定需要將binlog導(dǎo)出后,仔細(xì)篩選出誤操作,并將其排除,之后再運(yùn)行binlog,這里為了方便演示直接進(jìn)行。我們只做一個(gè)恢復(fù)兩條插入語(yǔ)句的操作。
首先看到我們的數(shù)據(jù)庫(kù)中的確是不存在id為4的記錄。
然后我們執(zhí)行以下語(yǔ)句:
需要說(shuō)明的是,這里的語(yǔ)句執(zhí)行不要在Mysql中執(zhí)行,否則會(huì)報(bào)錯(cuò):
應(yīng)該在binlog所在地方再開(kāi)一個(gè)執(zhí)行窗口執(zhí)行:
執(zhí)行完成以后我們?cè)诳匆幌聰?shù)據(jù):
看到的確是恢復(fù)了數(shù)據(jù),為什么會(huì)有兩條id為3的數(shù)據(jù),是因?yàn)槲覀儓?zhí)行的文件是插入id為3和4的binlog,大家可以依據(jù)自己數(shù)據(jù)的情況進(jìn)行恢復(fù),只要配置不同的起始位置即可:
還有一點(diǎn)需要說(shuō)明的,在最開(kāi)始執(zhí)行語(yǔ)句沒(méi)有加入–no-defaults,導(dǎo)致出錯(cuò):
大家加入即可。
看完binlog日志恢復(fù)數(shù)據(jù)的原理,希望大家以后在定期備份數(shù)據(jù)庫(kù)的腳本里,也能夠加上刷新binlog日志的命令,這樣一旦某天丟失數(shù)據(jù),可以將當(dāng)天binlog數(shù)據(jù)單獨(dú)拿出來(lái)還原,做到清晰可辨,也加快恢復(fù)效率。
猜你感興趣:
MYSQL專題-絕對(duì)實(shí)用的MYSQL優(yōu)化總結(jié)
MYSQL專題-MySQL事務(wù)實(shí)現(xiàn)原理
MYSQL專題-MVCC多版本并發(fā)控制
MYSQL專題-MySQL三大日志binlog、redo log和undo log
更多文章請(qǐng)點(diǎn)擊:更多…
總結(jié)
以上是生活随笔為你收集整理的MYSQL专题-使用Binlog日志恢复MySQL数据的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 教你用BitMap排序、查找和存储大量数
- 下一篇: Redis专题-缓存穿透、缓存雪崩、缓存