日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL-日志二进制日志binlog初探

發(fā)布時(shí)間:2025/3/21 数据库 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL-日志二进制日志binlog初探 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 生猛干貨
  • 官方文檔
  • MySQL日志分類
    • MySQL服務(wù)層日志
    • 存儲(chǔ)引擎層日志
  • binlog
    • binlog都記錄了哪些內(nèi)容
    • 什么時(shí)候?qū)慴inlog
    • binlog 文件以及擴(kuò)展
    • 何時(shí)會(huì)生成新的binlog
    • binlog的格式
      • 基于段的格式-STATEMENT
        • STATEMENT 的優(yōu)缺點(diǎn)
        • 使用mysqlbinlog查看binlog
      • 基于行的格式-Row
        • 優(yōu)缺點(diǎn)
        • 日志內(nèi)容的控制參數(shù) binlog_row_image
          • full
          • minimal
          • noblob
        • 查看Row格式的binglog
      • 混合日志格式-mixed
        • 特點(diǎn)
    • 常用binlog操作
    • binlog相關(guān)的參數(shù)
  • 小結(jié)
  • 搞定MySQL

生猛干貨

帶你搞定MySQL實(shí)戰(zhàn),輕松對(duì)應(yīng)海量業(yè)務(wù)處理及高并發(fā)需求,從容應(yīng)對(duì)大場(chǎng)面試


官方文檔

https://dev.mysql.com/doc/

如果英文不好的話,可以參考 searchdoc 翻譯的中文版本

http://www.searchdoc.cn/rdbms/mysql/dev.mysql.com/doc/refman/5.7/en/index.com.coder114.cn.html


二進(jìn)制日志 : http://www.searchdoc.cn/rdbms/mysql/dev.mysql.com/doc/refman/5.7/en/binary-log.com.coder114.cn.html


MySQL日志分類

MySQL服務(wù)層日志

  • 二進(jìn)制日志: 記錄更改數(shù)據(jù)的語句

  • 慢查詢?nèi)罩?記錄所有執(zhí)行時(shí)間超過 long_query_time 秒的所有查詢或不使用索引的查詢

    MySQL默認(rèn)不開啟慢查詢?nèi)罩尽?/font>

    mysql> show variables like '%slow_query%'; # 我這里設(shè)置打開了,默認(rèn)關(guān)閉 +---------------------+---------------------------------+ | Variable_name | Value | +---------------------+---------------------------------+ | slow_query_log | ON | | slow_query_log_file | /var/lib/mysql/artisan-slow.log | +---------------------+---------------------------------+ 2 rows in set (0.00 sec)mysql> mysql> show variables like 'long_query_time'; # 默認(rèn)10秒 +-----------------+-----------+ | Variable_name | Value | +-----------------+-----------+ | long_query_time | 10.000000 | +-----------------+-----------+ 1 row in set (0.00 sec)mysql>

    long_query_time,超過這個(gè)閾值,MySQL會(huì)記錄超過該值的所有SQL,必須大于, 等于改值的不會(huì)被記錄。

    另外一個(gè)和慢查詢相關(guān)的參數(shù) log_queries_not_using_indexes

    mysql> show variables like 'log_queries_not_using_indexes'; +-------------------------------+-------+ | Variable_name | Value | +-------------------------------+-------+ | log_queries_not_using_indexes | OFF | +-------------------------------+-------+ 1 row in set (0.00 sec)mysql>

    如果SQL沒有使用索引,則會(huì)被記錄到慢日志查詢中。


  • 通用日志 :記錄建立的客戶端連接和執(zhí)行的語句

  • 中繼(relay)日志:從節(jié)點(diǎn)復(fù)制主服務(wù)器接收的數(shù)據(jù)更改

  • DDL日志(元數(shù)據(jù)日志):元數(shù)據(jù)操作由DDL語句執(zhí)行

  • 錯(cuò)誤日志

    mysql> show variables like 'log_error'; +---------------+---------------------+ | Variable_name | Value | +---------------+---------------------+ | log_error | /var/log/mysqld.log | +---------------+---------------------+ 1 row in set (0.01 sec)mysql>

    錯(cuò)誤日志記錄了MySQL的啟動(dòng)、運(yùn)行、關(guān)閉過程進(jìn)行了記錄。 方便定位問題,如果mysql起不來,首先就應(yīng)該去這個(gè)日志文件來看。


存儲(chǔ)引擎層日志

以Innodb存儲(chǔ)引擎來講,主要由 Redo log 和 Undo log , 為了支持事務(wù)。


binlog

這里我們重點(diǎn)來了解下 binlog的主要功能


binlog都記錄了哪些內(nèi)容

binlog中主要記錄了所有對(duì)MySQL數(shù)據(jù)庫(kù)的修改事件,包括增刪改事件以及對(duì)表結(jié)構(gòu)的修改事件,不包括 select 和 show 之類的操作(這部分會(huì)記到查詢?nèi)罩局?#xff09; 。 需要注意的一點(diǎn): 只有成功執(zhí)行的才回被記錄到binlog中,那些執(zhí)行出錯(cuò)或者已經(jīng)回滾的數(shù)據(jù),是不會(huì)被記錄到binlog中的。

binlog 的主要目的是主從復(fù)制和數(shù)據(jù)恢復(fù)

  • 在Master端開啟binlog,Master把它的二進(jìn)制日志傳遞給slaves來達(dá)到master-slave數(shù)據(jù)一致的目的
  • 數(shù)據(jù)恢復(fù):通過使用 mysqlbinlog工具來使恢復(fù)數(shù)據(jù)

什么時(shí)候?qū)慴inlog

InnoDB (支持事務(wù)的存儲(chǔ)引擎),必須要提交了事務(wù)才會(huì)記錄binlog。binlog 什么時(shí)候刷新到磁盤取決于參數(shù) sync_binlog

  • 如果設(shè)置為0,則表示MySQL不控制binlog的刷新,由文件系統(tǒng)去控制它緩存的刷新;
  • 如果設(shè)置為不為0的值,則表示每 sync_binlog 次事務(wù),MySQL調(diào)用文件系統(tǒng)的刷新操作刷新binlog到磁盤中。

如果 sync_binlog=0 或 sync_binlog大于1,當(dāng)發(fā)生電源故障或操作系統(tǒng)崩潰時(shí),可能有一部分已提交但其binlog未被同步到磁盤的事務(wù)會(huì)被丟失,恢復(fù)程序?qū)o法恢復(fù)這部分事務(wù)。

建議設(shè)置為1是最安全的,在系統(tǒng)故障時(shí)最多丟失一個(gè)事務(wù)的更新,但是會(huì)對(duì)性能有所影響。


binlog 文件以及擴(kuò)展

binlog日志包括兩類文件:

  • 二進(jìn)制日志索引文件(文件名后綴為.index)用于記錄所有有效的的二進(jìn)制文件
  • 二進(jìn)制日志文件(文件名后綴為.00000*)記錄數(shù)據(jù)庫(kù)所有的DDL和DML語句事件

何時(shí)會(huì)生成新的binlog

  • MySQL服務(wù)器停止或重啟時(shí)
  • 使用 flush logs 命令;
  • 當(dāng) binlog 文件大小超過 max_binlog_size 變量的值

以上三種情況,MySQL會(huì)重新生成一個(gè)新的日志文件,文件序號(hào)遞增。

注: max_binlog_size 的最小值是4096字節(jié),最大值和默認(rèn)值是 1GB (1073741824字節(jié))。

事務(wù)被寫入到binlog的一個(gè)塊中,所以它不會(huì)在幾個(gè)二進(jìn)制日志之間被拆分。因此,如果你有很大的事務(wù),為了保證事務(wù)的完整性,不可能做切換日志的動(dòng)作,只能將該事務(wù)的日志都記錄到當(dāng)前日志文件中,直到事務(wù)結(jié)束,所以有的時(shí)候我們會(huì)看到binlog文件大于 max_binlog_size 的情況。


binlog的格式

二進(jìn)制日志中的事件的格式取決于二進(jìn)制記錄格式。支持三種格式類型:

  • STATEMENT:基于SQL語句的復(fù)制(statement-based replication, SBR)
  • ROW:基于行的復(fù)制(row-based replication, RBR)
  • MIXED:混合模式復(fù)制(mixed-based replication, MBR)

Version < MySQL 5.7.7 ,默認(rèn)的格式是 STATEMENT,

Version >= MySQL 5.7.7 + ,默認(rèn)值是 ROW。

日志格式通過 binlog-format 指定 —> binlog-format=STATEMENT、binlog-format=ROW、binlog-format=MIXED。


基于段的格式-STATEMENT

基于段的格式 binlog_format=STATEMENT

STATEMENT 的優(yōu)缺點(diǎn)

  • 優(yōu)點(diǎn):日志記錄量相對(duì)較小,節(jié)省磁盤及網(wǎng)絡(luò)I/O ,只對(duì)一條刪記錄進(jìn)行修改或者插入,row格式所產(chǎn)生的日質(zhì)量小于段產(chǎn)生的日志量

  • 缺點(diǎn): 必須要記錄上下文的信息,以確保在從服務(wù)器上能夠正確執(zhí)行。但是有些特定函數(shù)比如UUID(),user() ,now()這樣非確定性函數(shù)還是無法復(fù)制,有可能造成主備服務(wù)器數(shù)據(jù)不一致。


使用mysqlbinlog查看binlog

[root@artisan ~]# mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 44 Server version: 5.7.29-log MySQL Community Server (GPL) ..... ..... mysql> show variables like 'binlog_format'; # 查看當(dāng)前binlog的格式 +---------------+-------+ | Variable_name | Value | +---------------+-------+ | binlog_format | ROW | +---------------+-------+ 1 row in set (0.00 sec)mysql> set session binlog_formate=statement; # 修改session級(jí)別的binlog格式為statement mysql> set session binlog_format=statement; Query OK, 0 rows affected (0.00 sec)mysql> show variables like 'binlog_format'; #確認(rèn)下當(dāng)前binlog的格式 +---------------+-----------+ | Variable_name | Value | +---------------+-----------+ | binlog_format | STATEMENT | +---------------+-----------+ 1 row in set (0.00 sec)mysql> show binary logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 177 | | mysql-bin.000002 | 177 | .... .... | mysql-bin.000049 | 177 | +------------------+-----------+ 45 rows in set (0.00 sec)mysql> flush logs; # 刷新log ,會(huì)產(chǎn)生一個(gè)新的binlog Query OK, 0 rows affected (0.05 sec)mysql> show binary logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 177 | .... .... | mysql-bin.000049 | 177 | | mysql-bin.000050 | 154 | +------------------+-----------+ 46 rows in set (0.00 sec)mysql> 下面隨便搞點(diǎn)操作,方便觀察binlogmysql> create database artisan2; Query OK, 1 row affected (0.00 sec)mysql> use artisan2; Database changed mysql> create table t(id int , c1 varchar(10)); Query OK, 0 rows affected (0.30 sec)mysql> insert into t values(1,'a'),(2,'b'); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0mysql>

切到binlog的目錄下 (/etc/my.cnf中配置的log-bin項(xiàng))

[root@artisan binlog]# pwd /var/lib/mysql/data/binlog [root@artisan binlog]# mysqlbinlog mysql-bin.000050 /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; # at 4 #200131 16:15:14 server id 1 end_log_pos 123 CRC32 0xf1d6a9f8 Start: binlog v 4, server v 5.7.29-log created 200131 16:15:14 # Warning: this binlog is either in use or was not closed properly. BINLOG ' EuIzXg8BAAAAdwAAAHsAAAABAAQANS43LjI5LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA Afip1vE= '/*!*/; # at 123 #200131 16:15:14 server id 1 end_log_pos 154 CRC32 0x19c20618 Previous-GTIDs # [empty] SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/; DELIMITER ; # End of log file /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/; [root@artisan binlog]#

5.7.29版本的這個(gè)statement格式的binlog ,居然沒法直接看內(nèi)容了 ,先記錄下。

5.7.9中 還能看到具體的SQL


基于行的格式-Row

基于行的日志格式 binlog_format=ROW

舉個(gè)例子,假設(shè)有一個(gè)SQL修改了1萬條數(shù)據(jù), 基于段Statement的日志格式僅僅會(huì)記錄這個(gè)SQL, 而基于Row的日志會(huì)有1萬條記錄分別記錄每一行的數(shù)據(jù)修改。


優(yōu)缺點(diǎn)

  • 優(yōu)點(diǎn): 記錄每一條數(shù)據(jù)的變更,因此使得MySQL主從復(fù)制更加安全。 對(duì)每一行數(shù)據(jù)的修改比基于段的復(fù)制高效 。 還可以用來數(shù)據(jù)恢復(fù)(比對(duì)數(shù)據(jù)的變更)

  • 缺點(diǎn): 因?yàn)橐涗浢恳粭l的變更,因此記錄日志量較大


日志內(nèi)容的控制參數(shù) binlog_row_image

binlog_row_image = FULL | MINIMAL | NOBLOB (3個(gè)選項(xiàng),默認(rèn)FULL

舉個(gè)例子 一個(gè)表中 有 20 列(20個(gè)字段) ,3個(gè)參數(shù)的區(qū)別如下

  • FULL 全部字段都記錄
  • MINIMAL 僅記錄變更的字段數(shù)據(jù)
  • NOBLOB : 和full類似,只是不記錄BLOB類型的字段,其他全記錄
mysql> show variables like 'binlog_row_image'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | binlog_row_image | FULL | +------------------+-------+ 1 row in set (0.00 sec)mysql> set session binlog_row_image=minimal; # 修改 Query OK, 0 rows affected (0.00 sec)

增加c2字段 ,text類型


full

默認(rèn) FULL的情況

mysqlbinlog -vv 命令查看ROW格式的日志


minimal

修改為 minimal

mysqlbinlog -vv 命令查看ROW格式的日志

可以看到

僅記錄了 變化的 字段的內(nèi)容。


noblob

設(shè)置參數(shù)為 noblob


將非 blob字段 更新下,看看是否記錄blob字段的信息

mysqlbinlog -vv 命令查看ROW格式的日志

可以看到

第三列,text類型的,并沒有在binLog中。


查看Row格式的binglog

Row格式的 增加 -vv 查看

[root@artisan binlog]# mysqlbinlog -vv mysql-bin.000050

我這個(gè)5.7.29的版本 看不到。。。有可能是打開方式不對(duì),待確認(rèn) 。

5.7.9版本可以


混合日志格式-mixed

binlog_format=MIXED

特點(diǎn)

  • 根據(jù)SQL語句由系統(tǒng)決定在基于段和基于行的日志格式中進(jìn)行選擇
  • 數(shù)據(jù)量的大小由所執(zhí)行的SQL決定

不展開了,并不是一種新的格式


常用binlog操作

## binlog相關(guān)的命令 ```sql # 查看是否開啟binlog mysql>show binary logs;#查看binlog格式: mysql>show variables like 'binlog_format';#獲取binlog文件列表: mysql>show binary logs;#查看當(dāng)前正在寫入的binlog文件: mysql>show master status;#查看master上的binlog: mysql>show master logs;#只查看第一個(gè)binlog文件的內(nèi)容: mysql>show binlog events;#查看指定binlog文件的內(nèi)容: mysql>show binlog events in 'mysql-bin.000045';#清空所有的bin-log: mysql>reset master;#生成一個(gè)新的binlog: mysql>flush logs;

binlog相關(guān)的參數(shù)


小結(jié)

建議 binlog_format=mixed 或者 row, 如果用row的話,最好binlog_row_image=minimal ,減少binlog的大小,占用更少的網(wǎng)絡(luò)I/O 和 磁盤I/O


搞定MySQL

總結(jié)

以上是生活随笔為你收集整理的MySQL-日志二进制日志binlog初探的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美h网站 | 欧美激情综合色综合啪啪五月 | 自拍一级片 | 丝袜av在线播放 | 精品国产免费视频 | 名校风暴在线观看免费高清完整 | 在线观看国产区 | 国产欧美一区二区三区另类精品 | 一级特毛片 | 日韩久久综合 | 在线日韩亚洲 | 欧美在线观看不卡 | 超碰在线99 | 久久新视频 | 91免费片 | 天堂va欧美ⅴa亚洲va一国产 | 一本一道久久综合狠狠老精东影业 | 在线免费视频 | 成人xx视频 | 国产成人精品一区二区三区在线 | 日日操夜夜操视频 | 青青草原国产在线观看 | 性――交――性――乱睡觉 | 日本精品一区在线 | 手机看片一区二区三区 | 五月天开心激情 | 少妇毛片 | 精品国产免费观看 | 亚洲欧洲精品一区 | 日本一区二区成人 | 一级黄色美女 | 欧美成人片在线 | 午夜剧场免费在线观看 | 午夜视频91 | 国语av| 扶她futa粗大做到怀孕 | 欧美xxxxxx片免费播放软件 | 亚洲国产成人精品激情在线 | 国产精品夜夜爽张柏芝 | 亚洲国产成人在线观看 | 亚洲av无码乱码国产精品fc2 | 欧洲一二三区 | 国产精品激情偷乱一区二区∴ | 河北彩花中文字幕 | 强制高潮抽搐哭叫求饶h | 久久久久亚洲av无码专区喷水 | 爱爱一级 | 自拍偷拍国产 | 国产一区二区在线不卡 | 美女精品 | 久久精品韩国 | 人人干人人干 | 亚洲一区二区中文字幕 | 日本精品不卡 | 久草新 | 成人av毛片 | 另类小说色综合 | 黄色国产小视频 | 天天做天天摸天天爽天天爱 | 成人尹人 | 国产精品无码一区 | 一个人免费在线观看视频 | 色呦呦免费观看 | 欧美片免费网站 | 国产成人麻豆精品午夜在线 | 日韩大片在线免费观看 | 玉女心经在线看 | wwwwxxx日本| 天堂亚洲| 两女双腿交缠激烈磨豆腐 | 国产我不卡 | 水蜜桃久久 | 久久精品偷拍视频 | 操欧美老逼 | 亚洲va韩国va欧美va精品 | 国产在线观看网站 | 91久久一区二区 | 污污视频在线免费观看 | 亚洲AV无码国产精品播放在线 | 男女男精品网站 | 亚洲美女性生活视频 | 你操综合 | 黄色一级视频网站 | 欧美做受| 黄色一级在线观看 | 亚洲三级在线观看 | 亚洲国产一级 | 成人青青草 | 国产精品丝袜视频 | 日一日干一干 | 欧美偷拍一区二区三区 | 国产美女91呻吟求 | 国产精品日韩一区二区三区 | 快播视频在线观看 | 爱情岛论坛亚洲品质自拍 | 在线欧美 | 成年人免费小视频 | 可以免费看的av毛片 | 亚洲午夜精品 |