二進制日志

簡介

binlog是mysql server層存儲的二進制日志,主要用于記錄更新操作:

  • 所有數據庫表結構變更DDL(例如create、alter、drop);
  • 表數據修改DML(insert、update、delete)。

日志類型

binlog日志包含:

  • 二進制日志索引文件(文件后綴名=.index),是個普通文件,文件內容如下:
    image
  • 二進制日志文件(文件后綴名=.00000*),用于記錄更新操作。

寫入流程

當事務表存儲引擎時,所有未提交的二進制日志會被記錄到一個緩存(通過binlog_cache_size配置緩存大小,默認32K)中去,等待事務提交時直接將緩存中的二進制日志刷新到磁盤二進制文件。

binlog_cache_size是基于會話的,因此設置的大小一定要消息。可以通過binlog_cache_use(寫入緩存的次數)、binlog_cache_disk_use(寫入臨時文件的次數),判斷當前的設置是否合適,太小會寫到臨時文件影響性能,太大會造成內存浪費。

默認的情況下,二進制日志并不是在每次寫的時候都刷新到磁盤中。因此,當數據庫發生宕機的時候,就會可能造成數據的丟失,這會給恢復和復制帶來問題。因此可以呀通過sync_binlog=N(默認是0)設置寫入N次就同步一次到磁盤。

不過即使將sync_binlog設置成1,也會出現問題。當使用InnoDB存儲引擎時,在一個事務發出COMMIT操作之前,先將二進制日志寫入磁盤,但如果此時提交動作還沒有在InnoDB存儲redo log寫入,并且此時數據庫發生了宕機。下次啟動時,該事務會被回滾掉,但是二進制日志已經記錄了該信息,就會造成復制時數據不一致。因此,需要保證binlog與redo log分布式事務的一致性,可以使用XA事務保證一致性,通過innodb_support_xa=ON(默認開啟)開啟。

日志格式

binlog格式有三種:row,statement,mixed。

可通過show variables like '%binlog_format%' 查看當前binlog日志格式。

  • row:非常清晰的記錄下每行數據的修改細節,不需要記錄上下文相關信息。

    • 優點:不會出現某些特定情況下的存儲過程、函數、觸發器的調用和觸發無法被正確復制的問題。
    • 缺點:會產生大量的日志,尤其是alter table會記錄所有行的變更細節。
  • statement:記錄更新操作的sql語句。

    • 優點:相對row格式,減少了日志,節約IO,提高性能。
    • 缺點:為了保證sql語句能在slave上正確執行,必須記錄上下文信息,以保證所有語句能在slave得到和在master端執行時候相同的結果;另外,主從復制時,存在部分函數(如sleep)及存儲過程在slave上會出現與master結果不一致的情況。
  • mixed:混合格式,實際上是row與statement的結合。mysql會根據執行的每一條具體的sql語句來區分對待記錄的日志形式,也就是在statement和row之間選擇一種。

    新版本的mysql對row格式也被做了優化,并不是所有的修改都會以row格式來記錄,像遇到表結構變更的時候就會以statement格式來記錄,如果sql語句確實就是update或者delete等修改數據的語句,那么還是會記錄所有行的變更;因此,現在一般使用row格式即可。

對于row格式來說,mysql5.6新增binlog_row_image減少了DML操作產生的日志量:

  • 舊版邏輯:當表含有blob或者text類型的字段,update的時候,即使不更新這些字段,也會被記錄到binlog中,會導致日志龐大。
  • 5.6新版邏輯:binlog_row_image提供full、minimal、nolob三個可選值。
    • full:記錄所有字段信息,跟舊版一樣。
    • minimal:只記錄被修改的列信息。
    • nolob:記錄除了blob和text以外的所有字段。

相關命令及配置

開啟binlog

首先查看mysql binlog配置情況 show variables like '%log_bin%';

image

可以看到log_bin 狀態是關閉 ,找到my.cnf配置文件,配置log-bin=binlog(binlog存放路徑)。

查看binlog當前格式

show variables like '%binlog_format%';

image

設置binlog格式binlog_format=row

查看所有binlog日志列表

show master logs;

image

最新binlog日志

show master status;

image

查看某個binlog日志內容

show binlog events in 'binlog.000003' from 3 limit 2;

意思是:從pos=3的起始點開始,查看10條,日志名=binlog.000003的日志內容
image

另外一種方式是使用mysqlbinlog工具,可以看到更加詳細的信息:

/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/binlog.000003

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,030評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,310評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,951評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,796評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,566評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,055評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,142評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,303評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,799評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,683評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,899評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,409評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,135評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,520評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,757評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,528評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,844評論 2 372

推薦閱讀更多精彩內容