第 14 章 MySQL的日誌管理

日誌是MySQL數據庫的重要組成部分,日誌文件中記錄着MySQL數據庫運行期間發生的變化,如:MySQL數據庫的客戶端連接情況、SQL語句的執行情況和錯誤信息等。當數據庫遭到意外的損壞時,可以通過日誌查看文件出錯的原因,並且可以通過日誌文件進行數據恢復;也可以通過日誌文件分析數據、優化查詢等。MySQL日誌管理機制比較完善,它包含了以下幾種常用的日誌文件,分別爲:錯誤日誌(-log-err)、查詢日誌(-log)、二進制日誌(-log-bin)、更新日誌(-log-update)及慢查詢日誌(-log-slow-queries)。對於MySQL管理員而言,日誌文件是不可或缺的組成部分。本章介紹MySQL日誌文件的操作及日誌文件的管理。

14.1 操作錯誤日誌

在MySQL數據庫中,錯誤日誌記錄着MySQL服務器的啓動和停止過程中的信息、服務器在運行過程中發生的故障和異常情況的相關信息、事件調度器運行一個事件時產生的信息、從服務器上啓動服務器進程時產生的信息等。錯誤日誌記錄的並非全是錯誤信息,如MySQL如何啓動InnoDB的表空間文件、如何初始化自己的存儲引擎等信息也記錄在錯誤日誌文件中。

14.1.1 啓動錯誤日誌

錯誤日誌功能默認狀態下是開啓的,並且不能被禁止。錯誤日誌也可以自行配置,通過修改my.ini文件即可。錯誤日誌所記錄的信息是可以通過log-error和log-warnings來定義的,其中,log-err定義是否啓用錯誤日誌的功能和錯誤日誌的村粗位置,log-warnings定義是否將警告信息也定義至錯誤日誌中。–log-err=[file-name]用來指定錯誤日誌存放的位置。如果沒有指定[file-name],默認hostname.err作爲文件名,默認存放在DATADIR目錄中。

14.1.2 查看錯誤日誌

錯誤日誌是以文本文件的形式存儲的,直接使用普通文本工具就可以打開查看。Windows操作系統可以使用文本編輯器查看。linux操作系統下,可以使用vi工具或者使用gedit工具來查看。
通過show命令可以查看錯誤日誌文件所在目錄及文件名信息。
show variables like ‘log_error’;

14.1.3 刪除錯誤日誌

管理員可以刪除很久之前的錯誤日誌,這樣可以保證MySQL服務器上的硬盤空間。通過show命令查看錯誤文件所在位置,確認可以刪除錯誤日誌後可以直接刪除文件。在MySQL數據庫中,可以使用mysqladmin命令來開啓新的錯誤日誌,語法如下:
flush logs;
執行該命令後,系統會自動創建一個新的錯誤日誌文件。

14.2 操作查詢日誌

查詢日誌記錄了用戶的所有操作,包括對數據庫的增、刪、查、改等信息,在併發操作多的環境下會產生大量的信息,從而導致不必要的磁盤IO,會影響MySQL的性能。如不是爲了調試數據庫的目的建議不要開啓查詢日誌。

14.2.1 啓動查詢日誌

默認情況下查詢日誌是關閉的。如果需要打開查詢日誌,可以通過修改my.ini文件來啓動查詢日誌。在[mysqld]組下加入log選項,格式如下:
[mysqld]
log[=path/[filename]]
其中,path用來指定查詢日誌存放的位置;[filename]用來指定查詢日誌文件名,默認主機名(hostname)作爲文件名,存放在DATADIR目錄中。
也可以通過命令行來啓動查詢日誌:
set global general_log=on;
或者使用如下命令:
set global general_log=1;
也可通過命令行來設置查詢日誌存放的位置。
set global general_log_file=‘e:/mysql-5.6.22-winx64/log/general_log.log’;
然後通過show 命令查看通用查詢日誌,語法如下:
show variables like ‘general%’;

14.2.2 查看查詢日誌

用戶的所有操作都會記錄到查詢日誌中。該日誌是以文本文件的形式存儲的。Windows操作系統可以使用文本編輯器查看。linux操作系統下,可以通過vi工具或者gedit工具來查看。首相通過show命令找到查詢日誌文件所在位置及文件名,打開日誌文件,可以看到。

14.2.3 刪除查詢日誌

通過show命令查看查詢日誌文件所在位置,確認可以刪除通用查詢日誌後可以直接刪除文件。在MySQL數據庫中,可以使用mysqladmin命令來開啓新的查詢日誌。語法如下:
flush logs;
執行該命令後,系統會自動創建一個新的查詢日誌文件。
注意:更新記錄中沒有記錄錯誤的語句,這對於恢復被破壞的數據庫內容非常有意義。

14.3 操作二進制日誌

MySQL數據的二進制日誌是用來記錄所有用戶對數據庫的操作。當數據庫發生意外時,可以通過此文件查看在一定時間段內用戶所做的操作,結合數據庫備份技術,即可再現用戶操作,使數據庫恢復。
提示:進制日誌開啓後,所有對數據庫操作的記錄均會被記錄到此文件,所以當長時間開啓之後,日誌文件會變得很大,佔用磁盤空間。

14.3.1 啓動二進制日誌

二進制日誌記錄了所有對數據庫數據的修改操作,所以MySQL數據庫默認情況下是不開啓二進制日誌文件的,可通過查看命令查看:
show variables like ‘log_bin’;
根據實際需要,可以通過以下步驟手動啓用二進制日誌。
(1)打開MySQL安裝目錄\my.ini(Windows系統是my.ini文件,linux是my.cnf文件)。
(2)找到[mysqld]這個標籤,在此標籤下面一行,添加如下語句:
log_bin=[filename]
再該語句中,log_bin說明要開啓二進制日誌文件;filename是二進制日誌文件的名字。如果沒有指定[filename],默認爲主機名後面跟_bin作爲文件名,默認存放在DATADRI目錄中。
如果只對制定數據庫生成二進制日誌,則需要添加如下語句:
Binlog_do_db=db_name(數據庫名稱)
如果不對制定數據庫生成二進制日誌,則需要添加如下語句:
Binlog_ignore_db=db_name(數據庫名稱)
(3)重啓MySQL服務。可以在MySQL安裝目錄\data文件夾下看到“binary_log.數字編號”文件,如:binary_log.000001。以後每重啓一次MySQL服務,都會重新生成二進制日誌文件,文件名中的數字編號依次遞增。
如果日誌長度超過了max_binlog_size的上限(默認是 1G)也會創建一個新的日誌文件,通過SHOW 命令查看二進制日誌的上限。
show variables like ‘max_binlog_size’;
使用flush logs(MySQL命令符)或者執行mysqladmin -u -p flush-logs(Windows命令提示符)也會創建一個新的日誌文件。
完成以上操作後再次查看二進制日誌相關信息如下:
show variables like ‘log_bin%’\G
技巧:重啓MySQL服務操作:首先退出mysql,輸入“net stop mysql”;提示服務停止後,再次輸入“net start mysql”即可重啓服務。

14.3.2 查看二進制日誌

可以通過以下命令查詢二進制日誌:
show binary logs;
由於binary是以binary方式存取,不能直接在Windows下查看,可以通過MySQL提供的mysqlbinlog工具查看。
也可以通過show命令查看對數據庫的操作事件。
show binlog events in ‘binary_log.000004’\G
通過二進制日誌文件的內容可以看出對數據庫操作記錄,對於管理員對數據庫進行管理或數據恢復提供了依據。
通過mysqlbinlog工具查看二進制日誌的所有內容:
mysqlbinlog –no-defaults e:\mysql-5.6.22-winx64\data\binary_log.0000013
在二進制日誌文件中,對數據庫的DML操作和DDL都記錄到了binlog中,而SELECT並沒有記錄。如果用戶想記錄SELECT和SHOW操作,就只能使用查詢日誌,而不是二進制日誌。此外,二進制日誌還包括了執行數據更改操作的時間等其他額外信息。
總之,開啓二進制日誌可以實現以下幾個功能:
(1)恢復:某些數據的恢復需要二進制日誌。例如:在一個數據庫全備文件恢復後,用戶可以通過二進制日誌進行point_in_time的恢復。
(2)複製:其原理與恢復類似,通過複製和執行二進制日誌使一臺遠程的MySQL數據庫與一臺MySQL數據庫進行實時同步。
(3)審計:用戶可以通過二進制日誌中的信息來進行審計,判斷是否有對數據庫進行注入的攻擊。

14.3.3 刪除二進制日誌

開啓二進制日誌會對數據庫整體性能有所影響,但是性能的損失十分有限。根據MySQL官方手冊中的測試表明,開啓二進制日誌會使性能下降1%。但考慮到可以使用複製和point_in_time的恢復,這些性能的損失是可以被接受的。對於早期的二進制日誌,在確認無用的情況下,爲了節約磁盤空間,可以進行刪除。下面介紹幾種刪除二進制日誌的方法:
用RESET MASTER命令刪除所有日誌,新日誌重新從000001開始編號;
用purge master logs to ‘filename.**’命令可以刪除指定編號前的所有日誌;
用purge master logs to before ‘YYYY-MM-DD HH21:MI:SS’命令可以刪除‘YYYY-MM-DD HH24:MI:SS’之前的產生的所有日誌。

14.3.4 使用二進制日誌還原數據庫

在數據庫出現異常情況或者數據丟失時,可以使用二進制日誌恢復數據。通過show命令查看二進制日誌文件的路徑和文件名,然後通過mysqlbinlog工具從指定的時間點開始直到現在,或者一個指定的時間點的日誌中恢復數據。
mysqlbinlog恢復數據的語法如下:
mysqlbinlog [option] filename | mysql -uuser -ppass
其中,Option是可選項,其參數爲:–start-date(起始時間點)、–stop-date(結束時間點)、–start-position(開始位置)和–stop-position(結束位置);filename是日誌文件名。

  1. 指定恢復時間
    對於MySQL,可以在mysqlbinlog語句中通過 –start-date 和–stop-date選項指定DATETIME格式的起止時間。舉例說明,假設在今天上午10:00(今天是2005年4月20日),執行SQL語句來刪除一個大表。要想恢復表和數據,你可以恢復前晚上的備份,並輸入如下語句:
    mysqlbinlog –stop-date=“2005-04-20 9:59:59”/var/log/mysql/bin.123456 | mysql -u root -pmypwd
    其中,stop-date稍早於重大刪除時間。該命令將恢復截止到在–stop-date選項中以DATETIME格式給出的日期和時間的所有數據。這樣,系統會自動執行從二進制日誌有記錄開始截止到2015-04-20 9:59:59,用戶所做過的所有操作。與–stop-date對應的,還有–start-date屬性,可以設定執行記錄的開始時間。也可以兩個屬性都設置。
  2. 指定恢復位置
    也可以不指定日期和時間,而使用mysqlbinlog的選項–start-position和–stop-position來指定日誌位置。它們的作用與起止日期選項相同,不同的是給出了從日誌起的位置號。使用日誌位置是更準確的恢復方法,特別是當由於破壞性SQL語句同時發生許多事務的時候。要想確定位置號,可以運行mysqlbinlog尋找執行了不期望的事務的時間範圍,但應將結果重新指向文本文件以便進行檢查。操作方法如下:
    mysqlbinlog –start-date=“2005-04-20 9:55:00”–stop-date=“2005-04-20 10:05:00”\
    /var/log/mysql/bin.123456 > /tmp/mysql_restore.sql
    該命令將在/tmp目錄創建小的文本文件,將顯示執行了錯誤的SQL語句時的SQL語句。可以用文本編輯器打開該文件,尋找不要想重複的語句。如果二進制日誌中的位置號用於停止和繼續恢復操作,應進行註釋。用log_pos加一個數字來標記位置。使用位置信號恢復了以前的備份文件後,應在命令行輸入下面的內容。
    mysqlbinlog –stop-position=“368312” /var/log/mysql/bin.123456 | mysql -u root -pmypwd
    mysqlbinlog –start-position=“368315” /var/log/mysql/bin.123456 | mysql -u root -pmypwd
    上面第一行將恢復到停止位置爲止的所有事務。下一行將恢復從給定的起始位置直到二進制日誌結束的所有事務。因爲mysqlbinlog的輸出包括每個SQL語句記錄之前的SET TIMESTAMP語句,恢復的數據和相關MySQL日誌將反映事務執行的原時間。

14.4 操作慢查詢日誌

優化MySQL最重要的一部分工作就是先確定“有問題”的查詢語句。只有先找出這些查詢較慢的SQL查詢,纔可以進一步分析原因並且優化它。慢查詢日誌就記錄了執行時間超過了特定時長的查詢,即記錄所有執行時間超過最大SQL執行時間(long_query_time)或未使用索引的語句。

14.4.1 起動慢查詢日誌

默認狀態下,慢查詢日誌是關閉的。可以通過配置文件my.ini或者my.cnf來啓用。配製方法如下:
[mysqld]
slow_query_log=[filename]
slow_launch_time=n
其中,[filename]用來指定慢查詢日誌存放的位置,如沒有指定,默認爲hostname_slow.log作爲文件名,默認存放在DATADIR目錄中;slow_launch_time=n是設置時間的,如果某條查詢語句的查詢時間超過了這個值,則該查詢過程將被記錄到慢查詢日誌文件中。默認時間爲10s。同樣慢查詢日誌也可以通過命令行來設置,語句如下:
set global slow_query_log=on
set global slow_launch_time=1
通過show命令查看設置情況:
show variables like ‘slow_%’;

14.4.2 查看慢查詢日誌

根據上面對滿日誌的設置,可以看到在默認文件夾下生成了一個salonshi_PC_slow.log的慢日誌文件,該文件可以使用記事本打開。
該日誌記錄了慢查詢日誌發生的時間、連接用戶、IP、執行時間、鎖定時間、最終發送行數、總計掃描數、SQL語句等相關信息。
對於查詢時間大於所設置的Log_query_time時,可通過mysqldumpslow工具進行彙總、排序,以便找出耗時最高、請求次數最多的慢查詢日誌。
除了MySQL自帶的mysqldumpslow工具外,也有很多第三方優秀的慢日誌分析工具,如:mysqlsla、myprofi等。

14.4.3刪除慢查詢日誌

如果遇到慢查詢日誌文件過大,需要回收空間加以利用,或者其他原因需要刪除慢查詢日誌文件,可以直接進行刪除。也可以通過以下命令將慢日誌文件重置。
set global slow_query_log=0
刪除後需要重新生成一個新的慢日誌文件,可以通過以下命令生成。
set global slow_query_log=1
或者使用如下的windows命令。
C:>mysqladmin -uroot -p flush_logs
Enter password:*

14.5 高手點撥

logrotate程序是一個日誌文件管理工具。用來把舊的日誌文件的內容轉存到新的文件中,並清空或者是刪除舊的日誌文件。MySQL日誌可以利用logrotate工具進行管理。

發佈了50 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章