MySQL的日誌系統

MySQL的日誌系統

    MySQL的日誌是記錄和系統相關的一些操作信息,其有不同類型的日誌文件(各自存儲了不同類型的日誌),從它們當中可以查詢到MYSQL裏都做了些什麼,對於MYSQL的管理工作,這些日誌文件是不可缺少的,主要包括錯誤日誌、慢查詢日誌、二進制日誌和InnoDB的redo日誌等。

一、錯誤日誌(Error Log)

    錯誤日誌,顧名思義,當然就是記錄錯誤信息的日誌,不過MySQL的錯誤日誌文件,並不僅僅是記錄錯誤信息,MySQL服務進程啓動/關閉的信息也會被記錄進來,也不是說什麼錯誤都會記錄,只有服務進程運行過程中發生的關鍵(critical)錯誤會被記錄,另外mysqld進程發現某些表需要自動檢查或修復的話,也會拋出相關信息到該日誌文件。
在某些操作系統上運行的mysql崩潰時,會將堆棧的跟蹤信息(stack trace)拋出到錯誤日誌文件中,這些跟蹤信息比較有利於故障排查。
    啓用mysqld時附加--log-error參數(或配置log-error系統環境變量),指定錯誤日誌的路徑及文件名,如不指定的話,默認文件名爲[host_name].err,保存在mysql的data文件夾下。執行FLUSH LOGS命令後,mysql會將當前錯誤日誌文件附加-old保存,而且創建一個新的空錯誤日誌文件(僅限指定--log-error的情況下會自動創建新文件)。--log-warnings參數(或log-warnings系統環境變量)用來控制警告信息是否記錄,默認值爲1即啓用,指定爲0時表示禁用。如果指定該參數值大於1,則連接失敗的消息也會寫入錯誤日誌。
    使用mysqld_safe命令啓動mysqld,mysqld_safe會將錯誤消息寫到日誌文件或者系統日誌,在5.1.20版本之前,mysqld_safe的操作記錄到文件;從5.1.20版本開始,mysqld_safe提供了兩個新增錯誤日誌選項:--syslog和--skip-syslog。從5.1.21版本開始,默認的不記錄日誌選項爲--skip-syslog,該選項兼容5.1.20版本之前的錯誤日誌行爲。要明確指定輸出的錯誤日誌文件,就通過mysqld_safe啓動服務時附加--log-error[=file_name]參數,如果要使用syslog,則指定--syslog參數。 對於記錄到syslog的消息,來自mysqld_safe和mysqld的消息會分別打上"mysqld_safe"或"mysqld"的標籤,從5.1.21版本開始,還可以通過--syslog-tag=[tag]的方式指定標籤的名稱,修改後實際記錄的標籤形式會變成"mysql_safe-[tag]"和"mysqld-[tag]"。

    如果是使用mysqld_safe命令啓動mysqld進程,並且mysqld意外崩潰,則mysqld_safe將嘗試重新啓動mysqld進程,並且向錯誤日誌中記錄"restarted mysqld"信息。

查看錯誤日誌的位置:      

mysql> show variables like 'log_error';
+---------------+----------------------------+
| Variable_name | Value                      |
+---------------+----------------------------+
| log_error     | /var/lib/mysql/sl62-vm.err |
+---------------+----------------------------+
1 row in set (0.00 sec)
也可以在my.cnf配置文件中指定MySQL錯誤日誌的位置和文件名(在[mysqld]項下添加):

# errot log path
log_error=/var/lib/mysql/umt.err

此時再次查看錯誤日誌:

mysql> show variables like 'log_error';
+---------------+------------------------+
| Variable_name | Value                  |
+---------------+------------------------+
| log_error     | /var/lib/mysql/umt.err |
+---------------+------------------------+
1 row in set (0.00 sec)

二、慢查詢日誌(Slow Query Log)

    慢查詢日誌用來記錄所有執行時間超過參數long_query_time的SQL語句的日誌文件,獲得初始表鎖定的時間不算作執行時間。慢查詢日誌可以用來找到執行時間長的查詢,可以用於優化,通過命令 show variables like 'long_query_time';來查看參數long_query_time的值:

mysql> show variables like 'long_query_time';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)
其中,value = 10.000000代表一個查詢所使用的時間超過10秒時將在慢查詢日誌中被記錄下來。可以通過set命令將該值變成所需的時間:

mysql> set long_query_time = 1;
Query OK, 0 rows affected (0.00 sec)

再次查詢:
mysql> show variables like 'long_query_time';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 1.000000 |
+-----------------+----------+
1 row in set (0.00 sec)

使用選項--slow_query_log={ON|OFF}來停止或者啓動慢查詢日誌,系統默認是不啓動該日誌的,可以使用命令show variables like 'log_slow_queries';來查看慢查詢日誌是否啓動:

mysql> show variables like 'log_slow_queries';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| log_slow_queries | OFF   |
+------------------+-------+
1 row in set (0.00 sec)

開啓慢查詢日誌
mysql> set global log_slow_queries = ON;
Query OK, 0 rows affected, 1 warning (0.02 sec)
由於log_slow_queries是全局變量,所以要加上global關鍵字

再次查詢:
mysql> show variables like 'log_slow_queries';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| log_slow_queries | ON    |
+------------------+-------+
1 row in set (0.00 sec)

可以在my.cnf配置文件中使用選項--slow_query_log_file=file_name指定文件位置和文件名稱。

    語句執行完並且所有鎖釋放後記入慢查詢日誌。記錄順序可以與執行順序不相同。
    慢查詢日誌可以用來找到執行時間長的查詢語句,並對其進行優化,可以使用mysqldumpslow命令獲得日誌中顯示的查詢摘要來處理慢查詢日誌。
    慢查詢日誌中,不使用索引的慢查詢同使用索引的查詢一樣記錄。通過選項--log-queries-not-using-indexes,可以防止不使用索引的慢查詢記入慢查詢日誌。通過選項--log-slow-admin-statements,可以請求將慢管理語句,例如OPTIMIZE TABLE、ANALYZE TABLE和 ALTER TABLE寫入慢查詢日誌。通過選項--log-slow-slave-statements,可以將複製查詢的語句記入慢查詢日誌。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章