MySQL binlog(二進制日志)解析

      網友投稿 1487 2025-03-31

      Binlog 顧名思義就是一種二進制日志,是一種與innodb引擎中redo/undo log完全不同的日志。它主要是用來記錄對Mysql數據更新或潛在發生更新的SQL語句,并以"事務"的形式保存在磁盤中。


      Binlog 主要作用

      復制:Mysql Replication在Master端開啟binlog,Master把它的二進制日志傳遞給slaves并回放來達到master-slave數據一致的目的

      數據恢復:通過mysqlbinlog工具恢復數據

      增量備份

      binlog管理

      開啟binlogmy.cnf配置中設置:log_bin="存放binlog路徑目錄"。binlog信息查詢binlog開啟后,可以在配置文件中查看其位置信息,也可以在myslq命令行中查看:

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      show variables?like '%log_bin%';

      +---------------------------------+-------------------------------------+

      | Variable_name?????????????????? | Value?????????????????????????????? |

      +---------------------------------+-------------------------------------+

      | log_bin???????????????????????? |?ON????????????????????????????????? |

      MySQL binlog(二進制日志)解析

      | log_bin_basename??????????????? | /var/lib/mysql/3306/mysql-bin?????? |

      | log_bin_index?????????????????? | /var/lib/mysql/3306/mysql-bin.index |

      | log_bin_trust_function_creators |?OFF???????????????????????????????? |

      | log_bin_use_v1_row_events?????? |?OFF???????????????????????????????? |

      | sql_log_bin???????????????????? |?ON????????????????????????????????? |

      +---------------------------------+-------------------------------------+

      binlog文件開啟binlog后,會在數據目錄(默認)生產host-bin.n(具體binlog信息)文件及host-bin.index索引文件(記錄binlog文件列表)。當binlog日志寫滿(binlog大小max_binlog_size,默認1G),或者數據庫重啟才會生產新文件,但是也可通過手工進行切換讓其重新生成新的文件(flush logs);另外,如果正使用大的事務,由于一個事務不能橫跨兩個文件,因此也可能在binlog文件未滿的情況下刷新文件。

      查看binlog文件列表的SQL語句如下:

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      mysql> show?binary logs;

      +------------------+-----------+

      | Log_name???????? | File_size |

      +------------------+-----------+

      | mysql-bin.000001 |?????? 177 |

      | mysql-bin.000002 |?????? 177 |

      | mysql-bin.000003 |? 10343266 |

      | mysql-bin.000004 |? 10485660 |

      | mysql-bin.000005 |???? 53177 |

      | mysql-bin.000006 |????? 2177 |

      | mysql-bin.000007 |????? 1383 |

      +------------------+-----------+

      show master status語句可以顯示binlog的狀態,包含當前二進制日志文件的狀態,正在寫入的二進制文件,及當前position等信息。

      1

      2

      3

      4

      5

      6

      mysql> show master status;

      +------------------+----------+--------------+------------------+-------------------+

      | File???????????? | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

      +------------------+----------+--------------+------------------+-------------------+

      | mysql-bin.000007 |????? 120 |????????????? |????????????????? |?????????????????? |

      +------------------+----------+--------------+------------------+-------------------+

      reset master語句用于清空binlog日志文件。

      binlog 內容

      默認情況下binlog日志是二進制格式,無法直接查看。可使用兩種方式進行查看,下面我分別列舉一下!

      第一種是使用mysqlbinlog工具,用法:mysqlbinlog: /usr/bin/mysqlbinlog ?mysql-bin.000007。

      mysqlbinlog是mysql官方提供的一個binlog查看工具,也可使用–read-from-remote-server從遠程服務器讀取二進制日志,還可使用–start-position –stop-position、–start-time= –stop-time精確解析binlog日志。

      第二種是直接使用命令行解析。語法如下:

      1

      2

      3

      4

      SHOW BINLOG EVENTS

      [IN 'log_name'] //要查詢的binlog文件名

      [FROM pos]

      [LIMIT [offset,] row_count]

      下面看一個例子:

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      mysql> show binlog events?in 'mysql-bin.000007' from 1190 limit 2\G

      *************************** 13. row ***************************

      Log_name: mysql-bin.000007

      Pos: 1190

      Event_type: Query? //事件類型

      Server_id: 123

      End_log_pos: 1352?? //結束pose點,下個事件的起點

      Info: use `test`;?insert into tb_person??set name="name__2", address="beijing", sex="man", other="nothing"

      *************************** 14. row ***************************

      Log_name: mysql-bin.000007

      Pos: 1352

      Event_type: Xid

      Server_id: 123

      End_log_pos: 1383

      Info:?COMMIT /* xid=51 */

      binlog 格式

      Mysql binlog日志有ROW,Statement,MiXED三種格式;可通過my.cnf配置文件及 ==set global binlog_format='ROW/STATEMENT/MIXED'== 進行修改,命令行 ==show variables like 'binlog_format'== 命令查看binglog格式。

      Row level: 僅保存記錄被修改細節,不記錄sql語句上下文相關信息優點:能非常清晰的記錄下每行數據的修改細節,不需要記錄上下文相關信息,因此不會發生某些特定情況下的procedure、function、及trigger的調用觸發無法被正確復制的問題,任何情況都可以被復制,且能加快從庫重放日志的效率,保證從庫數據的一致性 缺點:由于所有的執行的語句在日志中都將以每行記錄的修改細節來記錄,因此,可能會產生大量的日志內容,干擾內容也較多;比如一條update語句,如修改多條記錄,則binlog中每一條修改都會有記錄,這樣造成binlog日志量會很大,特別是當執行alter table之類的語句的時候,由于表結構修改,每條記錄都發生改變,那么該表每一條記錄都會記錄到日志中,實際等于重建了表。 tip: – row模式生成的sql編碼需要解碼,不能用常規的辦法去生成,需要加上相應的參數(–base64-output=decode-rows -v)才能顯示出sql語句; – 新版本binlog默認為ROW level,且5.6新增了一個參數:binlog_row_image;把binlog_row_image設置為minimal以后,binlog記錄的就只是影響的列,大大減少了日志內容

      Statement level: 每一條會修改數據的sql都會記錄在binlog中優點:只需要記錄執行語句的細節和上下文環境,避免了記錄每一行的變化,在一些修改記錄較多的情況下相比ROW level能大大減少binlog日志量,節約IO,提高性能;還可以用于實時的還原;同時主從版本可以不一樣,從服務器版本可以比主服務器版本高 缺點:為了保證sql語句能在slave上正確執行,必須記錄上下文信息,以保證所有語句能在slave得到和在master端執行時候相同的結果;另外,主從復制時,存在部分函數(如sleep)及存儲過程在slave上會出現與master結果不一致的情況,而相比Row level記錄每一行的變化細節,絕不會發生這種不一致的情況

      Mixedlevel level: 以上兩種level的混合使用經過前面的對比,可以發現ROW level和statement level各有優勢,如能根據sql語句取舍可能會有更好地性能和效果;Mixed level便是以上兩種leve的結合。不過,新版本的MySQL對row level模式也被做了優化,并不是所有的修改都會以row level來記錄,像遇到表結構變更的時候就會以statement模式來記錄,如果sql語句確實就是update或者delete等修改數據的語句,那么還是會記錄所有行的變更;因此,現在一般使用row level即可。

      選取規則如果是采用 INSERT,UPDATE,DELETE 直接操作表的情況,則日志格式根據 binlog_format 的設定而記錄 如果是采用 GRANT,REVOKE,SET PASSWORD 等管理語句來做的話,那么無論如何都采用statement模式記錄

      參考資料

      https://dev.mysql.com/doc/internals/en/binary-log-versions.html

      http://www.php.cn/mysql-tutorials-361643.html

      https://www.jianshu.com/p/c16686b35807

      https://www.cnblogs.com/jackluo/p/3336585.html

      http://www.cnblogs.com/hustcat/archive/2009/12/19/1627525.html

      MySQL SQL

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:怎么把文檔變成一整個文件夾(文件夾怎樣變成文檔)
      下一篇:Word2013通過“限制編輯”窗格設置文檔閱讀權限的方法(word文檔設置只讀權限)
      相關文章
      精品国产亚洲一区二区三区在线观看 | 另类图片亚洲校园小说区| 亚洲av日韩av欧v在线天堂| 亚洲春色在线视频| 亚洲成人激情小说| 亚洲爱情岛论坛永久| 亚洲AV无码成人精品区日韩 | 亚洲国产AV无码专区亚洲AV | 亚洲成av人在线观看网站| 久久夜色精品国产亚洲AV动态图 | 亚洲精品乱码久久久久久自慰| 国产精品亚洲精品久久精品| 亚洲精品乱码久久久久蜜桃 | 亚洲精品亚洲人成在线| 亚洲aⅴ无码专区在线观看| 久久无码av亚洲精品色午夜| 国产成人精品亚洲| 妇女自拍偷自拍亚洲精品| 亚洲AV无码之日韩精品| 亚洲午夜av影院| 亚洲欧美黑人猛交群| 亚洲天堂一区在线| 久久亚洲免费视频| 91亚洲导航深夜福利| 国产亚洲人成无码网在线观看| 国产亚洲福利精品一区| 亚洲AV无码久久精品色欲| 亚洲人成电影网站国产精品 | 亚洲美女又黄又爽在线观看| 亚洲VA中文字幕不卡无码| 亚洲日本精品一区二区| 亚洲综合av永久无码精品一区二区| 国产亚洲成在线播放va| 亚洲午夜爱爱香蕉片| 国产亚洲人成网站观看| 久久精品国产精品亚洲毛片| 亚洲videos| 亚洲国产最大av| 亚洲av无码片在线观看| 亚洲码和欧洲码一码二码三码| 噜噜噜亚洲色成人网站|