MySQL binlog簡介

binlog是用於記錄數據庫的修改以及潛在的修改行爲的二進制文件。爲了提高性能,mysql默認只打了一些錯誤日誌,若要開啓binlog,需要做如下操作:

windows環境在my.ini文件中添加log-bin=C:/Program Files/MySQL/MySQL Server 5.5/binlog/mysqlbin-log,重啓mysql服務後生效;

linux環境在my.cnf中添加log-bin=.../mysqlbin-log,重啓mysql服務後生效。


binlog文件有多個,包括一個索引文件(mysqlbin-log.index)和一系列日誌文件(mysqlbin-log.000001...mysqlbin-log.xxxxxx)。

索引文件跟蹤所有的日誌文件,控制日誌文件的創建和命名,索引文件的每一行都包含一個完整的日誌文件,要查看所有的日誌文件,可以使用命令:show binary logs,會列出所有的binlog文件,及其每個文件的大小。可以在my.ini中修改binlog文件的大小ma_binlog_size=xx如果超過這個值會重新創建一個binlog文件。mysql服務重啓一次也會創建一個新的binlog文件。

每個binlog文件由若干binlog事件組成,以Format_desc事件開始,以日誌輪換事件結束。這些binlog事件按事務分爲多個組,如果一個語句支持事務,那麼它所包含的多個事件形成一個組,如果不支持事務,或者只有一個事件的單條語句,自成一組。所以,在binlog文件中的事件組要麼是不屬於事務的單個語句,要麼是由多條語句組成的事務。
每個事件由通用頭、提交頭、事件體組成。每個事件都有一個固定大小(19字節)的通用頭
SQL開始時間:4字節
事件類型:1字節
服務器ID:4字節
事件大小:4字節
下個事件開始位置:4字節
狀態信息:2字節
可以使用mysqlbinlog工具來查看二進制文件的通用頭。提交頭與特定的事件類型有關,但是在同一個binlog文件中同一種事件類型大小固定。事件體存儲事件的主要數據,內容因事件類型不同而異。

爲了避免兩個線程同時更新一個日誌,在事件寫入二進制日誌之前,需要獲取一把互斥鎖。
數據操作語言(DML):對於DELETE,INSERT,UPDATE等語句,爲了保證數據一致性,在寫二進制日誌之前還需要獲取一把事務級鎖,寫完後釋放。
數據定義語言(DDL):對於ALTER,CREATE等語句直接修改表的數據結構,在修改之前也需要先獲取鎖,由於這樣的鎖只有一把,所以常做這樣的操作會有性能問題。
查詢語句:最常見的binlog事件是查詢事件,除了實際執行的語句外,Query事件還包括一些附加信息,這些附加信息在不同的上下文取值可能不同,所以在Query事件中需要記錄這些附加值。這些值包括
當前數據庫:如果語句中全用了表或者數據庫,默認用當前數據庫;
RAND函數的種子:如果語句中用到了隨機函數,需要記錄種子;
當前時間:語句開始的時間是隱式信息,也是需要記錄的;
自增字段插入值:對於標識爲AUTO_INCREMENT的字段,新插入的值也是隱式的;
LAST_INSERT_ID:與AUTO_INCREMENT類似,取決於上一個語句的插入值;
線程ID:有些語句的線程ID是隱式的。


 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章