MySQL的binlog詳解

什麼是binlog
binlog日誌用於記錄所有更新了數據或者已經潛在更新了數據(例如,沒有匹配任何行的一個DELETE)的所有語句。語句以“事件”的形式保存,它描述數據更改。

binlog作用
因爲有了數據更新的binlog,所以可以用於實時備份,與master/slave複製

和binlog有關參數


log_bin
設置此參數表示啓用binlog功能,並指定路徑名稱
log_bin_index
設置此參數是指定二進制索引文件的路徑與名稱
binlog_do_db
此參數表示只記錄指定數據庫的二進制日誌
binlog_ignore_db
此參數表示不記錄指定的數據庫的二進制日誌
max_binlog_cache_size
此參數表示binlog使用的內存最大的尺寸
binlog_cache_size
此參數表示binlog使用的內存大小,可以通過狀態變量binlog_cache_use和binlog_cache_disk_use來幫助測試。
binlog_cache_use:使用二進制日誌緩存的事務數量
binlog_cache_disk_use:使用二進制日誌緩存但超過binlog_cache_size值並使用臨時文件來保存事務中的語句的事務數量


max_binlog_size
Binlog最大值,最大和默認值是1GB,該設置並不能嚴格控制Binlog的大小,尤其是Binlog比較靠近最大值而又遇到一個比較大事務時,爲了保證事務的完整性,不可能做切換日誌的動作,只能將該事務的所有SQL都記錄進當前日誌,直到事務結束

sync_binlog
這個參數直接影響mysql的性能和完整性

sync_binlog=0
當事務提交後,Mysql僅僅是將binlog_cache中的數據寫入Binlog文件,但不執行fsync之類的磁盤 同步指令通知文件系統將緩存刷新到磁盤,而讓Filesystem自行決定什麼時候來做同步,這個是性能最好的。

sync_binlog=n,在進行n次事務提交以後,Mysql將執行一次fsync之類的磁盤同步指令,同志文件系統將Binlog文件緩存刷新到磁盤。

Mysql中默認的設置是sync_binlog=0,即不作任何強制性的磁盤刷新指令,這時性能是最好的,但風險也是最大的。一旦系統繃Crash,在文件系統緩存中的所有Binlog信息都會丟失


binlog的刪除
binlog的刪除可以手工刪除或自動刪除

自動刪除binlog
通過binlog參數(expire_logs_days )來實現mysql自動刪除binlog
mysql> show binary logs;
mysql> show variables like 'expire_logs_days';
mysql> set global expire_logs_days=3;

手工刪除binlog
mysql> reset master; //刪除master的binlog
mysql> reset slave; //刪除slave的中繼日誌
mysql> purge master logs before '2012-03-30 17:20:00'; //刪除指定日期以前的日誌索引中binlog日誌文件
mysql> purge master logs to 'binlog.000002'; //刪除指定日誌文件的日誌索引中binlog日誌文件
或者直接用操作系統命令直接刪除


mysql> set sql_log_bin=1/0; //如果用戶有super權限,可以啓用或禁用當前會話的binlog記錄

mysql> show master logs; //查看master的binlog日誌 
mysql> show binary logs; //查看master的binlog日誌
mysql> show master status; //用於提供master二進制日誌文件的狀態信息
mysql> show slave hosts; //顯示當前註冊的slave的列表。不以--report-host=slave_name選項爲開頭的slave不會顯示在本列表中

binglog的查看
通過mysqlbinlog命令可以查看binlog的內容
[root@localhost ~]# mysqlbinlog /home/mysql/binlog/binlog.000003 | more

/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#120330 16:51:46 server id 1 end_log_pos 98 Start: binlog v 4, server v 5.0.45-log created 120330 1
6:51:46
# Warning: this binlog was not closed properly. Most probably mysqld crashed writing it.
# at 196
#120330 17:54:15 server id 1 end_log_pos 294 Query thread_id=3 exec_time=2 error_code=0
SET TIMESTAMP=1333101255/*!*/;
insert into tt7 select * from tt7/*!*/;
# at 294
#120330 17:54:46 server id 1 end_log_pos 388 Query thread_id=3 exec_time=28 error_code=0
SET TIMESTAMP=1333101286/*!*/;
alter table tt7 engine=innodb/*!*/;

 

解析binlog格式

位置
位於文件中的位置,“at 196”說明“事件”的起點,是以第196字節開始;“end_log_pos 294”說明以第294字節結束

 

時間戳
事件發生的時間戳:“120330 17:54:46”

 

事件執行時間
事件執行花費的時間:"exec_time=28"

 

錯誤碼
錯誤碼爲:“error_code=0”

 

服務器的標識
服務器的標識id:“server id 1”

 

(文/Internet)

 

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