Mysql中錯誤日志、binlog日志、查詢?nèi)罩尽⒙樵內(nèi)罩竞喗?/a>

前言

數(shù)據(jù)庫的日志是幫助數(shù)據(jù)庫管理員,追蹤分析數(shù)據(jù)庫曾經(jīng)發(fā)生的各種事件的有力依據(jù),mysql中提供了錯誤日志、binlog日志(二進制日志)、查處日志、慢查詢?nèi)罩尽T诖耍伊η蠼鉀Q以下問題:各個日志的作用是什么?怎樣去控制這些日志呢?怎樣去使用這些日志提供的信息呢?

錯誤日志

1.錯誤日志作用

錯誤日志記錄了mysql啟動和停止時,以及服務(wù)器運行過程中發(fā)生任何嚴(yán)重性錯誤的相關(guān)信息。當(dāng)數(shù)據(jù)庫出現(xiàn)任何故障導(dǎo)致無法啟動時候,比如mysql啟動異常,我們可首先檢查此日志。在mysql中,錯誤日志日志(還有其他日志),不僅僅可以存儲在文件中,當(dāng)然還可以存儲到數(shù)據(jù)的表中,至于實現(xiàn)方式,筆者也正在研究中···

2.錯誤日志控制與使用

1.配置

通過log-error=[file-name]來配置(在mysql的配置文件中),如果沒有指定file_name,mysqld使用錯誤日志名為host_name.err(host_name為主機名),并默認(rèn)在參數(shù)datadir(保存數(shù)據(jù)的目錄)指定的目錄中寫入日志文件。

比如我本地使用的是WampServer集成環(huán)境

其中l(wèi)og-error=D:/wamp/logs/mysql.log

如下圖

Mysql中錯誤日志、binlog日志、查詢?nèi)罩尽⒙樵內(nèi)罩竞喗?><br /></span></span></p>
<p><span style=如果我將log-error注釋掉(#log-error=D:/wamp/logs/mysql.log),重啟服務(wù)器,則可以查看到錯誤日志文件在datadir指定的目錄下

Mysql中錯誤日志、binlog日志、查詢?nèi)罩尽⒙樵內(nèi)罩竞喗?><br /></span></span></p>
<h3><span style=2.查看錯誤日志

錯誤日志的格式:時間 [錯誤級別] 錯誤信息

如果你感覺通過mysql配置文件來定位錯誤日志所在位置比較麻煩,你完全可以通過再客戶端通過命令來查看錯誤日志所在位置

使用命令式:show variables like ‘log_error’;

Mysql中錯誤日志、binlog日志、查詢?nèi)罩尽⒙樵內(nèi)罩竞喗?><br /></span></span></p>
<p><span style=以下是mysql啟動日志

Mysql中錯誤日志、binlog日志、查詢?nèi)罩尽⒙樵內(nèi)罩竞喗?><br /></span></span></p>
</p>
<h1><span style=

二進制日志

1.作用

二進制日志(又叫binlog日志)記錄了所有的DDL(數(shù)據(jù)定義語言)語句和DML(數(shù)據(jù)操作語言)語句,但是不包括數(shù)據(jù)查詢語句,語句是以“事件”的形式保存的,它描述數(shù)據(jù)更改的過程。該日志的兩個主要功能是:數(shù)據(jù)的恢復(fù)與數(shù)據(jù)的復(fù)制。

數(shù)據(jù)的恢復(fù):MySQL本身具備數(shù)據(jù)備份和恢復(fù)功能。比如,我們每天午夜12:00進行數(shù)據(jù)的備份。如果某天,下午13:00,數(shù)據(jù)庫出現(xiàn)故障,導(dǎo)致數(shù)據(jù)庫內(nèi)容丟失。我們可以通過二進制日志解決這個問題。解決思路是,可以先將前一天午夜12:00的數(shù)據(jù)備份文件恢復(fù)到數(shù)據(jù)庫,然后再使用二進制日志回復(fù)從前一天午夜12:00到當(dāng)天13:00對數(shù)據(jù)庫操作。

數(shù)據(jù)復(fù)制:MySQL支持主從服務(wù)器間的數(shù)據(jù)復(fù)制功能,并通過該功能實現(xiàn)數(shù)據(jù)庫的冗余機制以保證數(shù)據(jù)庫的可用性和提高數(shù)據(jù)庫德性能。MySQL正是通過二進制日志實現(xiàn)數(shù)據(jù)的傳遞。主服務(wù)器上的二進制日志內(nèi)容會被發(fā)送到各個從服務(wù)器上,并在每個從服務(wù)器上執(zhí)行,從而保證了主從服務(wù)器之間數(shù)據(jù)的一致性。

2.二進制日志控制與使用

1.開啟

在默認(rèn)情況下,mySQL不會記錄二進制日志。怎樣才能開啟MySQL的二進制日志記錄功能呢?

我們可以通過MySQL的配置文件來控制MySQL啟動二進制日志記錄功能。通過修改參數(shù)log-bin=[base_name]來啟動MySQL二進制日志。mySQL會將修改的數(shù)據(jù)庫內(nèi)容的語句記錄到以 base_name-bin.0000x為名的日志文件中,其中bin代表binary,后綴00000x代表二進制日志文件的順序,每次啟動Mysql,日志文件順序會自動加1.如果base_name沒有定義,MySQL將使用pid-file參數(shù)設(shè)置的值作為二進制日志文件的基礎(chǔ)名字。

比如我將log-bin文件名定為mybinlog,那么將會在D:/wamp/bin/mysql/mysql5.6.17/data目錄下,生成mybinlog.00000x的二進制日志文件。

Mysql中錯誤日志、binlog日志、查詢?nèi)罩尽⒙樵內(nèi)罩竞喗?><br /></span></p>
<p><span style=二進制日志文件如下圖

Mysql中錯誤日志、binlog日志、查詢?nèi)罩尽⒙樵內(nèi)罩竞喗?></p>
<p><span style=通過使用show variables like’log_bin’檢查bin-log日志是否開啟。

Mysql中錯誤日志、binlog日志、查詢?nèi)罩尽⒙樵內(nèi)罩竞喗?><br /></span></p>
<p><span style=

2.查看

MySQL二進制日志主要是供MySQL內(nèi)部使用的,并不是為了數(shù)據(jù)庫管理員閱讀使用,因此,二進制日志與其他日志一個重要的不同就是,二進制文件的格式不是文本格式,其內(nèi)容不能通過記事本直接查看,為了便于管理員管理,MySQL提供了mysqlbinlog工具查看二進制日志內(nèi)容。

比如:mysqlbinlog?D:wampbinmysqlmysql5.6.17datamybinlog.000003

執(zhí)行結(jié)果如下:

Mysql中錯誤日志、binlog日志、查詢?nèi)罩尽⒙樵內(nèi)罩竞喗?></p>
<p><span style=現(xiàn)在我們來做一個測試,看看bin日志是否記錄了我更新數(shù)據(jù)庫的操作

比如我將數(shù)據(jù)表t2中id2=2的那行記錄的id1改為5。然后在查詢二進制日志文件,看是否記錄了我的操作。

Mysql中錯誤日志、binlog日志、查詢?nèi)罩尽⒙樵內(nèi)罩竞喗?><br /></span></p>
<p><span style=結(jié)果和明顯,二進制文件記錄了我修改數(shù)據(jù)庫的操作,并且還記錄了我是修改那個數(shù)據(jù)庫里面的數(shù)據(jù),至于我查詢語句,它并沒有記錄。

3.二進制日志的刪除

對應(yīng)比較方繁忙的系統(tǒng)來說,由于每天生成大量的日志,這些日子如果長時間不清楚(或轉(zhuǎn)移),將會對磁盤空間帶來很大的浪費。因此,定期刪除日志是DBA維護MYSQL數(shù)據(jù)庫的一個重要的內(nèi)容。

1.通過reset master 命令

執(zhí)行reset master命令,該命令將刪除所有的binlog日志。新的日志文件的編號從000001開始。

2.通過purege master logs to命令

通過執(zhí)行purge master logs to’base_name.xxxxxx’,刪除‘xxxxxx’編號之前的所有日志。下面我將刪除mybinlog.000003之前的所有日志。

如下圖:

Mysql中錯誤日志、binlog日志、查詢?nèi)罩尽⒙樵內(nèi)罩竞喗?><br /></span></p>
<h4> <span style=
3.通過purge master logs beffor ‘時間’ 命令

執(zhí)行purge master logs beffor ‘時間’ 表示刪除’時間’之前的所有日志。比如刪除2016-04-01 00:00:00之前的所有日志,命令如下:

purge master logs beffor ‘2016-04-01 00:00:00‘;

4.通過在配置文件中設(shè)置參數(shù)expire_logs_days

通過設(shè)置參數(shù)expire_logs_days=#,來指定日志過期的天數(shù),過了指定的天數(shù),日志將會被自動刪除,這個是我比較喜歡的方式。比如設(shè)置expire_logs_day=3,代表3天后會被自動刪除。

4.二進制日志重要參數(shù)說明

max_binlog_size:指定單個二進制日志文件的最大值,如果超過該值,則產(chǎn)生新的二進制日志文件,后綴名+1,并記錄到.index文件中。

binlog_cache_size:緩存區(qū)大小

sync_binlog:表示沒寫緩存多少次就同步到磁盤,如果將N設(shè)置為1,表示采用同步寫到磁盤的方式寫進二進制文件。MySQL中系統(tǒng)默認(rèn)的設(shè)置是sync_binlog=0,也就是不做任何強制性的磁盤刷新指令,這時候的性能是最好的,但是風(fēng)險也是最大的。因為一旦系統(tǒng)Crash,在binlog_cache中的所有binlog信息都會被丟失。而當(dāng)設(shè)置為“1”的時候,是最安全但是性能損耗最大的設(shè)置。因為當(dāng)設(shè)置為1的時候,即使系統(tǒng)Crash,也最多丟失binlog_cache中未完成的一個事務(wù),對實際數(shù)據(jù)沒有任何實質(zhì)性影響。

binlog-do-db:需要記錄哪些數(shù)據(jù)庫的日子,默認(rèn)值為空,表示將所有庫日志同步到二進制日志中。

binlog-ignore-db:需要忽略哪些數(shù)據(jù)庫的日子

log-slave-update:搭建主從數(shù)據(jù)庫時候需要配置

binglog_format:可選值有statement(記錄邏輯sql語句)、row(記錄表的行更動情況)、mixed

5.利用二進制日志進行數(shù)據(jù)恢復(fù)

在前面討論過如果數(shù)據(jù)出現(xiàn)異常,想將其恢復(fù)到在某個時間點的數(shù)據(jù),僅僅靠二進制往往是不夠的,我們還需要的是在這個時間點之前備份的數(shù)據(jù)。

為了便于觀察效果,現(xiàn)在我已經(jīng)將我的數(shù)據(jù)庫備份了,此時數(shù)據(jù)表t1中數(shù)據(jù)如下:

Mysql中錯誤日志、binlog日志、查詢?nèi)罩尽⒙樵內(nèi)罩竞喗?><br /></span></p>
<p><span style=從現(xiàn)在開始,我需要對數(shù)據(jù)進行一些操作,比如更新或者是插入操作,操作后,t1數(shù)據(jù)如下圖

Mysql中錯誤日志、binlog日志、查詢?nèi)罩尽⒙樵內(nèi)罩竞喗?><br /></span></p>
<p><span style=此時,如果很不幸運的事情發(fā)生了,有黑客闖入進來了,將我的t1表數(shù)據(jù)全部刪除了,那么我怎樣得到的黑客刪除之前的數(shù)據(jù)呢?

Mysql中錯誤日志、binlog日志、查詢?nèi)罩尽⒙樵內(nèi)罩竞喗?><br /></span></p>
<p><span style=第一步:我需要將我的數(shù)據(jù)還原到我備份的數(shù)據(jù),還原后結(jié)果如下:

Mysql中錯誤日志、binlog日志、查詢?nèi)罩尽⒙樵內(nèi)罩竞喗?><br /></span></p>
<p><span style=

第二步:我需要利用我二進制日志文件還原從數(shù)據(jù)備份那刻到被黑客攻擊前的那刻的所有數(shù)據(jù)操作

執(zhí)行:mysqlbinlog D:wampbinmysqlmysql5.6.17data
mybinlog.000004

分析二進制日志我們發(fā)現(xiàn)在’at 637’行,我們的數(shù)據(jù)遭到了黑客的攻擊,所有我們只需要還原at 637行之前的所有操作,忽略之后的所有操作即可。

Mysql中錯誤日志、binlog日志、查詢?nèi)罩尽⒙樵內(nèi)罩竞喗?><br /></span></p>
<p><span style=于是我們可以執(zhí)行以下命令來恢復(fù)我們的數(shù)據(jù):

mysqlbinlog D:wampbinmysqlmysql5.6.17datamybinlog.000004 –stop-pos=637|mysql -uroot -p**dequan

Mysql中錯誤日志、binlog日志、查詢?nèi)罩尽⒙樵內(nèi)罩竞喗?></p>
<p><span style=然后我們再來查看一下我們t1表的數(shù)據(jù)

Mysql中錯誤日志、binlog日志、查詢?nèi)罩尽⒙樵內(nèi)罩竞喗?><br /></span></span></span></span></p>
<p><span style=總于大功告成了,但是這也提示我們,為了恢復(fù)數(shù)據(jù)的方便性,不僅僅需要開啟二進制日志,也要定時保存數(shù)據(jù)。

關(guān)于二進制日志的補充:

1.我們還可以通過使用show binary logs命令查看當(dāng)前還有哪些二進制日志。

Mysql中錯誤日志、binlog日志、查詢?nèi)罩尽⒙樵內(nèi)罩竞喗?></p>
<p style=2.我們可以通過show binlog events日志記錄的事件

show binlog?events查看的是所有日志記錄的事件。如果想查詢某個二進制日志記錄事件,可以在后面加in+’日志名’,如下圖:

Mysql中錯誤日志、binlog日志、查詢?nèi)罩尽⒙樵內(nèi)罩竞喗?><br /></span></p>
<h1><span style=

查詢?nèi)罩?/span>

1.功能描述

查詢?nèi)罩居涗浟丝蛻舳说?span style="color:#ff0000">所有語句。可以通過log=[file_name]來指定其位置,和其他日志一樣,如果沒有指定file_name值,日志將會寫到datadir所在目錄,默認(rèn)的文件名師host_name.log,此日志對系統(tǒng)性能的影響較大,一般不會開啟,在此,不細(xì)說。


慢查詢?nèi)罩?/span>

1.功能描述

慢查詢?nèi)罩臼怯涗浰袌?zhí)行時間超過參數(shù)long_query_time(單位:秒),的SQL語句日志。為了獲得表鎖,而等待的時間,不算執(zhí)行時間。我們可以通過log-slow-queries=[file_name]選項來啟動慢查詢?nèi)罩竟δ堋:颓懊娴娜罩疽粯樱绻麤]有指定file_name,那么日志目錄在datedir目錄下,且默認(rèn)的名字為host_name-slow.log。

2.慢查詢?nèi)罩咀x取

查詢慢查詢開啟狀態(tài)

Mysql中錯誤日志、binlog日志、查詢?nèi)罩尽⒙樵內(nèi)罩竞喗?></p>
<p>在配置文件中添加如下代碼,開啟慢查詢</p>
<p>#開啟慢查詢<br />slow_query_log=ON<br />slow_query_log_file=D:/wamp/logs/myslowquery.log<br />long_query_time=1.5</p>
<p><img decoding=查看慢查詢時間設(shè)置

Mysql中錯誤日志、binlog日志、查詢?nèi)罩尽⒙樵內(nèi)罩竞喗?></p>
<p style=如果修改慢查詢時間,可以使用set long_query_time=1.5;

Mysql中錯誤日志、binlog日志、查詢?nèi)罩尽⒙樵內(nèi)罩竞喗?></p>
<p style=為了便于查看效果,我們將慢查詢時間限制改為0.15,然后我們寫一個時間超過0.15的sql,最后查看日志,是否記錄了該sql語句。

設(shè)置慢查詢時間,以及執(zhí)行相應(yīng)的sql語句

Mysql中錯誤日志、binlog日志、查詢?nèi)罩尽⒙樵內(nèi)罩竞喗?></p>
<p style=

Mysql中錯誤日志、binlog日志、查詢?nèi)罩尽⒙樵內(nèi)罩竞喗?></p>
<p style=在上面我共執(zhí)行了3條SQL語句,現(xiàn)在我們再來看一下,慢查詢?nèi)罩救缦?/span>

Mysql中錯誤日志、binlog日志、查詢?nèi)罩尽⒙樵內(nèi)罩竞喗?><br /></span></p>
<p>其只是記錄了查詢其中查詢時間比較長的那條sql語句。</p>
<p><span style=

?以上就是Mysql中錯誤日志、binlog日志、查詢?nèi)罩尽⒙樵內(nèi)罩竞喗榈膬?nèi)容,更多相關(guān)內(nèi)容請關(guān)注PHP中文網(wǎng)(www.php.cn)!

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊12 分享