文章公號 首發!連載中!關注微信公號回覆:「抽獎」 還可參加抽📖活動
html
算上這一篇文章,白日夢的MySQL專題已經寫了18篇了。前面的文章中有跟你們分享過undo log、redo log、以及接下來要有幾篇文章跟你們分享bin log。mysql
前一陣跟一個同窗嘮嗑,說到了MySQL的這幾個日誌。那同窗就感受這幾個日誌挺深奧的挺難懂的。其實不用這麼嚇唬本身。golang
就好比說這幾個日誌,你有沒有想過MySQL爲啥要寫日誌呢?寫日誌就得有磁盤IO、不寫不香嗎?速度、性能還會變快。其實否則,MySQL會寫日誌,是由於記錄下的日誌能賦予MySQL必定的能力。sql
好比undo log讓mysql有回滾事物的能力,redo log讓mysql有崩潰恢復的能力,以及咱們如今說的bin log讓MySQL有搭建集羣、數據備份、恢復數據的能力。數據庫
那你說,我不想讓MySQL記錄那些日誌不行嗎?確定行啊!甚至默認狀況下,MySQL都不會主動爲你記錄bin log ,可是話說回來,你不讓它寫那些日誌,它就沒有相應的能力給你用。是吧!因此綜合來講,寫日誌仍是很香的。緩存
知道了這些,再去學相關的知識點是否是目的性很強了呢?關於undo log、redo log白日夢前面已經和你們分享過了,知無不言的那種分享哈,若是你又有感受了,歡迎關注我而後去翻看。bash
對於大部分研發同窗來講,確定據說過bin log。而後卻不必定知道binlog在哪裏?誰寫的?怎麼配置binlog?以及binlog有啥用。因此接下來的幾篇文章,咱們一塊兒看看binlog的二三事,讓你更好的理解binlog。微信
bin log是MySQL的二進制日誌文件,翻譯成中文名反到是感受怪怪的。因此說下面直接稱他爲binlog。工具
咱們都知道MySQL分爲兩大部分。上層是MySQL-Server,下層是可插拔的存儲引擎。性能
binlog就是由MySQL的Server層產生。
binlog存放的位置由datadir參數控制。
你能夠經過下面的方式查看到它
知道了binlog具體在哪裏,你就能夠看一眼,以下
目錄下有兩種文件:mysql-bin.0000XX 和 mysql-bin.index
前者保存着對MySQL更改的邏輯
然後者長下面這樣,估計你一看就懂了~
通常關於binlog的配置都寫在MySQL的配置文件中: my.cnf , 以方便啓動mysql時直接讓這些配置生效
做爲了解,你能夠大概摟一眼binlog的配置項
[mysqld] # binlog相關配置 # 指定binlog日誌存儲的位置 datadir = /home/mysql/mysql/var # 規範binlog的命名爲 mysql-bin.0000XX # 若是加這行配置,binlog文件名爲主機名 log-bin = mysql-bin # 索引當前全部的binlog log-bin-index = mysql-bin.index # 最大的大小 max_binlog_size = 1G # binlog的sync時機 sync-binlog = 1 # binlog的格式 binlog-format = ROW # 保留七天的binlog expire_logs_days = 7
若是說redolog中記錄的是偏向物理層面的記錄,如:對哪一個數據頁的那個記錄作了什麼修改。
那麼binlog中記錄的是偏向邏輯層面的記錄:如:對xxx表中的id=yyy的行作作了什麼修改,更改後的值是什麼。
binlog不會記錄你的 select 、show這類的操做。
你能夠在query log中找到曾經執行過的諸如select、show這種僅查詢的SQL。
常見的binlog有以下的做用。
可是你知道嗎?
默認binlog是不開啓的。由於開啓binlog後會稍微下降一點mysql的性能(1%)。
可是開啓binlog後你就能夠搭建MySQL集羣,排查SQL注入,恢復誤刪的數據。因此線上的MySQL集羣都是開啓binlog的,是否是感受開啓binlog頗有保障!很香呢?
跟你們分享一種線上實際存在的場景,你就能知道該參數的妙用了。
好比你線上使用的是一個一主兩從的MySQL集羣,而後有一個活動來了,你須要給線上某庫的某數據表添加一列,而且這個表裏面的數量很是之龐大。
添加一列是須要獲取表鎖的,而且龐大的數據量讓你alter table異常緩慢,在獲取表鎖的過程當中,正常的DML也會被阻塞。這時你就得考慮無損DDL,好比golang的ghost(怎麼作的無損ddl原理我後門的文章會寫的,本篇不展開)。
ghost工具的特色是,它須要預執行一些SQL目的是先校驗一下你的集羣符不符合它的要求,爲了避免對線上產生影響,你確定會想把這些預執行的sql放到從庫上執行。放在從庫上執行當然沒問題,可是你執行的sql會產生bin log。出現新的GTID(後面講MySQL集羣時會跟你們分享,這裏你只須要理解成是一個事物的惟一標識就行)更要命的是,主庫中沒有這些GTID。
當主從都正常運行時,主從bin log不一致不要緊,可是當從庫宕機的時候,從庫重啓會將本身的GTID集合發送給主庫,因爲從庫多出來一部分主庫沒有的GTID,會致使該從庫不能再次加入集羣。
其實這個問題也好解決。使用這個參數 sql_log_bin
該sql_log_bin
變量控制是否爲當前會話啓用到二進制日誌的日誌記錄(假設二進制日誌自己已啓用)。默認值爲ON
。要爲當前會話禁用或啓用二進制日誌記錄,請將會話sql_log_bin
變量設置爲 OFF
或ON
。
全局sql_log_bin
變量是隻讀的,沒法修改。
本文到這裏就行將結束了,歸納性的在各個方面講述了一下binlog,讓你對binlog有了一個大概的瞭解。
在後續的幾篇文章中我會嘗試針對binlog的某個點展開問答式的敘述。以下,歡迎關注,敬請期待。
binlog的寫入時機?binlog到底長啥樣?有哪些格式?各類格式的binlog的優缺點?恢復數據?
關於 「搭建一套一主兩從的MySQL集羣,binlog幫你完成主從的數據同步。」會放在MySQL集羣部分穿插串講起來。
參考:
https://dev.mysql.com/doc/refman/5.7/en/binary-log.html
https://dev.mysql.com/doc/refman/5.7/en/replication-options-binary-log.html
https://dev.mysql.com/doc/refman/5.7/en/set-sql-log-bin.html