最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL InnoDB 三大文件日志的實(shí)現(xiàn)

 更新時(shí)間:2026年07月06日 09:18:59   作者:掘金小豆  
Undo Log 意為撤銷或取消,以撤銷操作為目的,返回指定某個(gè)狀態(tài)的操作,Undo Log 屬于邏輯日志,記錄一個(gè)變化過(guò)程,主要采用段的方式管理和記錄,本文就來(lái)詳細(xì)的介紹一下,感興趣的可以了解一下

Undo Log

意為撤銷或取消,以撤銷操作為目的,返回指定某個(gè)狀態(tài)的操作。Undo Log 屬于邏輯日志,記錄一個(gè)變化過(guò)程。主要采用段的方式管理和記錄。在 InnoDB 數(shù)據(jù)文件中包含一種 rollback segment 回滾段(內(nèi)部包含了 1024 個(gè) Undo Log Segment),可以通過(guò)參數(shù) innodb_undo 命令控制 Undo Log。

show variables like '%innodb_undo%';

Undo Log 在事務(wù)開始前產(chǎn)生;事務(wù)在提交時(shí),并不會(huì)立刻刪除 Undo Log,InnoDB 會(huì)將該事務(wù)對(duì)應(yīng)的 Undo Log放入到刪除列表中,后面會(huì)通過(guò)后臺(tái)線程 purge thread 進(jìn)行回收處理。例如:執(zhí)行一個(gè) delete,Undo Log 會(huì)記錄一個(gè) insert;執(zhí)行一個(gè) Update,Undo Log 會(huì)記錄一個(gè)相反的 Update 操作。

Undo Log 的作用

  • 實(shí)現(xiàn)事務(wù)的原子性

Undo Log 是為了實(shí)現(xiàn)事務(wù)的原子性而出現(xiàn)的產(chǎn)物。事務(wù)處理過(guò)程中,如果出現(xiàn)了錯(cuò)誤或者用戶執(zhí)行了 ROLLBACK 語(yǔ)句,MySQL 可以利用 Undo Log 中的備份將數(shù)據(jù)恢復(fù)到事務(wù)開始之前的狀態(tài)。

  • 實(shí)現(xiàn)多版本并發(fā)控制(MVCC)

Undo Log 在 MySQL InnoDB 存儲(chǔ)引擎中用來(lái)實(shí)現(xiàn)多版本并發(fā)控制。事務(wù)未提交之前,Undo Log 保存了未提交之前的版本數(shù)據(jù),Undo Log 中的數(shù)據(jù)可作為數(shù)據(jù)舊版本快照供其他并發(fā)事務(wù)進(jìn)行快照讀的操作。

我們看個(gè)案例,如下:

圖中可以看到,事務(wù) A 手動(dòng)開啟事務(wù),執(zhí)行了更新操作,首先會(huì)把更新命中的數(shù)據(jù)備份到 Undo Buffer 中。事務(wù) B 手動(dòng)開啟事務(wù),執(zhí)行了查詢操作,此時(shí)會(huì)讀取 Undo Buffer 中的日志數(shù)據(jù)并返回(進(jìn)行了快照讀操作)。

Redo Log 和 Binlog

Redo Log 和 Binlog 是 MySQL 日志系統(tǒng)中非常重要的兩種機(jī)制。

Redo Log

顧名思義,就是重做,主要用于在數(shù)據(jù)庫(kù)發(fā)送意外時(shí)進(jìn)行數(shù)據(jù)的恢復(fù)。

Redo Log 會(huì)隨著事務(wù)操作的執(zhí)行而生成。在事務(wù)提交的時(shí)候會(huì)將產(chǎn)生的 Redo Log 寫入到 Log Buffer 中,并不是隨著事務(wù)的提交就立刻寫入到磁盤文件。等事務(wù)操作的臟頁(yè)寫入到磁盤之后,Redo Log 的使命也就完成了,此時(shí)Redo Log 占用的空間就可以重用(被覆蓋寫入)。

Redo Log 的工作原理圖

Redo Log 寫入機(jī)制

Redo Log 的文件內(nèi)容是以存下循環(huán)的方式寫入文件中的,寫滿時(shí)則會(huì)回溯到第一個(gè)文件,進(jìn)行覆蓋寫。

如圖所示:

  • Write Pos 是當(dāng)前記錄的位置,一邊寫一邊后移,寫到最后一個(gè)文件末尾后就回到 0 號(hào)文件開頭
  • Check Ponit 是當(dāng)前要擦除的位置,也是往后移動(dòng)并且循環(huán)的,擦除記錄前要把記錄更新到數(shù)據(jù)文件中

Write Pos 和 Check Point 之間還空著的部分可以用來(lái)記錄新的操作。如果 Write Pos 追上 Check Point 則表示已寫滿,此時(shí)不能再繼續(xù)執(zhí)行新的更新了,需要停下來(lái)擦掉一些記錄,把 Check Point 推進(jìn)一下。

Redo Log 的相關(guān)配置

每個(gè) InnoDB 引擎至少擁有 1 個(gè)重做日志文件組(Redo Log Group),每個(gè)文件組至少有 2 個(gè)重做日志文件(Redo Log),默認(rèn)為 ib_logfile0 和 ib_logfile1。Redo Buffer 持久化到 Redo Log 的策略,可以通過(guò)參數(shù) Innodb_flush_log_at_trx_commit 設(shè)置:

Innodb_flush_log_at_trx_commit =0:

  • 表示每秒提交 Redo Buffer -> OS Cache -> flush cache to disk,這個(gè)過(guò)程可能會(huì)丟失 1 秒內(nèi)的事務(wù)數(shù)據(jù)(主要由后臺(tái)的 Master 線程每隔 1 秒執(zhí)行一次操作)。

Innodb_flush_log_at_trx_commit =1:

  • 表示每次事務(wù)提交執(zhí)行時(shí),Redo Buffer -> OS Cache -> flush cache to disk,這是最安全且性能最差的方式。

Innodb_flush_log_at_trx_commit =2:

  • 表示每次事務(wù)提交執(zhí)行時(shí):Redo Buffer -> OS Cache,然后由后臺(tái)的 Master 線程每隔 1 秒執(zhí)行 OS Cache -> flush cahce to disk 的操作。

一般建議選擇取值 2 ,這樣的話 MySQL 掛了時(shí)候不會(huì)丟失數(shù)據(jù),整個(gè) MySQL 訪問掛了才會(huì)損失 1 秒的事務(wù)提交數(shù)據(jù)。

如圖:

Binlog 日志

Binlog 記錄模式

Redo Log 是屬于 InnoDB 引擎所特有的日志,而 MySQL Server 也有自己的日志,這個(gè)日志就是 Binary Log(二進(jìn)制日志),簡(jiǎn)稱 Binlog。

Binlog 以事件的形式記錄了所有數(shù)據(jù)庫(kù)表結(jié)構(gòu)變更以及表數(shù)據(jù)修改的二進(jìn)制日志,還包含了語(yǔ)句所執(zhí)行的消耗時(shí)間,但是不會(huì)記錄 Select 和 Show 這類操作。開啟 Binlog 日志有以下兩個(gè)重要的使用場(chǎng)景。

  • 主從復(fù)制:在主庫(kù)中開啟 Binlog 功能,這樣主庫(kù)就可以把 Binlog 傳遞給從庫(kù),從庫(kù)拿到 Binlog 后實(shí)現(xiàn)數(shù)據(jù)庫(kù)恢復(fù)達(dá)到主從數(shù)據(jù)的一致性。
  • 數(shù)據(jù)恢復(fù):通過(guò) mysqlbinlog 工具來(lái)恢復(fù)數(shù)據(jù)。

Binlog 文件名默認(rèn)為“主機(jī)名_binlog-序列號(hào)”格式,例如 oak_binlog-000001,也可以在配置文件中指定名稱。文件記錄模式有 STATEMENT、ROW 和 MIXED 三種,具體含義如下:

ROW(row-based replication ,簡(jiǎn)稱 RBR):日志中會(huì)記錄每一行數(shù)據(jù)被修改的情況,然后在 slave 端對(duì)相同的數(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ì)讓日志暴漲。

STATEMENT(statement-based replication,簡(jiǎn)稱 SBR):每一條被修改的數(shù)據(jù)的 SQL 都會(huì)記錄到 Master 的 Binlog 中,Slave 在復(fù)制的時(shí)候 SQL 進(jìn)程會(huì)解析成和原來(lái) Master 端執(zhí)行過(guò)的相同的 SQL 再次執(zhí)行。簡(jiǎn)稱 SQL 語(yǔ)句復(fù)制。

  • 優(yōu)點(diǎn):日志量小,減少磁盤的 IO,提升存儲(chǔ)和恢復(fù)速度
  • 缺點(diǎn):在某些情況下會(huì)導(dǎo)致主從數(shù)據(jù)不一致,比如:last_insert_id()、now() 等函數(shù)。

MIXED(mixed-based replication,簡(jiǎn)稱 MBR):以上兩種模式的混合使用,一般會(huì)使用 STATEMENT 模式保存 Binlog ,對(duì)于 STATEMENT 模式無(wú)法復(fù)制的操作使用 ROW 模式保存 Binlog,MySQL 會(huì)根據(jù)執(zhí)行的 SQL 語(yǔ)句選擇寫入模式。

Binlog 文件結(jié)構(gòu)

MySQL 的 Binlog 文件中記錄的是對(duì)數(shù)據(jù)庫(kù)的各種修改操作,用來(lái)表示修改操作的數(shù)據(jù)結(jié)構(gòu)是 Log Event。不同的修改操作對(duì)應(yīng)著不同的 Log Event。比較常用的 log event 有:Query Event、Row Event、Xid Event 等。Binlog 文件的內(nèi)存就是各種 Log Event 的集合。

我們看下 Binlog 文件中的 Log Event 的結(jié)構(gòu)圖,如下:

Binlog 寫入機(jī)制

  • 根據(jù)記錄模式和操作觸發(fā) event 事件并生成 Log Event(事件觸發(fā)執(zhí)行機(jī)制
  • 將事務(wù)執(zhí)行過(guò)程中產(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ù)的消息。

事務(wù)在提交階段會(huì)將產(chǎn)生的 Log Event 寫入到外部的 Binlog 文件中。不同事務(wù)以串行的方式將 Log Event 寫入到 Binlog 文件中,所以一個(gè)事務(wù)包含的 Log Event 信息在 Binlog 文件中是連續(xù)的,中間不會(huì)插入其它事務(wù)的 Log Event。

Binlog 文件操作相關(guān)命令

查看 Binlog 狀態(tài)

show variables like 'log_bin';

開啟 Binlog 功能

set global log_bin=mysqllogbin;(這里可能會(huì)報(bào)錯(cuò):ERROR 1238 (HY000): Variable 'log_bin' is a read only variable),這個(gè)時(shí)候需要修改 my.cnf 或 my.ini 配置文件,在 [mysqld] 下面增加 log_bin=mysql_bin_log,重啟 MYSQL 服務(wù)。

#log-bin=ON
#log-bin-basename=mysqlbinlog
binlog-format=ROW
log-bin=mysqlbinlog

使用 show binlog events 命令

show binary logs;// 等價(jià)于 show master logs;
show master status;
show binlog events;
show binlog events in 'mysqlbinlog.000001';

使用 mysqlbinlog 命令

mysqlbinlog "文件名"
mysqlbinlog "文件名" > "test.sql"

使用 binlog 恢復(fù)數(shù)據(jù)

-- 指定時(shí)間恢復(fù)
mysqlbinlog --start-datetime="2020-0425 18:00:00" --stop-datetime="2020-04-26 00:00:00" mysqlbinlog.000002 | mysql -uroot -p1234

-- 按事件位置號(hào)恢復(fù)
mysqlbinlog --start-position=154 --stop-position=957 mysqlbinlog.000002 | mysql -uroot -p1234

mysqlddump:定期全部備份數(shù)據(jù)庫(kù)數(shù)據(jù)。mysqlbinlog 可以做增量備份和恢復(fù)操作。

刪除 Binlog 文件

-- 刪除指定文件
purge binary logs to 'mysqlbinlog.000001';
-- 刪除指定時(shí)間之前的文件
purge binary logs before '2020-0428 00:00:00';
-- 清除所有文件
reset master;

可以通過(guò)設(shè)置 expire_logs_days 參數(shù)來(lái)啟動(dòng)自動(dòng)清理功能。默認(rèn)值為 0 表示沒啟用。設(shè)置為 1 表示超出 1 天 Binlog 文件會(huì)自動(dòng)刪除掉。

Redo Log 和 Binlog 區(qū)別

Redo Log 是屬于 InnoDB 引擎功能,Binlog 是屬于 MySQL Server 自帶功能,并且是以二進(jìn)制文件進(jìn)行記錄的。

Redo Log 屬于物理日志,記錄該數(shù)據(jù)頁(yè)更新狀態(tài)內(nèi)容,Binlog 是邏輯日志,記錄更新的過(guò)程。

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 能力。

到此這篇關(guān)于MySQL InnoDB 三大文件日志的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)MySQL InnoDB文件日志內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

利辛县| 交城县| 铜陵市| 河源市| 北流市| 湖州市| 荆门市| 道孚县| 嘉定区| 色达县| 明溪县| 汪清县| 格尔木市| 海南省| 凤城市| 大同县| 乌拉特中旗| 肥乡县| 鹤庆县| 北安市| 友谊县| 光泽县| 焦作市| 鄂州市| 伊通| 肥西县| 岐山县| 黄山市| 射阳县| 夏邑县| 白河县| 兰考县| 镇雄县| 江山市| 新干县| 江永县| 城固县| 岳池县| 宜宾市| 通榆县| 克什克腾旗|