自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

mysql數(shù)據(jù)庫對binlog日志的處理

數(shù)據(jù)庫 MySQL
Binlog對mysql而言是重要的,主要體現(xiàn)在它的功能上。Mysql官方文檔明確指出,binlog的啟動大概會為mysql增加1%的負載,因此在絕大多數(shù)情況下,binlog都不會成為mysql的性能瓶頸。

Binlogmysql以二進制形式打印的日志,它默認不加密,不壓縮。每個正常的binlog文件頭部,有4個字節(jié)的標記,值為0xfe 0x62 0x69 0x6e。LOG_EVENT是binlog里的單位,即正常情況下binlog按照逐LOG_EVENT的形式增長。除去頭部的標記,binlog就是一個LOG_EVENT的序列。每個LOG_EVENT都獨立單元,沒有互相引用的關系,它也有自己的二進制頭部,主要是記錄了時間戳、類型標記等描述信息。

Mysql把磁盤操作的實現(xiàn)封裝在IO_CACHE結構里,這也方便了我們對binlog的研究和描述,后文如果沒有特別說明,讀寫binlog與讀寫IO_CACHE的含義相同。為了解mysql寫入binlog的過程,可以找一個sql語句的處理過程進行跟蹤。以update為例,在最簡單的情況下,mysql會先調用為存儲引擎開放的接口ha_update_row,然而執(zhí)行binlog_query對binlog進行寫操作。

這樣處理的原因是,在主從備份的場景下,如果主庫先寫入binlog成功、在執(zhí)行update的過程中crash,從庫有可能執(zhí)行update成功,此時主庫重啟之后,與從庫的數(shù)據(jù)不一致。如果update操作發(fā)生在事務性的表上,在寫入binlog之后會執(zhí)行開放接口ha_autocommit_or_rollback,由存儲引擎判斷操作結果。

在主從備份的場景下,主庫相當于server,從庫相當于client,雙方采用tcp短連接。從庫發(fā)出讀取日志的請求,主庫接收請求、讀取本地binlog、然后發(fā)送給從庫。從庫接收日志,進行簡單校驗后寫本地日志,稱為relay log。此處從庫的流程專門由一個線程負責,稱為同步io線程。從庫還有一個線程,稱為同步sql線程。它的行為是,定期讀取relay log,解析并執(zhí)行同步過來的sql語句。

下面回答幾個問題:

1.binlog的格式?

二進制順序存儲,不加密,不壓縮。

2.binlog使用WAL嗎?

No。

3.主庫發(fā)送binlog,是使用內存里的copy嗎?

無法確定,很有可能是先從磁盤上讀一份,然后發(fā)送。

4.relaylog使用WAL嗎?

Yes。從庫接收到日志后,會先寫relay log。

5.binlog和relaylog的SQL是否一致?

在網(wǎng)絡傳輸正確性可靠的前提下,yes。

#p#

提一個問題:既然binlog不使用WAL,那么在主從場景下,mysql異常之后,主庫和從庫是否會不一致呢?

之前有個問題一直沒弄明白:既然mysql是先做數(shù)據(jù)操作、再寫binlog,如果寫binlog的時候失敗,mysql又crash,數(shù)據(jù)怎么辦?

答案是由存儲引擎決定數(shù)據(jù)??梢园裮ysql和它的存儲引擎分開看,因為mysql只是一個框架,而不是一個實現(xiàn)。binlog是mysql自己的日志,而事務是由存儲引擎本身保證的。

以update為例,mysql做的事情簡單分為:

1. 修改數(shù)據(jù)update。

2. 寫binlog。

3. 如果當前處理的表是一個事務性的表,則commit或rollback。

注意此處的update和commit/rollback都由存儲引擎實現(xiàn),mysql只是站在邏輯的高度上理解這些操作。

對于事務型的引擎innodb,它本身有日志保證數(shù)據(jù)的一致性。在innodb的實現(xiàn)中,update修改數(shù)據(jù)之前,會新建一個事務,并建立一個回滾點。而在innodb提供的commit/rollback接口會提交/回滾事務。

因此對innodb而言,每條SQL語句的事務,其實包含了binlog的寫操作。然而即使是這樣,innodb仍然無法保證binlog和數(shù)據(jù)的一致性,因為innodb在寫commit成功后crash,回滾操作不會回滾binlog。按照手冊上的說法,把--innodb-support-xa設置為1,同時保證sync_binlog=1,才能保證innodb的binlog和數(shù)據(jù)一致。

對于非事務型的引擎myisam,沒有commit/rollback的機會,因此在異常情況下,數(shù)據(jù)會和binlog不一致。

本文就介紹到這里,更多Mysql的操作就參考:http://database.51cto.com/col/484/,謝謝大家的支持!

【編輯推薦】

  1. 不同服務器上mysql如何實現(xiàn)同步備份(一)
  2. 不同服務器上mysql如何實現(xiàn)同步備份(二)
  3. 不同服務器上mysql如何實現(xiàn)同步備份(三)
  4. NaviCat通過Http方式連接服務器的MySQL數(shù)據(jù)庫
  5. 詳解Discuz_WIN7_Apache_MySQL_PHP平臺搭建
責任編輯:趙鵬 來源: 博客園
相關推薦

2019-09-16 08:28:17

Mysql數(shù)據(jù)庫binlog

2017-10-23 16:06:41

數(shù)據(jù)庫MySQL復制中斷

2009-02-02 17:21:58

日志文件維護MySQL日志文件

2011-04-07 15:47:28

MySQL數(shù)據(jù)庫

2011-08-04 14:00:01

MySQL數(shù)據(jù)庫時間戳失序binlog

2010-05-31 15:23:02

MySQL數(shù)據(jù)庫NUL

2019-01-02 09:30:59

MySQL數(shù)據(jù)庫日志審計

2021-01-26 13:40:44

mysql數(shù)據(jù)庫

2011-07-19 14:48:36

處理blob字段

2010-05-31 17:15:39

MySQL數(shù)據(jù)庫

2010-05-26 11:21:00

MySQL數(shù)據(jù)庫操作

2010-05-24 09:44:30

MySQL數(shù)據(jù)庫

2010-05-12 15:26:05

MySQL數(shù)據(jù)庫日志

2021-01-12 07:57:36

MySQLBinlog故障處理

2011-03-28 09:27:52

數(shù)據(jù)庫壓縮日志

2011-07-12 16:41:14

mysql處理異常

2009-02-02 16:50:34

數(shù)據(jù)庫表的鎖定MySQL

2010-05-26 10:41:30

2010-06-01 15:32:33

MySQL數(shù)據(jù)庫

2011-08-05 14:02:17

MySQL數(shù)據(jù)庫異常處理
點贊
收藏

51CTO技術棧公眾號