MySQL日誌 二進位制日誌(1)

2021-07-07 05:06:12 字數 3636 閱讀 5137

一、二進位制日誌的介紹

二進位制日誌的資料當然是二進位制形式了,所以無法直接通過文字工具來檢視,並且二進位制日誌也不是用來檢視的而是通常給mysql使用的。它記錄了對資料發生或潛在發生更改的sql語句。

二進位制日誌的用途有如下幾點:

ø  可以記錄對資料庫所在的變更,包括ddl和dml語句。

ø  用於資料庫的增量備份,增量備份主要就是利用二進位制日誌實現的

ø  可以用於資料庫的災難恢復。對於增量備份也是無法恢復到資料庫傳送災難時刻的狀態的,如果資料庫資料故障發生在增量備份之後的一定時間,那麼增量備份就無法恢復到故障時間點的狀態了而只能恢復到做增量備份時的狀態。但是二進位制日誌卻可以實現完整的恢復資料到崩潰時刻的狀態,前提是二進位制日誌需要持續記錄上一次備份到崩潰時刻的所有二進位制日誌,即備份或增量備份+二進位制日誌來恢復。

ø  mysql複製(replication)的核心組成部分。

所以二進位制日誌是mysql最重要的日誌之一,其實錯誤日子和二進位制日誌都是非常重要的。

二、開啟和關閉二進位制日誌

和通用查詢日誌以及慢查詢日誌一樣,mysql預設也是沒有開啟二進位制日誌的,如果需要則要手動開啟。

1.通過set命令的方式

這種方式的好處就是不用重啟mysql服務就可以生效。最主要的配置是開啟和關閉以及日誌大小的兩個引數。

set @@global.log_bin=1         #開啟二進位制日誌,也可以寫成  set  global log_bin=1 下面也一樣

set @@global.binlog_size=204800       #設定單個二進位制日誌檔案的大小,日誌超出該大小則會生成笑乙個檔案或刪除其中舊的資料,這裡的單位是byte。

其它的二進位制日誌配置引數可以通過檢視variables獲取,例如: show  variables  like %bin%;

2.通過修改my.cnf檔案的方式

修改my.cnf的方式需要重啟mysql才能生效。如果要持久生效,可以先通過set來設定,然後在my.cnf中配置對應的項,這樣本次由set命令生效,下次啟動mysql時就由my.cnf中的生效了。

常用配置項如下:

log-bin=/usr/local/mysql/data/binlog.0001   #沒有等號則就是預設,其他配置項也類似

該配置指定二進位制日誌的路徑和檔名。預設在資料檔案所在目錄,名稱為-bin.***x,其中***x表示二進位制日誌檔案的順序編號,因為會生成多個日誌檔案,每個檔案不超過指定的大小。

該配置非常重要,因為二進位制日誌檔案的增長速度可能比資料庫本身要塊很多。例如對某個表某個一行資料更改了10次,對於資料庫來數隻記錄最後一次更改的最終結果;而對於二進位制日誌檔案則需要記錄10次更改的所有語句。因此對二進位制日誌檔案的位置是需要講究的,可以單獨指定到乙個磁碟的某個分割槽上(掛載點),這樣就不會與資料檔案在同乙個磁碟,減少了io的負擔從而可以提公升資料庫的效能。並且如果使用了mysql的主動複製,那麼從多個從伺服器都要讀取二進位制日誌檔案,所以最好不要放在與資料檔案在同乙個檔案系統上。

max-binlog-size=500m

設定單個二進位制日誌檔案的最大值。預設為1gb,預設最大1gb。也就是二進位制日誌達到了最大值的時候就會自動建立乙個新的日誌檔案,並且新檔案的檔名的字尾數字+1,如localhost-bin.00001達到了最大大小,那麼會自動生成乙個 localhost-bin.00002。因為當乙個檔案很大是對其的讀寫都會變得比較慢。

binlog-do-db與binlog-ignore-db

指定二進位制日誌檔案記錄或不記錄哪些資料庫的操作。如果要配置多個資料庫,多個資料庫以逗號分割。這個配置項通常也是需要配置的!對於使用set命令設定的時候也通常需要指定該引數。

binlog-cache-size=100m

設定二進位制日誌檔案的快取大小。如果對資料庫的資料修改非常頻繁,那麼對於二進位制日誌檔案來說將變得比資料檔案的更改更加頻繁!因此會導致每秒的io次數將變得非常可觀,這樣直接會降低mysql的效能,並且儲存設定對於每秒上千次的io操作也無法承受,因此就需要開啟二進位制日誌的快取,當日誌數量達到定量的時候一次性寫入硬碟而不是每次都寫硬碟,當然如果不設定對於作業系統而言也會有乙個預設的快取大小,但是作業系統的快取是不確定的,通常比較小。

sync-binlog=n

每n秒將快取中的二進位制日誌資料寫到硬碟一次,因此是為了配合binlog-cache-size一起使用的。預設為0,也就是當快取寫滿了才會寫一次硬碟。

不過,你經常會陷入groupcommit函式與io之間二選一的矛盾。如果在replication環境中,由於考慮到耐久性和一致性,需要將sync-binlog設定為1。同時還需要設定innodb_flush_log_at_trx_commit=1以及innodb-support-xa=1(預設開啟)。

group commit的意思是,例如對資料的更改可能是由併發事務所產生的,這些併發的事務都會產生資料的更改,因此也都需要將它們的所有更改操作記錄到二進位制日誌中,而二進位制日誌的記錄是需要等待乙個事務結束之後才可以寫入的,也就是事務和二進位制日誌的記錄是乙個整體,它們兩個要保持嚴格一致。也就是說,乙個事務的提交完畢是資料的更改完畢和二進位制日誌的寫入完畢才是乙個事務的提交完畢。由於這個問題,這樣一來本來是前面併發的事務,但是由於二進位制日誌的寫入是單個檔案,也就是單執行緒的操作,因此對於前面對mysql的併發事務由於二進位制日誌的寫入問題會變成多個事務序列操作。為了解決這個問題,mysql就使用了group commit來解決,也就是將前面多個事務的提交組合成乙個組來一起提交給mysql,這樣對二進位制的記錄就可將多個事務的操作當作乙個事務來對待,進行統一的寫入,對二進位制的寫入就類似了併發寫入一樣。

要理解這個group commit與二進位制日誌的記錄關係,要明確二進位制日誌的記錄過程。

如果sync-binlog設定為0,那麼對資料來說是最安全的。如果非0,那麼在沒有將快取寫入硬碟時發生了系統崩潰,那麼資料就真的丟失了,因為資料庫中已經寫入,但是二進位制日誌沒有寫入,在重啟msyql的時候會將資料庫中的資料回滾掉。但是設定為0又會遇到效能問題,以及無法使用group commit,因為沒有快取就會導致二進位制日誌是每個事務來說序列寫入,因此事務也實際變為序列。

個人覺得,實際中為了保險起見將sync-binlog=0即可,然後將二進位制日誌檔案設定到另乙個磁碟上即可。如果是replicaton環境,官方建議將sync-binlog設定為1。

三、暫停二進位制日誌的記錄

由於某些原因需要暫停二進位制日誌的記錄,前提是已經配置或設定了開啟二進位制日誌並正在記錄,那麼就可以通過暫停和恢復來控制二進位制日誌的記錄。

set sql_log_bin=0  #暫停記錄二進位制日誌,但是不是關閉二進位制日誌。 1為開始記錄,即取消暫停。

例如要從外部匯入一大批的資料到mysql中,此時對於記錄二進位制日誌是沒有太大意義的,並且如果要記錄則會導致二進位制日誌的體積猛烈增長。因此可以先暫停二進位制日誌的記錄,當匯入完畢後再取消暫停。

mysql 二進位制日誌

如果mysql 伺服器啟用了二進位制日誌,你可以使用mysqlbinlog工具來恢復從指定的時間點開始 例如,從你最後一次備份 直到現在或另乙個指定的時間點的資料。mysqlbinlog 用於處理二進位制日誌檔案的實用工具 要想從二進位制日誌恢復資料,你需要知道當前二進位制日誌檔案的路徑和檔名。一般...

mysql 二進位制日誌

1.日誌型別 二進位制日誌記錄了所有對mysql資料庫的修改事件,包括增刪改事件和對錶結構的修改事件。2.配置使用二進位制日誌 在my.ini 配置 log bin mysql bin 3.二進位制日誌格式 基於段的日誌格式 binlog format statement 記錄了操作的sql語句。優...

MySQL日誌之二進位制日誌binlog

mysql與oracle等資料庫不同,redo log不會作為歸檔,僅做failover等作用 mysql引用了binlog來實現歸檔日誌,提供複製 恢復 審計功能。在mysql中,redo log和binlog有以下三點不同 binlog是記錄所有資料庫結構變更 例如create alter ta...