新聞中心
引言
在數(shù)據(jù)庫(kù)中,日志文件記錄了數(shù)據(jù)庫(kù)運(yùn)行的各方面信息,對(duì)于數(shù)據(jù)庫(kù)的正常運(yùn)行起著重要作用。在MySQL數(shù)據(jù)庫(kù)中,主要包括了Redolog日志、Undolog日志、Binlog日志、Relaylog日志、GeneralQuery Log日志、SlowQuery Log日志以及Errorlog日志。這些日志共同構(gòu)成了MySQL數(shù)據(jù)庫(kù)的日志體系,在本文中會(huì)逐一對(duì)這些日志的作用進(jìn)行介紹。

公司專注于為企業(yè)提供網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、微信公眾號(hào)開發(fā)、電子商務(wù)商城網(wǎng)站建設(shè),微信小程序,軟件按需網(wǎng)站建設(shè)等一站式互聯(lián)網(wǎng)企業(yè)服務(wù)。憑借多年豐富的經(jīng)驗(yàn),我們會(huì)仔細(xì)了解各客戶的需求而做出多方面的分析、設(shè)計(jì)、整合,為客戶設(shè)計(jì)出具風(fēng)格及創(chuàng)意性的商業(yè)解決方案,創(chuàng)新互聯(lián)建站更提供一系列網(wǎng)站制作和網(wǎng)站推廣的服務(wù)。
一、事務(wù)日志
MySQL InnoDB 引擎中,事務(wù)日志主要由兩個(gè)部分組成,分別是Redolog和Undolog。其中Redolog也稱為重做日志,用于保證事務(wù)的原子性和持久性,在崩潰恢復(fù)期間糾正不完整事務(wù)寫入的數(shù)據(jù)。而Undolog主要是記錄數(shù)據(jù)改動(dòng)的前映像信息,用來(lái)實(shí)現(xiàn)事務(wù)回滾和MVCC功能。
1.1、Redo log 的基本概念
Redo日志主要包含了兩部分:
1)Redo Log Buffer(日志緩沖區(qū)),是位于內(nèi)存中的一塊區(qū)域,主要用于緩存要寫入磁盤日志文件中的數(shù)據(jù)。
2)Redo Log File,位于磁盤上,持久化Log Buffer中的日志數(shù)據(jù)。建庫(kù)后,默認(rèn)會(huì)創(chuàng)建名為ib_logfile0和ib_logfile1的兩個(gè)文件。
為了保證日志的持久性,InnoDB存儲(chǔ)引擎通過(guò)ForceLog at commit機(jī)制實(shí)現(xiàn),即當(dāng)事務(wù)提交時(shí),必須先將該事務(wù)的所有日志寫入到重做日志中。在InnoDB的默認(rèn)設(shè)置下(innodb_flush_method),每次將RedoLog Buffer中日志更新到磁盤中的日志文件時(shí),先將重做日志緩沖寫入到文件系統(tǒng)緩存,然后調(diào)用一次操作系統(tǒng)的fsync操作寫入Redolog file,其過(guò)程如下圖所示。
圖 1 log buffer到log file寫入過(guò)程
針對(duì)為了保證嚴(yán)格遵守ACID特性和磁盤IO性能取舍的問(wèn)題,在MySQLInnoDB引擎中還有一個(gè)參數(shù)innodb_flush_log_at_trx_commit,用來(lái)控制Logbuffer中的日志刷新到磁盤的策略,其策略如下:
1)當(dāng)設(shè)置為1時(shí)(default),事務(wù)每次提交時(shí)都會(huì)將Log buffer中的日志寫入操作系統(tǒng)緩存并調(diào)用fsync寫入到Redo log file中。這樣可以保證每一個(gè)事務(wù)日志不丟失。
2)當(dāng)設(shè)置為0時(shí),并不會(huì)在事務(wù)提交時(shí)一并將Log buffer中的日志 fsync到Redo log file中,而是根據(jù)innodb_flush_log_at_timeout(default=1) 參數(shù)設(shè)置的固定時(shí)間頻率(s),定期將log buffer日志持久化到Redo log file。這樣就有可能會(huì)在異常宕機(jī)時(shí),意外丟失一部分redo 日志,造成了部分事務(wù)日志丟失。
3)當(dāng)設(shè)置為2時(shí),會(huì)在事務(wù)提交時(shí)將Log buffer中的日志寫入到Redo log file,但僅寫入文件系統(tǒng)的緩存中,不進(jìn)行fsync操作。這樣也不能完全保證一個(gè)事務(wù)中所有日志的完整性,如果當(dāng)系統(tǒng)宕機(jī),也可能會(huì)造成沒(méi)有fsync到磁盤中的日志丟失。
1.2 Undo log 的基本概念
Undo log是與單個(gè)讀寫事務(wù)關(guān)聯(lián)的undo日志記錄的集合,undolog記錄包含關(guān)于如何撤消事務(wù)對(duì)聚簇索引記錄的最新更改的信息。Undolog存放在數(shù)據(jù)庫(kù)內(nèi)部的一個(gè)特殊段(segment)中,稱為undosegment,位于共享表空間內(nèi)。
Undolog 在數(shù)據(jù)庫(kù)中主要實(shí)現(xiàn)了兩個(gè)功能分別是事務(wù)的回滾和MVCC。
二、Binlog
Binlog(二進(jìn)制日志)是MySQLServer層維護(hù)的一種二進(jìn)制日志,主要記錄了數(shù)據(jù)庫(kù)中所有的DDL操作和DML操作,但Binlog中不會(huì)記錄SELECT和SHOW這類查詢語(yǔ)句,Binlog語(yǔ)句是以”事務(wù)”的形式保存在磁盤中。
2.1主要作用
1)復(fù)制:在MySQL源端開啟Binlog,并向從端發(fā)送源端生成的binlog,再由從端回放日志實(shí)現(xiàn)與源端數(shù)據(jù)一致。
2)數(shù)據(jù)恢復(fù):通過(guò)Binlog日志實(shí)現(xiàn)指定時(shí)間點(diǎn)的數(shù)據(jù)恢復(fù)。
2.2 Binlog日志的格式
在my.cnf文件中設(shè)置log_bin=/DIRECTORY_NAME/file_name參數(shù),開啟。
Binlog日志主要有三種格式,可以在my.cnf文件中通過(guò)–binlog_format參數(shù)進(jìn)行設(shè)置。
1)STATEMENT
基于SQL語(yǔ)句模式,日志中記錄是執(zhí)行語(yǔ)句和上下文環(huán)境。該模式下生成的日志量較少所以減少了對(duì)磁盤IO的影響,提高了性能。
2)ROW
基于行的模式,會(huì)將每一行的變化都記錄到日志中,相較于statement格式,其日志內(nèi)容要大很多,對(duì)磁盤IO影響較大,但是由于記錄了每行數(shù)據(jù)修改的細(xì)節(jié),因此不會(huì)發(fā)生某些特定情況下從庫(kù)無(wú)法復(fù)制的情況發(fā)生。
3)MIXED
混合模式,即混合了Statement和Row兩種日志格式,是MySQL默認(rèn)的日志格式。在混合模式下,MySQL會(huì)默認(rèn)使用基于SQL語(yǔ)句的日志記錄模式(Statement),但是在一些特殊的場(chǎng)景下會(huì)自動(dòng)切換到基于行的日志記錄模式。
三、Relay log
Relay log(中繼日志)是在MySQL主從復(fù)制時(shí)產(chǎn)生的日志,在MySQL的主從復(fù)制主要涉及到三個(gè)線程:
1) Log dump線程:向從庫(kù)的IO線程傳輸主庫(kù)的Binlog日志
2) IO線程:向主庫(kù)請(qǐng)求Binlog日志,并將Binlog日志寫入到本地的relay log中。
3) SQL線程:讀取Relay log日志,將其解析為SQL語(yǔ)句并逐一執(zhí)行。
圖2
從圖2中可以看出,從庫(kù)的IO線程接收到主庫(kù)的logdump線程傳遞的Binlog日志后,會(huì)將其寫入到本地的一個(gè)日志中,這個(gè)日志就是Relaylog。在文件目錄中,一般由多個(gè)host_name-relay-bin.nnnnnn 的日志文件和host_name-relay-bin.index索引文件組成,其中日志文件記錄的是事務(wù)中修改數(shù)據(jù)的信息,索引文件記錄的是使用過(guò)的日志文件信息。
Relaylog日志的格式與Binlog的一致,但是相較于Binlog多了master.info和relay-log.info兩個(gè)日志(默認(rèn)存儲(chǔ)于數(shù)據(jù)文件目錄中)。master.info主要記錄上一次讀取到master同步過(guò)來(lái)的binlog的位置,從節(jié)點(diǎn)的連接信息和主節(jié)點(diǎn)信息,以及連接master和啟動(dòng)復(fù)制必須的所有信息。relay-log.info主要記錄了從節(jié)點(diǎn)文件復(fù)制的進(jìn)度,下一個(gè)事件從什么位置開始,由sql線程負(fù)責(zé)更新。
四、General Query Log
General QueryLog(通用查詢?nèi)罩?記錄了用戶的所有操作,包括啟動(dòng)和關(guān)閉MySQL服務(wù)、增刪改語(yǔ)句和查詢語(yǔ)句,需要注意查詢?nèi)罩驹赽inlog中是不記錄的。默認(rèn)情況下,該日志是關(guān)閉狀態(tài)。
相關(guān)參數(shù)如下:
general_log = [0|1] --0關(guān)閉,1開啟
log-output = [TABLE|FILE|NONE] --設(shè)置日志輸出對(duì)象
general_log_file = [FILENAME] --設(shè)置輸出日志名稱
五、Slow Query Log
Slow QueryLog(慢速查詢?nèi)罩?由SQL語(yǔ)句組成,記錄了所有執(zhí)行時(shí)間超過(guò)參數(shù)log_query_time(秒)且掃描的記錄數(shù)不小于min_examined_row_limit的所有SQL語(yǔ)句的日志,慢查詢?nèi)罩局饕糜诓檎覉?zhí)行時(shí)間較長(zhǎng)的語(yǔ)句。
默認(rèn)情況下,管理語(yǔ)句和不使用索引的查詢語(yǔ)句是不會(huì)記錄在slowquery log中,不過(guò)可以通過(guò)設(shè)置參數(shù)log_slow_admin_statements和log_queries_not_using_indexes對(duì)這兩類語(yǔ)句進(jìn)行監(jiān)控。在MySQL中,管理語(yǔ)句被定義為ALTER TABLE,ANALYZETABLE, CHECK TABLE, CREATE INDEX, DROP INDEX, OPTIMIZE TABLE和REPAIRTABLE。
如果從文本日志中搜索一些慢查詢的語(yǔ)句,會(huì)非常消耗時(shí)間,MySQL推薦使用mysqldumpslow工具對(duì)慢查詢?nèi)罩具M(jìn)行分類匯總。
相關(guān)參數(shù)如下:
long_query_time = 10 --默認(rèn)是10s,最小值是0
slow_query_log[={0|1}] --也可以是布爾值(ON|OFF),默認(rèn)是0,日志關(guān)閉。
slow_query_log_file=file_name --指定慢查詢?nèi)罩疚募Q,默認(rèn)host_name-slow.log
log-output = [TABLE|FILE|NONE] –設(shè)置日志輸出對(duì)象
六、Error log
ErrorLog(錯(cuò)誤日志)包含mysqld啟動(dòng)和關(guān)閉時(shí)間的記錄,以及診斷消息,如服務(wù)器啟動(dòng)和關(guān)閉期間以及服務(wù)器運(yùn)行時(shí)發(fā)生的錯(cuò)誤、警告和注意事項(xiàng)。當(dāng)數(shù)據(jù)庫(kù)出現(xiàn)故障導(dǎo)致無(wú)法運(yùn)行時(shí),可以通過(guò)查看該日志進(jìn)行問(wèn)題分析。
相關(guān)參數(shù)如下:
log-error [=file_name] --設(shè)置日志名稱
總結(jié)
MySQL數(shù)據(jù)庫(kù)的日志系統(tǒng)是一個(gè)較為龐大的體系,本文中僅僅是針對(duì)一些常見的日志做了簡(jiǎn)要的介紹,在使用和參數(shù)設(shè)置中還有非常多的細(xì)節(jié),大家也可以參考官方文檔進(jìn)行詳細(xì)的學(xué)習(xí)。
當(dāng)前文章:淺析MySQL日志體系
分享鏈接:http://m.5511xx.com/article/djejjeg.html


咨詢
建站咨詢
