MySQL中的binlog日志操作示例
一、什么是binlog?
binlog(二進制日志)是MySQL用來記錄所有數(shù)據(jù)變更操作的文件。
就像一個"監(jiān)控錄像",MySQL把每一個INSERT、UPDATE、DELETE操作都記錄下來。
二、為什么需要binlog?
想象一個場景:你的電商系統(tǒng)突然宕機了,已經(jīng)處理的訂單數(shù)據(jù)丟失。這時候有了binlog就像有了"黑匣子",你可以用它來恢復丟失的數(shù)據(jù)。
2-1、binlog的主要用途有三個:
1. 數(shù)據(jù)恢復 - 系統(tǒng)故障時,可以用binlog恢復到某個時間點的數(shù)據(jù)狀態(tài)
2. 主從復制 - 從庫通過讀主庫的binlog來保持數(shù)據(jù)同步。這是構(gòu)建高可用系統(tǒng)的基礎(chǔ)
3. 審計追蹤 - 可以查看誰在什么時間修改了什么數(shù)據(jù)
2-2、binlog的三種格式
1、STATEMENT格式(記錄SQL語句)
比如你執(zhí)行:UPDATE users SET age = age + 1 WHERE id > 100 binlog就記錄這條SQL語句原文
優(yōu)點:記錄量小,節(jié)省空間
缺點:某些函數(shù)(如NOW())可能導致從庫數(shù)據(jù)不一致
2、ROW格式(記錄行數(shù)據(jù)變化)
不記錄SQL語句,而是記錄"id=101的用戶age字段從20變成21" 詳細記錄每一行數(shù)據(jù)變化前后的值
優(yōu)點:最安全,不會有數(shù)據(jù)不一致的問題
缺點:記錄量大,占用空間多
3、MIXED格式(混合模式)
MySQL智能選擇:普通操作用STATEMENT格式,可能有問題的操作用ROW格式
三、如何啟用binlog?
編輯MySQL配置文件 my.cnf:
[mysqld] server-id = 1 log-bin = /var/log/mysql/mysql-bin binlog-format = ROW expire-logs-days = 7
然后重啟MySQL服務。
四、實際操作示例
查看binlog是否啟用:
SHOW VARIABLES LIKE 'log_bin'; -- 結(jié)果:ON 表示已啟用
查看當前binlog文件列表:
SHOW BINARY LOGS; -- 顯示:mysql-bin.000001, mysql-bin.000002 等

查看binlog內(nèi)容(以可讀的方式):
mysqlbinlog /var/log/mysql/mysql-bin.000001
輸出會顯示類似這樣的內(nèi)容:
# at 154 #250107 10:30:45 server id 1 end_log_pos 235 Query thread_id=2 exec_time=0 error_code=0 SET TIMESTAMP=1704597045/*!*/; INSERT INTO users (id, name, age) VALUES (1, 'Alice', 25)
4-1、一個完整的場景理解
假設(shè)你有個電商系統(tǒng):
10:00 - 用戶購買商品,訂單狀態(tài)改為"已支付" 10:05 - 系統(tǒng)宕機了 10:10 - 系統(tǒng)恢復,但這5分鐘的數(shù)據(jù)丟了 此時你可以: 1. 查看binlog中10:00-10:05的所有操作 2. 用mysqlbinlog工具恢復這部分數(shù)據(jù) 3. 系統(tǒng)恢復正常
五、三個日志的作用
- undo log:用于事務回滾,記錄數(shù)據(jù)修改前的舊值
- redo log:用于崩潰恢復,記錄數(shù)據(jù)修改后的新值
- binlog:用于主從復制和數(shù)據(jù)恢復,記錄所有數(shù)據(jù)變更
5-1、三種日志的層次歸屬
| 日志類型 | 所屬層次 | 文件后綴 | 負責模塊 |
|---|---|---|---|
| Binlog | Server層 | .000001, .000002... | MySQL Server |
| Undo Log | 存儲引擎層 (InnoDB) | ibdata1, undo001 | InnoDB 引擎 |
| Redo Log | 存儲引擎層 (InnoDB) | ib_logfile0, ib_logfile1 | InnoDB 引擎 |
5-2、詳細對比三種日志
1. Binlog(二進制日志)
歸屬:Server層(所有引擎共用)
作用:主從復制 + 數(shù)據(jù)恢復
特點:
• 邏輯日志:記錄SQL語句或行變化(ROW格式記錄變化前后的值)
• 追加寫入:一直往后寫,文件滿了切下一個
• 所有引擎共享:不管用InnoDB還是MyISAM,都會記錄
為什么 Binlog 在 Server 層?
設(shè)計目標:支持所有存儲引擎的主從復制
2. Undo Log(回滾日志)
歸屬:存儲引擎層(InnoDB特有)
作用:事務回滾 + MVCC多版本控制
特點:
• 物理日志:記錄數(shù)據(jù)修改前的舊版本
• 循環(huán)使用:空間會被復用
• 實現(xiàn)MVCC:提供事務的隔離性(可重復讀)
3. Redo Log(重做日志)
歸屬:存儲引擎層(InnoDB特有)
作用:崩潰恢復 + 保證持久性
特點:
• 物理日志:記錄數(shù)據(jù)頁的物理變化
• 循環(huán)寫入:固定大小文件循環(huán)寫
• Write-Ahead Logging:先寫日志,后寫數(shù)據(jù)
為什么 Redo/Undo 在引擎層?
設(shè)計目標:事務實現(xiàn)是引擎自己的事
不同引擎的事務實現(xiàn)不同:
• InnoDB:需要 Redo/Undo
• MyISAM:根本沒有事務,不需要這些日志
只有 InnoDB 需要 Redo/Undo Log 嗎?
是的!
- MyISAM:沒有事務,崩潰可能丟數(shù)據(jù)
- Memory:數(shù)據(jù)在內(nèi)存,重啟就丟
到此這篇關(guān)于MySQL中的binlog日志操作示例的文章就介紹到這了,更多相關(guān)mysql binlog日志內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL報錯:sql_mode=only_full_group_by的4種輕松解決方法(含舉例)
今天學mysql函數(shù)的時候在自己服務器上的MySQL碰見了個奇怪的問題,下面這篇文章主要給大家介紹了關(guān)于MySQL報錯:sql_mode=only_full_group_by的4種輕松解決方法,需要的朋友可以參考下2023-01-01
Mysql中find_in_set()函數(shù)用法詳解以及使用場景
前幾天在sql查詢的時候,想要判斷數(shù)據(jù)庫中表的某一列中的值是否在List集合中,接觸到了find_in_set的使用,用起來方便快捷,下面這篇文章主要給大家介紹了關(guān)于Mysql中find_in_set()函數(shù)用法詳解以及使用場景的相關(guān)資料,需要的朋友可以參考下2023-03-03
MySQL修改安全策略時報錯:ERROR?1193?(HY000)的解決辦法
這篇文章主要給大家介紹了關(guān)于MySQL修改安全策略時報錯:ERROR?1193?(HY000):?Unknown?system?variable?‘validate_password_policy‘的解決方法,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2023-02-02
PhpMyAdmin 配置文件現(xiàn)在需要一個短語密碼的解決方法
本文主要介紹PhpMyAdmin 配置文件現(xiàn)在需要一個短語密碼的解決方法,比較實用,希望能給大家做一個參考。2016-06-06

