前言
數(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
如下圖
如果我將log-error注釋掉(#log-error=D:/wamp/logs/mysql.log),重啟服務(wù)器,則可以查看到錯誤日志文件在datadir指定的目錄下
錯誤日志的格式:時間 [錯誤級別] 錯誤信息 如果你感覺通過mysql配置文件來定位錯誤日志所在位置比較麻煩,你完全可以通過再客戶端通過命令來查看錯誤日志所在位置 使用命令式:show variables like ‘log_error’; 二進制日志(又叫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ù)的一致性。 在默認(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的二進制日志文件。2.查看錯誤日志
以下是mysql啟動日志
二進制日志
1.作用
2.二進制日志控制與使用
1.開啟
二進制日志文件如下圖
通過使用show variables like’log_bin’檢查bin-log日志是否開啟。
2.查看
MySQL二進制日志主要是供MySQL內(nèi)部使用的,并不是為了數(shù)據(jù)庫管理員閱讀使用,因此,二進制日志與其他日志一個重要的不同就是,二進制文件的格式不是文本格式,其內(nèi)容不能通過記事本直接查看,為了便于管理員管理,MySQL提供了mysqlbinlog工具查看二進制日志內(nèi)容。
比如:mysqlbinlog?D:wampbinmysqlmysql5.6.17datamybinlog.000003
執(zhí)行結(jié)果如下:
現(xiàn)在我們來做一個測試,看看bin日志是否記錄了我更新數(shù)據(jù)庫的操作
比如我將數(shù)據(jù)表t2中id2=2的那行記錄的id1改為5。然后在查詢二進制日志文件,看是否記錄了我的操作。
結(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之前的所有日志。
如下圖:
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ù)如下:
從現(xiàn)在開始,我需要對數(shù)據(jù)進行一些操作,比如更新或者是插入操作,操作后,t1數(shù)據(jù)如下圖
此時,如果很不幸運的事情發(fā)生了,有黑客闖入進來了,將我的t1表數(shù)據(jù)全部刪除了,那么我怎樣得到的黑客刪除之前的數(shù)據(jù)呢?
第一步:我需要將我的數(shù)據(jù)還原到我備份的數(shù)據(jù),還原后結(jié)果如下:
第二步:我需要利用我二進制日志文件還原從數(shù)據(jù)備份那刻到被黑客攻擊前的那刻的所有數(shù)據(jù)操作
執(zhí)行:mysqlbinlog D:wampbinmysqlmysql5.6.17data
mybinlog.000004
分析二進制日志我們發(fā)現(xiàn)在’at 637’行,我們的數(shù)據(jù)遭到了黑客的攻擊,所有我們只需要還原at 637行之前的所有操作,忽略之后的所有操作即可。
于是我們可以執(zhí)行以下命令來恢復(fù)我們的數(shù)據(jù):
mysqlbinlog D:wampbinmysqlmysql5.6.17datamybinlog.000004 –stop-pos=637|mysql -uroot -p**dequan
然后我們再來查看一下我們t1表的數(shù)據(jù)
總于大功告成了,但是這也提示我們,為了恢復(fù)數(shù)據(jù)的方便性,不僅僅需要開啟二進制日志,也要定時保存數(shù)據(jù)。
關(guān)于二進制日志的補充:
1.我們還可以通過使用show binary logs命令查看當(dāng)前還有哪些二進制日志。
2.我們可以通過show binlog events日志記錄的事件
show binlog?events查看的是所有日志記錄的事件。如果想查詢某個二進制日志記錄事件,可以在后面加in+’日志名’,如下圖:
查詢?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)
查看慢查詢時間設(shè)置
如果修改慢查詢時間,可以使用set long_query_time=1.5;
為了便于查看效果,我們將慢查詢時間限制改為0.15,然后我們寫一個時間超過0.15的sql,最后查看日志,是否記錄了該sql語句。
設(shè)置慢查詢時間,以及執(zhí)行相應(yīng)的sql語句
在上面我共執(zhí)行了3條SQL語句,現(xiàn)在我們再來看一下,慢查詢?nèi)罩救缦?/span>
?以上就是Mysql中錯誤日志、binlog日志、查詢?nèi)罩尽⒙樵內(nèi)罩竞喗榈膬?nèi)容,更多相關(guān)內(nèi)容請關(guān)注PHP中文網(wǎng)(www.php.cn)!