Mysql BinLog存儲機(jī)制與數(shù)據(jù)恢復(fù)方式
一,BinLog
Redo Log 是屬于InnoDB引擎所特有的日志,而MySQL Server也有自己的日志,即 Binary log(二進(jìn)制日志),簡稱Binlog。
Binlog是記錄所有數(shù)據(jù)庫表結(jié)構(gòu)變更以及表數(shù)據(jù)修改的二進(jìn)制日志,不會(huì)記錄SELECT和SHOW這類操作。
Binlog日志是以事件形式記錄,還包含語句所執(zhí)行的消耗時(shí)間。
一般情況下,開啟Binlog日志有以下兩個(gè)最重要的使用場景:
- 主從復(fù)制:在主庫中開啟Binlog功能,這樣主庫就可以把Binlog傳遞給從庫,從庫拿到 Binlog后實(shí)現(xiàn)數(shù)據(jù)恢復(fù)達(dá)到主從數(shù)據(jù)一致性。
- 數(shù)據(jù)恢復(fù):通過mysqlbinlog工具來恢復(fù)數(shù)據(jù),尤其是刪除數(shù)據(jù)。
二,BinLog文件記錄模式
Binlog文件名默認(rèn)為“主機(jī)名_binlog-序列號”格式,例如oak_binlog-000001,也可以在配置文件 、中指定名稱。
文件記錄模式有STATEMENT、ROW和MIXED三種:
ROW(row-based replication, RBR):日志中會(huì)記錄每一行數(shù)據(jù)被修改的情況,然后在 slave端對相同的數(shù)據(jù)進(jìn)行修改。
- 優(yōu)點(diǎn):能清楚記錄每一個(gè)行數(shù)據(jù)的修改細(xì)節(jié),能完全實(shí)現(xiàn)主從數(shù)據(jù)同步和數(shù)據(jù)的恢復(fù)。
- 缺點(diǎn):批量操作,會(huì)產(chǎn)生大量的日志,尤其是alter table會(huì)讓日志暴漲。
STATMENT(statement-based replication, SBR):每一條被修改數(shù)據(jù)的SQL都會(huì)記錄到 master的Binlog中,slave在復(fù)制的時(shí)候SQL進(jìn)程會(huì)解析成和原來master端執(zhí)行過的相同的 SQL再次執(zhí)行。簡稱SQL語句復(fù)制。(Sql語句的復(fù)制和Redo Log有相似)
- 優(yōu)點(diǎn):日志量小,減少磁盤IO,提升存儲和恢復(fù)速度
- 缺點(diǎn):在某些情況下會(huì)導(dǎo)致主從數(shù)據(jù)不一致,比如last_insert_id()、now()等函數(shù)。
MIXED(mixed-based replication, MBR):以上兩種模式的混合使用,一般會(huì)使用 STATEMENT模式保存binlog,對于STATEMENT模式無法復(fù)制的操作使用ROW模式保存 binlog,MySQL會(huì)根據(jù)執(zhí)行的SQL語句選擇寫入模式。
三,BinLog文件結(jié)構(gòu)
MySQL的binlog文件中記錄的是對數(shù)據(jù)庫的各種修改操作,用來表示修改操作的數(shù)據(jù)結(jié)構(gòu)是Log event。
不同的修改操作對應(yīng)的不同的log event。
比較常用的log event有:Query event、Row event、Xid event等。binlog文件的內(nèi)容就是各種Log event的集合。
Log Event結(jié)構(gòu)圖:
四,BinLog 寫入機(jī)制
1,根據(jù)記錄模式和操作觸發(fā)event事件生成log event(事件觸發(fā)執(zhí)行機(jī)制)
2,將事務(wù)執(zhí)行過程中產(chǎn)生log event寫入緩沖區(qū),每個(gè)事務(wù)線程都有一個(gè)緩沖區(qū) Log Event保存在一個(gè)binlog_cache_mngr數(shù)據(jù)結(jié)構(gòu)中,在該結(jié)構(gòu)中有兩個(gè)緩沖區(qū),一個(gè)是 stmt_cache,用于存放不支持事務(wù)的信息;另一個(gè)是trx_cache,用于存放支持事務(wù)的信息。
3,事務(wù)在提交階段會(huì)將產(chǎn)生的log event寫入到外部binlog文件中。 不同事務(wù)以串行方式將log event寫入binlog文件中,所以一個(gè)事務(wù)包含的log event信息在 binlog文件中是連續(xù)的,中間不會(huì)插入其他事務(wù)的log event。
五,BinLog 與 redo Log區(qū)別
Redo Log是屬于InnoDB引擎功能,Binlog是屬于MySQL Server自帶功能,并且是以二進(jìn)制 文件記錄。
- Redo Log屬于物理日志,記錄該數(shù)據(jù)頁更新狀態(tài)內(nèi)容,Binlog是邏輯日志,記錄更新過程。
- Redo Log日志是循環(huán)寫,日志空間大小是固定,Binlog是追加寫入,寫完一個(gè)寫下一個(gè),不會(huì)覆蓋使用。
- Redo Log作為服務(wù)器異常宕機(jī)后事務(wù)數(shù)據(jù)自動(dòng)恢復(fù)使用,Binlog可以作為主從復(fù)制和數(shù)據(jù)恢 復(fù)使用。Binlog沒有自動(dòng)crash-safe能力。
六,BinLog 日志分析與恢復(fù)
I,BinLog開啟相關(guān)配置要修改my.cnf或my.ini配置文件,在[mysqld]下面log_bin=mysql_bin_log
II. 查看服務(wù)器上有哪些BinLog文件命令: show binary logs;
III.查看當(dāng)前朝哪一個(gè)文件中寫入內(nèi)容命令: show master status;
IV.查看當(dāng)前有哪一些事件類型命令:show binlog events; or 指定文件名稱 show binlog events in 文件名
V.mysqlbinlog 文件名,查看BinLog內(nèi)容(此命令非cmd命令,需要到安裝mysql服務(wù)器上執(zhí)行),執(zhí)行該命令時(shí)需要注意不能帶有分號,否則報(bào)錯(cuò)
如果想要恢復(fù)這一段,那么就要使用到起始點(diǎn)和結(jié)束點(diǎn),或者去使用時(shí)間,但是時(shí)間不規(guī)范,因?yàn)橥瑫r(shí)間并發(fā)操作下,恢復(fù)可能會(huì)出現(xiàn)問題。
mysqldump:定期全部備份數(shù)據(jù)庫數(shù)據(jù)。mysqlbinlog可以做增量備份和恢復(fù)操作。
恢復(fù)命令如下:
按指定時(shí)間恢復(fù)
mysqlbinlog --start-datetime="2021-10-27 14:23:00" --stopdatetime="2021-10-27 14:30:00" mysqlbinlog.000002 | mysql -uXXX -pXXX
按事件位置號恢復(fù)
mysqlbinlog --start-position=9281 --stop-position=9232 mysqlbinlog.000002 | mysql -uXXX -pXXX
VI.BinLog 文件刪除
purge binary logs to 'mysqlbinlog.000001'; //刪除指定文件 purge binary logs before '2021-10-27 00:00:00'; //刪除指定時(shí)間之前的文件 reset master; //清除所有文件
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- MySQL開啟配置binlog及通過binlog恢復(fù)數(shù)據(jù)步驟詳析
- MySQL BinLog如何恢復(fù)誤更新刪除數(shù)據(jù)
- MySQL誤刪后使用binlog恢復(fù)數(shù)據(jù)的實(shí)現(xiàn)方法
- MySQL使用binlog日志進(jìn)行數(shù)據(jù)庫遷移和數(shù)據(jù)恢復(fù)
- Mysql如何通過binlog日志恢復(fù)數(shù)據(jù)詳解
- mysql5.7使用binlog 恢復(fù)數(shù)據(jù)的方法
- mysql通過binlog定時(shí)備份數(shù)據(jù)庫與恢復(fù)的方法
相關(guān)文章
Linux中部署MySQL環(huán)境的四種方式圖文詳解
這篇文章主要介紹了Linux中部署MySQL環(huán)境的四種方式,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-11-11DBeaver連接mysql數(shù)據(jù)庫圖文教程(超詳細(xì))
本文主要介紹了DBeaver連接mysql數(shù)據(jù)庫圖文教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07Ubuntu與windows雙系統(tǒng)下共用MySQL數(shù)據(jù)庫的方法
ubuntu系統(tǒng)和windows系統(tǒng)雙系統(tǒng)共用是用戶喜歡使用的方式之一,而MySQL是一個(gè)小型關(guān)系型數(shù)據(jù)庫管理系統(tǒng),在Windows平臺中常以WAMP方式搭配使用,在Linux平臺中常以LAMP組合形式出現(xiàn),下面的方法可以使得Ubuntu平臺共用Windows平臺中的MySQL數(shù)據(jù)庫2012-01-01mysql 數(shù)據(jù)庫鏈接狀態(tài)確認(rèn)實(shí)驗(yàn)(推薦)
這篇文章主要介紹了mysql 數(shù)據(jù)庫鏈接狀態(tài)確認(rèn)實(shí)驗(yàn),通過本文我選擇 了三種方案給大家詳細(xì)講解,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09基于C++實(shí)現(xiàn)Mysql數(shù)據(jù)庫連接池實(shí)例
數(shù)據(jù)庫連接池負(fù)責(zé)分配、管理、和釋放數(shù)據(jù)庫連接,允許使用應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫連接。數(shù)據(jù)庫連接是關(guān)鍵有限且昂貴的資源,一個(gè)數(shù)據(jù)庫連接對象均對應(yīng)一個(gè)物理數(shù)據(jù)庫的連接,每次操作都打開一個(gè)物理連接,使用完都關(guān)閉連接2022-12-12mysql中整數(shù)數(shù)據(jù)類型tinyint詳解
大家好,本篇文章主要講的是mysql中整數(shù)數(shù)據(jù)類型tinyint詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12