1. 程式人生 > >Mysql中錯誤日誌、binlog日誌、查詢日誌、慢查詢日誌簡單介紹

Mysql中錯誤日誌、binlog日誌、查詢日誌、慢查詢日誌簡單介紹

安全 view 記錄 bin 嚴重 like mod ng- ror

前言

數據庫的日誌是幫助數據庫管理員,追蹤分析數據庫以前發生的各種事件的有力根據。mysql中提供了錯誤日誌、binlog日誌(二進制日誌)、查處日誌、慢查詢日誌。在此,我力求解決下面問題:各個日誌的作用是什麽?如何去控制這些日誌呢?如何去使用這些日誌提供的信息呢?

錯誤日誌

1.錯誤日誌作用

錯誤日誌記錄了mysql啟動和停止時。以及server執行過程中發生不論什麽嚴重性錯誤的相關信息。當數據庫出現不論什麽故障導致無法啟動時候。比方mysql啟動異常。我們可首先檢查此日誌。在mysql中,錯誤日誌
日誌(還有其它日誌),不只能夠存儲在文件裏。當然還能夠存儲到數據的表中。至於實現方式。筆者也正在研究中··
·

2.錯誤日誌控制與使用

1.配置

通過log-error=[file-name]來配置(在mysql的配置文件裏),假設沒有指定file_name,mysqld使用錯誤日誌名為host_name.err(host_name為主機名)。並默認在參數datadir(保存數據的文件夾)指定的文件夾中寫入日誌文件。 比方我本地使用的是WampServer集成環境 當中log-error=D:/wamp/logs/mysql.log
例如以下圖 技術分享圖片
假設我將log-error凝視掉(#log-error=D:/wamp/logs/mysql.log),重新啟動server。則能夠查看到錯誤日誌文件在datadir指定的文件夾下
技術分享圖片

2.查看錯誤日誌

錯誤日誌的格式:時間 [錯誤級別] 錯誤信息 假設你感覺通過mysql配置文件來定位錯誤日誌所在位置比較麻煩。你全然能夠通過再client通過命令來查看錯誤日誌所在位置 使用命令式:show variables like ‘log_error‘; 技術分享圖片
下面是mysql啟動日誌 技術分享圖片


二進制日誌

1.作用

二進制日誌(又叫binlog日誌)記錄了全部的DDL(數據定義語言)語句和DML(數據操作語言)語句。可是不包含數據查詢語句。語句是以“事件”的形式保存的,它描寫敘述數據更改的過程。該日誌的兩個主要功能是:數據的恢復與數據的復制。
數據的恢復:MySQL本身具備數據備份和恢復功能。

比方,我們每天午夜12:00進行數據的備份。

假設某天,下午13:00,數據庫出現問題。導致數據庫內容丟失。

我們能夠通過二進制日誌解決問題。解決思路是。能夠先將前一天午夜12:00的數據備份文件恢復到數據庫,然後再使用二進制日誌回復從前一天午夜12:00到當天13:00對數據庫操作。 數據復制:MySQL支持主從server間的數據復制功能,並通過該功能實現數據庫的冗余機制以保證數據庫的可用性和提高數據庫德性能。MySQL正是通過二進制日誌實現數據的傳遞。

主server上的二進制日誌內容會被發送到各個從server上。並在每一個從server上運行,從而保證了主從server之間數據的一致性。

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

1.開啟

在默認情況下,mySQL不會記錄二進制日誌。如何才幹開啟MySQL的二進制日誌記錄功能呢? 我們能夠通過MySQL的配置文件來控制MySQL啟動二進制日誌記錄功能。通過改動參數log-bin=[base_name]來啟動MySQL二進制日誌。

mySQL會將改動的數據庫內容的語句記錄到以 base_name-bin.0000x為名的日誌文件裏。當中bin代表binary。後綴00000x代表二進制日誌文件的順序,每次啟動Mysql,日誌文件順序會自己主動加1.假設base_name未定義。MySQL將使用pid-file參數設置的值作為二進制日誌文件的基礎名字。 比方我將log-bin文件名稱定為mybinlog。那麽將會在D:/wamp/bin/mysql/mysql5.6.17/data文件夾下,生成mybinlog.00000x的二進制日誌文件。

技術分享圖片
二進制日誌文件例如以下圖 技術分享圖片
通過使用show variables like‘log_bin‘檢查bin-log日誌是否開啟。 技術分享圖片

2.查看

MySQL二進制日誌主要是供MySQL內部使用的。並非為了數據庫管理員閱讀使用,因此,二進制日誌與其它日誌一個重要的不同就是,二進制文件的格式不是文本格式,其內容不能通過記事本直接查看,為了便於管理員管理。MySQL提供了mysqlbinlog工具查看二進制日誌內容。



比方:mysqlbinlog D:\wamp\bin\mysql\mysql5.6.17\data\mybinlog.000003

運行結果例如以下:

技術分享圖片

如今我們來做一個測試。看看bin日誌是否記錄了我更新數據庫的操作

比方我將數據表t2中id2=2的那行記錄的id1改為5。然後在查詢二進制日誌文件,看是否記錄了我的操作。

技術分享圖片

結果和明顯,二進制文件記錄了我改動數據庫的操作,而且還記錄了我是改動那個數據庫裏面的數據,至於我查詢語句。它並沒有記錄。

3.二進制日誌的刪除

相應比較方繁忙的系統來說,因為每天生成大量的日誌,這些日子假設長時間不清楚(或轉移),將會對磁盤空間帶來非常大的浪費。因此。定期刪除日誌是DBA維護MYSQL數據庫的一個重要的內容。

1.通過reset master 命令

運行reset master命令,該命令將刪除全部的binlog日誌。新的日誌文件的編號從000001開始。

2.通過purege master logs to命令

通過運行purge master logs to‘base_name.xxxxxx‘,刪除‘xxxxxx‘編號之前的全部日誌。以下我將刪除mybinlog.000003之前的全部日誌。 例如以下圖: 技術分享圖片


3.通過purge master logs beffor ‘時間‘ 命令

運行purge master logs beffor ‘時間‘ 表示刪除‘時間‘之前的全部日誌。比方刪除2016-04-01 00:00:00之前的全部日誌。命令例如以下: purge master logs beffor ‘2016-04-01 00:00:00‘;

4.通過在配置文件裏設置參數expire_logs_days

通過設置參數expire_logs_days=#,來指定日誌過期的天數,過了指定的天數,日誌將會被自己主動刪除,這個是我比較喜歡的方式。比方設置expire_logs_day=3,代表3天後會被自己主動刪除。

4.二進制日誌重要參數說明

max_binlog_size:指定單個二進制日誌文件的最大值,假設超過該值,則產生新的二進制日誌文件,後綴名+1。並記錄到.index文件裏。
binlog_cache_size:緩存區大小 sync_binlog:表示沒寫緩存多少次就同步到磁盤。假設將N設置為1,表示採用同步寫到磁盤的方式寫進二進制文件。

MySQL中系統默認的設置是sync_binlog=0。也就是不做不論什麽強制性的磁盤刷新指令。這時候的性能是最好的,可是風險也是最大的。由於一旦系統Crash。在binlog_cache中的全部binlog信息都會被丟失。而當設置為“1”的時候,是最安全可是性能損耗最大的設置。由於當設置為1的時候。即使系統Crash。也最多丟失binlog_cache中未完畢的一個事務,對實際數據沒有不論什麽實質性影響。 binlog-do-db:須要記錄哪些數據庫的日子,默認值為空,表示將全部庫日誌同步到二進制日誌中。
binlog-ignore-db:須要忽略哪些數據庫的日子
log-slave-update:搭建主從數據庫時候須要配置 binglog_format:可選值有statement(記錄邏輯sql語句)、row(記錄表的行更動情況)、mixed

5.利用二進制日誌進行數據恢復

在前面討論過假設數據出現異常。想將其恢復到在某個時間點的數據,只靠二進制往往是不夠的,我們還須要的是在這個時間點之前備份的數據。 為了便於觀察效果,如今我已經將我的數據庫備份了,此時數據表t1中數據例如以下: 技術分享圖片
從如今開始,我須要對數據進行一些操作,比方更新或者是插入操作,操作後。t1數據例如以下圖 技術分享圖片

此時。假設非常不幸運的事情發生了。有黑客闖入進來了。將我的t1表數據所有刪除了,那麽我如何得到的黑客刪除之前的數據呢? 技術分享圖片

第一步:我須要將我的數據還原到我備份的數據。還原後結果例如以下: 技術分享圖片

第二步:我須要利用我二進制日誌文件還原從數據備份那刻到被黑客攻擊前的那刻的全部數據操作 運行:mysqlbinlog D:\wamp\bin\mysql\mysql5.6.17\data
\mybinlog.000004
分析二進制日誌我們發如今‘at 637‘行,我們的數據遭到了黑客的攻擊。全部我們僅僅須要還原at 637行之前的全部操作。忽略之後的全部操作就可以。 技術分享圖片
於是我們能夠運行下面命令來恢復我們的數據: mysqlbinlog D:\wamp\bin\mysql\mysql5.6.17\data\mybinlog.000004 --stop-pos=637|mysql -uroot -p**dequan 技術分享圖片
然後我們再來查看一下我們t1表的數據 技術分享圖片
總於大功告成了,可是這也提示我們,為了恢復數據的方便性,不只須要開啟二進制日誌,也要定時保存數據。

關於二進制日誌的補充:

1.我們還能夠通過使用show binary logs命令查看當前還有哪些二進制日誌。

技術分享圖片

2.我們能夠通過show binlog events日誌記錄的事件

show binlog events查看的是全部日誌記錄的事件。假設想查詢某個二進制日誌記錄事件,能夠在後面加in+‘日誌名‘。例如以下圖:

技術分享圖片


查詢日誌

1.功能描寫敘述 查詢日誌記錄了client得全部語句。能夠通過log=[file_name]來指定其位置。和其它日誌一樣,假設沒有指定file_name值。日誌將會寫到datadir所在文件夾,默認的文件名稱師host_name.log,此日誌對系統性能的影響較大。一般不會開啟,在此。不細說。


慢查詢日誌

1.功能描寫敘述

慢查詢日誌是記錄全部運行時間超過參數long_query_time(單位:秒),的SQL語句日誌。為了獲得表鎖,而等待的時間,不算運行時間。

我們能夠通過log-slow-queries=[file_name]選項來啟動慢查詢日誌功能。和前面的日誌一樣,假設沒有指定file_name,那麽日誌文件夾在datedir文件夾下,且默認的名字為host_name-slow.log。

2.慢查詢日誌讀取

查詢慢查詢開啟狀態 技術分享圖片
在配置文件裏加入例如以下代碼,開啟慢查詢 #開啟慢查詢
slow_query_log=ON
slow_query_log_file=D:/wamp/logs/myslowquery.log
long_query_time=1.5
技術分享圖片
(有的地方說是通過log-slow-queries=[file_name]來指定慢查詢日誌,可是我試過了,這樣啟動mysql會報錯,可能是我在win系統下操作,又或可能我本地是使用WampServer集成環境安裝的mysql、又或可能是使用的版本號不一樣) 查看慢查詢時間設置 技術分享圖片
假設改動慢查詢時間。能夠使用set long_query_time=1.5; 技術分享圖片
為了便於查看效果。我們將慢查詢時間限制改為0.15。然後我們寫一個時間超過0.15的sql,最後查看日誌,是否記錄了該sql語句。

設置慢查詢時間。以及運行對應的sql語句 技術分享圖片

技術分享圖片

在上面我共運行了3條SQL語句,如今我們再來看一下,慢查詢日誌例如以下

技術分享圖片

其僅僅是記錄了查詢當中查詢時間比較長的那條sql語句。

Mysql中錯誤日誌、binlog日誌、查詢日誌、慢查詢日誌簡單介紹