bin-log & redo-log & undo logbin log怎么避免從刪庫到跑路 – 詳解 mysql binlog 的配置與使用
bin logbin log結構binlog是可以追加寫(xiě)入的,追加寫(xiě)入指的是binlog文件寫(xiě)到一定大小后會(huì )切換到下一個(gè)文件,并不會(huì )覆蓋以前的文件
bin log恢復數據bin log會(huì )記錄所有的邏輯操作,并且采用“追加寫(xiě)”的形式,如果你的DBA承諾說(shuō)半個(gè)月內可以恢復,那么備份系統中一定會(huì )保存最近半個(gè)月的所有bin-log,同時(shí)系統會(huì )定期做整庫備份
當需要恢復到指定的某一秒時(shí),比如某天下午兩點(diǎn)發(fā)現中午12點(diǎn)有一次誤刪表,需要找回數據,那么可以這么做
binlog一次取出來(lái),重放到中午誤刪表之前的那個(gè)時(shí)刻這樣你的臨時(shí)庫就和誤刪之前的線(xiàn)上庫一樣了,然后你可以把表數據從臨時(shí)庫中求出來(lái),按需求恢復到線(xiàn)上庫中
redo logmysql日志系統之redo log和bin log
mysql 異常情況下的事務(wù)安全 – 詳解 mysql redolog
對于每次更新來(lái)說(shuō),最簡(jiǎn)單的方法就是每次都把操作記錄到磁盤(pán),去磁盤(pán)找相應的數據,再進(jìn)行更新,但這樣頻繁的IO操作會(huì )導致性能的下降
WAL技術(shù)數據庫如何用 WAL 保證事務(wù)一致性?
再同一事務(wù)中,當有記錄需要更新時(shí),InnoDB引擎將修改結果更新到內存后,會(huì )在redo log添加一行記錄來(lái)記錄“需要在哪個(gè)數據頁(yè)上做什么修改”,并將該記錄的狀態(tài)置為prepare,等到commit提交事務(wù)后,會(huì )將此次事務(wù)中在redo log添加的記錄的狀態(tài)都置為commit狀態(tài),同時(shí),InnoDB引擎會(huì )在適當的時(shí)候,將redo log中狀態(tài)為commit的記錄的修改更新到磁盤(pán)里面,而這個(gè)更新往往是在系統比較空閑的時(shí)候做
這樣的操作叫做Write Ahead Logging,他的關(guān)鍵在于先寫(xiě)日志,再寫(xiě)磁盤(pán)
寫(xiě)日志也是在磁盤(pán)上的寫(xiě)操作,為什么比直接在磁盤(pán)持久化數據高效?
WAL是順序寫(xiě)入的,也就是一直在文件末尾append,而持久化數據庫的數據是一個(gè)隨機寫(xiě)入的操作,順序寫(xiě)會(huì )節省大量磁盤(pán)懸臂來(lái)回尋址的過(guò)程,效率更高
現在是否還需要WAL?
現在都用SSD而不在使用HARD,SSD沒(méi)有機械結構,無(wú)需尋道,那么上面所說(shuō)的優(yōu)點(diǎn)是否就不存在了?
redo-log的結構InnoDB 的 redo log 是固定大小的,比如可以配置為一組 4 個(gè)文件,每個(gè)文件的大小是 1GB,那么這塊“粉板”總共就可以記錄 4GB 的操作。從頭開(kāi)始寫(xiě),寫(xiě)到末尾就又回到開(kāi)頭循環(huán)寫(xiě)
write pos 是當前記錄的位置,一邊寫(xiě)一邊后移,寫(xiě)到第 3 號文件末尾后就回到 0 號文件開(kāi)頭checkpoint 是當前要擦除的位置,也是往后推移并且循環(huán)的,擦除記錄前要把記錄更新到數據文件write pos 和 checkpoint 之間的是“粉板”上還空著(zhù)的部分,可以用來(lái)記錄新的操作。如果 write pos 追上 checkpoint,表示“粉板”滿(mǎn)了,這時(shí)候不能再執行新的更新,得停下來(lái)先擦掉一些記錄,把 checkpoint 推進(jìn)一下crash-safe有了 redo log,InnoDB 就可以保證即使數據庫發(fā)生異常重啟,之前提交的記錄都不會(huì )丟失,當數據庫發(fā)生宕機重啟后,可以通過(guò)redo log將未落盤(pán)的數據恢復,這個(gè)能力稱(chēng)為 crash-safe
redo log是如何保證crash safe的每條 redolog 都有兩個(gè)狀態(tài) – prepare 與 commit 狀態(tài)
例如對于一張 mysql 表
(CREATE TABLE `A` (`ID` int(10) unsigned NOT NULL AUTO_INCREMENT, `C` int(10) NOT NULL DEFAULT 0, PRIMARY KEY (`ID`)) ENGINE=InnoDB)我們執行一條 SQL 語(yǔ)句:
mysql> update T set c=c 1 where ID=2可以看到,在寫(xiě)入 binlog 及事務(wù)提交前,innodb 先記錄了 redolog,并標記為 prepare 狀態(tài),在事務(wù)提交后,innodb 會(huì )將 redolog 更新為 commit 狀態(tài),這樣在異常發(fā)生時(shí),就可以按照下面兩條策略來(lái)處理:
聯(lián)系客服