我的MYSQL學習心得(15) : 日誌

發表於2015-06-06

這一篇《我的MYSQL學習心得(十五)》將會講解MYSQL的日誌

MYSQL裡的日誌主要分為4類,使用這些日誌檔案,可以檢視MYSQL內部發生的事情。

分別是

1、錯誤日誌:記錄mysql服務的啟動、執行、停止mysql服務時出現的問題

2、查詢日誌:記錄建立的客戶端連線和執行的語句

3、二進位制日誌:記錄所有更改資料的語句,可以用於資料複製

4、慢查詢日誌:記錄所有執行時間超過long_query_time的所有查詢或不使用索引的查詢

預設情況下,所有日誌建立於mysql資料目錄中。通過重新整理日誌,可以強制mysql關閉和重新開啟日誌檔案(或者在某些情況下切換到

一個新的日誌)。當執行一個FLUSH LOGS語句或執行mysqladmin flush-logs 或mysqladmin refresh 時,將重新整理日誌

如果使用mysql複製功能,在複製伺服器上可以維護更多日誌檔案,這種日誌稱為接替日誌

其他日誌功能會降低mysql資料庫的效能。例如,在查詢非常頻繁的mysql資料庫系統中,如果開啟了通用查詢日誌和慢查詢日誌,

mysql資料庫會花費很多時間記錄日誌。同時,日誌會佔用大量的磁碟空間


二進位制日誌

二進位制日誌就是我們經常說的binlog,主要記錄mysql資料庫的變化。

二進位制日誌以一種有效的格式,並且是事務安全的方式包含更新日誌中可用的所有資訊。

二進位制日誌包含關於每個更新資料庫的語句的執行時間資訊。他不包含沒有修改任何資料的語句,例如select語句

使用二進位制日誌的最大目的是最大可能地恢復資料庫,因為二進位制日誌包含備份後進行的所有更新

1、啟動和設定二進位制日誌

預設情況下,二進位制日誌是關閉的,可以通過修改mysql的配置檔案來啟動和設定二進位制日誌

my.ini中[mysqld]組下面有幾個設定是關於二進位制日誌的:

log-bin定義開啟二進位制日誌;path表明日誌檔案所在的目錄路徑;

filename指定了日誌檔案的名稱,如檔案的全名是filename.0001,filename.0002等

除了上述檔案之外,還有一個成為filename.index的檔案,檔案內容為所有日誌的清單,可以使用記事本開啟該檔案

filename.index檔案的內容,joe是我的計算機名,當前只有一個binlog檔案:.\joe-bin.000001

expire_logs_days定義了mysql清除過期日誌的時間,即二進位制日誌自動刪除的天數。

預設值為0,表示“沒有自動刪除”。當mysql啟動或重新整理二進位制日誌時可能刪除該檔案

max_binlog_size定義了單個檔案的大小限制,如果二進位制日誌寫入的內容大小超出給定值,日誌就會發生滾動

(關閉當前檔案,重新開啟一個新的日誌檔案)。不能將該變數設定為大於1GB或小於4096位元組。預設值是1GB

如果正在使用大事務 ,二進位制日誌檔案大小還可能超過max_binlog_size的定義大小。

在my.ini配置檔案中的[mysqld]組下,新增以下幾個引數與引數值

新增完畢之後,關閉並重啟mysql服務程式,即可開啟二進位制日誌,然後可以通過SHOW VARIABLES語句來查詢日誌設定

使用show VARIABLES  語句檢視日誌設定

可以看到log_bin為ON,max_binlog_size為104857600位元組,換算為MB為100MB

MYSQL重新啟動之後,就可以看到新產生的檔案字尾為.000001和.index的兩個檔案,檔名稱預設為主機名稱

如果想改變日誌檔案的目錄位置,可以修改my.ini中log-bin引數

例如:

關閉並重啟mysql服務之後,新的二進位制日誌將出現在”D:\mysql\log\binlog”路徑下

提示:資料庫檔案最好不要和日誌檔案放在同一個磁碟上,這樣當資料庫檔案所在磁碟發生損壞的時候,可以使用日誌來恢復資料

2、檢視二進位制日誌

mysql二進位制日誌是經常用到的。當mysql建立二進位制日誌檔案時,首先建立一個以filename為名稱,以index為字尾的檔案;

再建立一個以filename為名稱,以“.000001”為字尾的檔案。當mysql服務重新啟動一次,以“.000001”為字尾的檔案會增加一個,

並且字尾名加1遞增;如果日誌長度超過了max_binlog_size的上限(預設是1GB)也會建立一個新的日誌檔案

show binary logs語句可以檢視當前二進位制日誌檔案個數和檔名。mysql二進位制日誌並不能直接檢視,如果要檢視日誌內容,

可以通過mysqlbinlog命令檢視

使用show binary logs語句檢視二進位制日誌檔案個數和檔名

可以看到,當前有兩個二進位制日誌檔案,因為我把mysql服務重啟了一次,日誌檔案的個數和mysql服務啟動的次數相同。

每啟動一次mysql服務,將會產生一個新的日誌檔案

使用mysqlbinlog檢視二進位制日誌

mysqlbinlog是一個單獨的exe,需要在命令列裡執行我們把binlog檔案裡面的內容匯出到binlog.txt

3、刪除二進位制日誌

mysql的二進位制日誌可以配置自動刪除,同時mysql也提供了安全的手動刪除二進位制日誌的方法

刪除所有的二進位制日誌檔案使用RESET MASTER;

執行該語句,所有二進位制日誌將被刪除,mysql 會重新建立二進位制日誌,新的日誌副檔名將重新從000001開始編號

只刪除部分二進位制日誌檔案使用PURGE MASTER LOGS;

語法如下

第一種方法指定檔名,執行該命令將刪除檔名編號比指定檔名編號小的所有日誌檔案

第二種方法指定日期,執行該命令將刪除指定日期以前的所有日誌檔案

使用PURGE MASTER LOGS;刪除建立時間比binlog.000003早的所有日誌檔案

首先,為了演示語句操作過程,準備多個日誌檔案,讀者可以對mysql服務進行多次重啟

例如這裡有10個日誌檔案

執行刪除命令

執行完成後,使用 show BINARY logs; 檢視二進位制日誌

可以看到joe-bin.000001和joe-bin.000002兩個日誌檔案被刪除了

使用 PURGE MASTER LOGS 刪除2013年3月30日前建立的所有日誌檔案,執行命令如下

執行完畢之後,2013年3月30日前的日誌檔案都被刪除,但2013年3月30日的日誌會被保留

4、檢視二進位制日誌裡的操作記錄

比如想檢視某一個二進位制日誌裡面的記錄,但又不想用mysqlbinlog,可以使用show binlog events

比如我想檢視’joe-bin.000006’這個binlog檔案的內容,執行如下命令

內容如下

可以看到’joe-bin.000006’這個binlog檔案記錄了哪些SQL命令

如果想知道binlog檔案的建立時間,就需要mysqlbinlog工具來檢視

其中131015為日誌建立時間,即2013年10月15日

5、使用二進位制日誌還原資料庫

如果mysql伺服器啟用了二進位制日誌,在資料庫出現意外丟失資料時,可以使用mysqlbinlog工具從指定的時間點開始

(例如,最後一次備份)直到現在,或另外一個指定的時間點的日誌中恢復資料

要想從二進位制日誌恢復資料,需要知道當前二進位制日誌檔案的路徑和檔名。一般可以從配置檔案(即my.cnf或者my.ini,檔名取決於mysql

伺服器的作業系統)中找到路徑

mysqlbinlog恢復資料的語法如下:

option是一些可選項,filename是日誌檔名

比較重要的兩對option引數是

–start-datetime、–stop-datetime

–start-position、–stop–position

–start-date、–stop-date可以指定恢復資料庫的起始時間點和結束時間點

–start-position、–stop–position可以指定恢復資料的開始位置和結束位置

使用mysqlbinlog恢復mysql資料庫到2014年7月2日15:27:48時的狀態,執行下面命令

該命令執行成功後,會根據binlog.000008日誌檔案恢復2014年7月2日15:27:48前的所有操作。

這種方法對誤操作的刪除資料比較有效

6、暫時停止二進位制日誌

如果在mysql的配置檔案配置啟動了二進位制日誌,mysql會一直記錄二進位制日誌,修改配置檔案,可以停止二進位制日誌,

但是需要重啟mysql資料庫。mysql提供了暫時停止二進位制日誌的功能。通過 SET SQL_LOG_BIN 語句可以使mysql暫停或者啟動二進位制日誌

語法如下

執行下面語句將暫停二進位制日誌

執行下面語句將恢復記錄二進位制日誌

實際上,binlog檔案有點類似於SQLSERVER的ldf檔案,大家都儲存了資料庫的操作日誌,都可以根據這個日誌來恢復資料庫

但是又有不同,mysql的binlog可用不開啟,因為mysql的redo日誌放在ib_logfile開頭的檔案裡面,而undo日誌跟資料檔案是放在一起的

所以這一點跟SQLSERVER很不一樣

在複製的時候,MYSQL一定要開啟binlog功能,slave讀取binlog,而SQLSERVER的訂閱端讀取釋出端的ldf檔案

所以剛才說:binlog檔案有點類似於SQLSERVER的ldf檔案


錯誤日誌

錯誤日誌檔案包含了當mysqld啟動和停止時,以及伺服器在執行過程中發生任何嚴重錯誤時的相關資訊。

在MYSQL中,錯誤日誌也是非常重要的,mysql將啟動和停止資料庫資訊以及一些錯誤資訊記錄到錯誤日誌中

1、啟動和設定錯誤日誌

在預設情況下,錯誤日誌會記錄到資料庫的資料目錄下。如果沒有在配置檔案中指定檔名,則檔名預設為hostname.err。

例如:mysql所在伺服器主機名為mysql-db,記錄錯誤資訊的檔名為mysql-db.err。如果執行了FLUSH LOGS,錯誤日誌檔案會重新載入

錯誤日誌的啟動和停止以及日誌檔名,都可以通過修改my.ini(或者my.cnf)來配置。錯誤日誌的配置項是log-error。

在[mysqld]下配置log-error,在啟動錯誤日誌。如果需要指定檔名,則配置項如下:

path為日誌檔案所在的目錄路徑,filename為日誌檔名。修改配置項後,需要重啟mysql服務才生效

2、檢視錯誤日誌

通過錯誤日誌可以監視系統的執行狀態,便於及時發現故障,修復故障。mysql錯誤日誌是以文字檔案形式儲存的,可以使用文字編輯器直接

檢視mysql錯誤日誌

如果不知道日誌檔案的儲存路徑,可以使用 show variables; 語句檢視錯誤日誌的儲存路徑。

語句如下

使用記事本檢視mysql錯誤日誌

通過上面 show variables LIKE ‘log_error’; 的語句檢視到錯誤日誌的路徑,然後用記事本開啟該檔案

我們可以看到錯誤日誌內容如下

3、刪除錯誤日誌

mysql的錯誤日誌以文字檔案的形式儲存在檔案系統中,可以直接刪除

對於mysql5.5.7以前的版本,flush logs可以將錯誤日誌檔案重新命名為filename.err_old,

並建立新的日誌檔案。但是從mysql5.5.7開始,flush logs只是重新開啟日誌檔案,並不做日誌備份和建立的操作。

如果日誌檔案不存在,mysql啟動或者執行flush logs時會建立新的日誌檔案

在執行狀態下刪除錯誤日誌檔案後,mysql並不會自動建立日誌檔案。flush logs在重新載入日誌的時候,如果檔案不存在,

則會自動建立。所以在刪除錯誤日誌之後,如果需要重建日誌檔案需要在伺服器端執行以下命令:

或者在客戶端登入mysql資料庫,執行flush logs語句

刪除err檔案,並用flush logs語句重建log-error檔案

手動刪除檔案

手動執行 flush logs; ,err檔案恢復了

開啟err檔案,裡面什麼都沒有


通用查詢日誌

通用查詢日誌記錄了mysql的所有使用者操作,包括啟動和關閉服務、執行查詢和更新語句等

1、啟動和設定通用查詢日誌

mysql伺服器預設情況下並沒有開啟通用查詢日誌。如果需要通用查詢日誌,可以通過修改my.ini或my.cnf配置檔案來

開啟。在my.ini或my.cnf的[mysqld]組下加入log選項

形式如下

path為日誌檔案所在目錄路徑,filename為日誌檔名。如果不指定目錄和檔名,通用查詢日誌將預設儲存在mysql資料目錄中的

hostname.log檔案中。hostname是mysql資料庫的主機名

這裡在[mysqld]下面增加選項log,後面不指定引數值

2、檢視通用查詢日誌

通用查詢日誌中記錄了用的所有操作。通過檢視通用查詢日誌,可以瞭解使用者對mysql進行的操作。通用查詢日誌是

以文字檔案形式儲存在檔案系統中的,可以使用文字編輯器直接開啟通用日誌檔案進行檢視,Windows下可以使用記事本

Linux下可以使用vim、gedit等

使用記事本檢視mysql通用查詢日誌

檔案內容如下

可以看到mysql啟動資訊和使用者root連線伺服器與執行查詢語句的記錄

3、刪除通用查詢日誌

通用查詢日誌是以文字檔案的形式儲存在檔案系統中的。通用查詢日誌記錄使用者的所有操作

因此在使用者查詢、更新頻繁的情況下,通用查詢日誌會增長得很快。DBA可以定期刪除比較早的通用日誌,以節省磁碟空間

可以用直接刪除日誌檔案的方式刪除通用查詢日誌。要重新建立新的日誌檔案,可使用語句

直接刪除log檔案

執行 flush logs

log檔案重新生成了


慢查詢日誌

慢查詢日誌是記錄查詢時長超過指定時間的日。慢查詢日誌主要用來記錄執行時間較長的查詢語句

通過慢查詢日誌,可以找出執行時間較長、執行效率較低的語句,然後進行優化

1、啟動和設定慢查詢日誌

mysql中慢查詢日誌預設是關閉的,可以通過配置檔案my.ini或my.cnf中的log-slow-queries選項開啟,也可以在mysql服務

啟動的時候使用–log–slow-queries[=file_name]啟動慢查詢日誌。啟動慢查詢日誌時,需要在my.ini或者my.cnf檔案中

配置long_query_time選項指定記錄閥值,如果某條查詢語句的查詢時間超過了這個值,這個查詢過程將被記錄到慢查詢日誌

檔案中。

在my.ini或者my.cnf檔案中開啟慢查詢日誌的配置如下:

path為日誌檔案所在目錄路徑,filename為日誌檔名。如果不指定目錄和檔名稱,預設儲存在資料目錄中

檔名為hostname-slow.log,hostname是mysql伺服器的主機名。引數n是時間值,單位是秒。

如果沒有設定long-query_time選項,預設時間為10秒

開啟慢查詢日誌

2、檢視慢查詢日誌

mysql的慢查詢日誌是以文字形式儲存的,可以直接使用文字編輯器檢視。在慢查詢日誌中,記錄著執行時間較長的查詢語句,

使用者可以從慢查詢日誌中獲取執行效率較低的查詢語句,為查詢優化提供重要的依據

檢視慢查詢日誌的一些引數

檢視慢查詢日誌檔案裡的內容,使用文字編輯器開啟資料目錄下的WIN7U-20130414Z-slow.log檔案

可以看到這裡記錄了一條慢查詢日誌。執行該條語句的帳戶是root @ localhost

查詢時間是Query_time: 7.578125秒

查詢語句是 SELECT BENCHMARK (10000000,PASSWORD (‘newpwd’));

該語句查詢時間大大超過了設定值1秒,因此被記錄在慢查詢日誌檔案中

BENCHMARK函式簡介:http://database.51cto.com/art/201010/229366.htm 

3、刪除慢查詢日誌

和通用查詢日誌一樣,慢查詢日誌也可以直接刪除。刪除後在不重啟伺服器的情況下,需要執行

重新生成日誌檔案,或者在客戶端登入到伺服器執行 flush logs; 語句重建日誌檔案

官方mysql的慢查詢日誌在這裡有一個缺陷,就是查詢閥值只能是1秒或以上,如果要設定一秒以下就無能為力了

這時候如果想找出1秒以下的慢查詢SQL,可以使用percona提供的microslow-patch來突破限制,將慢查詢時間閥值減小到毫秒級別


平時應開啟哪些日誌

日誌既會影響mysql的效能,又會佔用大量磁碟空間。因此,如果不必要,應儘可能少地開啟日誌。

根據不同的使用環境,考慮開啟不同的日誌。

例如開發環境中優化查詢效率低的語句,可以開啟慢查詢日誌,或者生產環境中發現某些SQL執行特別慢也可以開啟

如果磁碟空間不是特充足可以在高峰期間開啟,在捕獲到查詢慢的SQL之後再關閉慢查詢日誌

如果需要搭建複製環境,那麼就一定要開啟二進位制日誌,如果資料特別重要也建議開啟二進位制日誌,以便資料庫損壞的時候也可以通過二進位制日誌

挽救一部分資料

通用日誌無論在哪種情況下,一般不建議開啟


總結

本文簡單的闡述了MYSQL的日誌面的內容,MYSQL的日誌系統還是比較完善的,希望這篇文章對大家有幫助

如有不對的地方,歡迎大家拍磚o(∩_∩)o 

2014-11-27補充 寫事務日誌流程

相關文章