Mysql之binlog

https://yq.aliyun.com/articles/669842

binlog的相關概念

binlog是記錄所有數據庫表結構變更(例如CREATE、ALTER TABLE…)以及表數據修改(INSERT、UPDATE、DELETE…)的二進制日誌。
binlog不會記錄SELECT和SHOW這類操作,因爲這類操作對數據本身並沒有修改,但你可以通過查詢通用日誌來查看MySQL執行過的所有語句。
binlog二進制日誌包括兩類文件:

  • 索引文件(文件名後綴爲.index)用於記錄哪些日誌文件正在被使用
  • 日誌文件(文件名後綴爲.00000*)記錄數據庫所有的DDL和DML(除了數據查詢語句)語句事件。

假設文件my.cnf中有這麼三條配置

log_bin: on 打開binlog日誌
log_bin_basename: bin文件路徑及名前綴(/var/log/mysql-bin)

log_bin_index:bin文件index(/var/log/mysql/mysql-bin.index)

我們會在文件目錄/var/log/mysql/下面發現兩個文件mysql-bin.000001和mysql-bin.index

mysql-bin.index就是我們所說的索引文件。記錄哪些文件是日誌文件,內容如下:

./mysql-bin.000001

日誌文件在innodb裏分爲兩部分,一部分在緩存中,一部分在磁盤上。業界有個詞叫刷盤,就是指將緩存中的日誌刷到磁盤上。跟刷盤有關的參數有兩個:sync_binlog和binlog_cache_size. 這兩個參數作用如下:

binlog_cache_size: 二進制日誌緩存部分的大小,默認值32k

sync_binlog=[N]:表示寫緩衝多少次,刷一次盤,默認值爲0

注意兩點:

  • 1)binlog_cache_size設置過大,會造成內存浪費。binlog_cache_size設置過下,會頻繁將緩衝日誌寫入臨時文件。
  • 2)sync_binlog=0:表示刷新binlog時間點由操作系統自身來決定,操作系統自身會每隔一段時間就會刷新緩存數據到磁盤,這個性能最好。

    sync_binlog=1,代表每次事務提交時就會刷新binlog到磁盤。sync_binlog=N,代表每N個事務提交會進行一次binlog刷新。sync_binlog=N,數據庫在操作系統宕機的時候,可能數據並沒有同步到磁盤,於是再次重啓數據庫,會帶來數據丟失問題。

    -當sync_binlog=1,事務在Commit的時候,數據寫入binlog,但是還沒寫入事務日誌(redo log和undo log)。此時宕機,重啓數據庫,數據被回滾。但是binlog裏已經記錄,這裏存在不一致問題。這個事務日誌和binlog一致性的問題,大家可以查詢mysql的內部XA協議,該協議就是解決這個一致性問題的。

binlog是以事件形式記錄的。Innodb和mysiam最顯著的區別就是一個支持事務,一個不支持事務。binlog不僅記錄innodb日誌,在myisam中,也一樣存在binlog.

三個用途:恢復、複製、審計

恢復

複製

graph LR
write-->Master
Master-->Slave

主庫有一個log dump線程,將binlog傳個從庫。從庫有兩個線程,一個I/O線程,一個SQL線程,I/O線程讀取主庫傳過來的binlog內容並寫入到relay log, SQL線程從relay log裏面讀取內容,寫入從庫的數據庫

審計:用戶可以通過二進制日誌中的信息來進行審計,判斷是否有對數據庫進行注入攻擊。

四個常識

常識一:binlog常見格式

format 定義 優點 缺點
statement 記錄的是修改SQL語句 日誌文件小,節約IO, 提高性能 準確性差,對一些系統函數不能轉卻複製或不能複製,如now()、uuid()等
row 記錄的是每行實際數據的變更 準確性強,能準確複製數據的變更 日誌文件大,較大的網絡IO和磁盤IO
mixed statement和row模式的混合 準確性強,文件大小適中 有可能發生主從不一致問題

目前業界推崇的是row模式

常識二:怎麼查看binlog

binlog本身是一類二進制文件。二進制文件更省空間,寫入速度更快,是無法直接打開來查看的。

因此mysql提供了命令mysqlbinlog進行查看。

一般的statement格式的二進制文件,用下面命令就可以

mysqlbinlog mysql-bin.000001

如果是row格式,加上-v或者-vv參數就行,如

mysqlbinlog -vv mysql-bin.000001

常識三:怎麼刪binlog

  1. 使用reset master, 該命令將會刪除所有日誌,並讓日誌文件重新從000001開始。
  2. 使用命令
PUGER {BINARY | MASTER} LOGS {TO 'log_name' | BEFORE datetime_expr}

例如

purge master logs to "binlog_name.00000X"

將會清除00000X之前的所有日誌文件
3) 使用expire_logs_days=N選項指定過了多少天日誌自動過期清空

常識四:binlog常見參數

參數名 含義
log_bin={on,off,base_name} 指定是否啓用記錄二進制日誌或者指定一個日誌路徑
sql_log_bin={on,off} 指定是否啓用記錄二進制日誌
expire_logs_days 指定自動刪除二進制日誌的時間,即日誌過期時間
log_bin_index 指定mysql-bin.index文件的路徑
binlog_format={mixed,row,statement} 指定二進制日誌基於什麼模式記錄
max_binlog_size 指定二進制日誌文件最大值
binlog_cache_size 指定事務日誌緩存區大小
max_binlog_cache_size 指定二進制日誌緩存最大大小
sync_binlog = {0/n} 指定寫緩衝多少次,刷一次盤
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章