MySQL有幾個不同的日志文件,可以幫助你找出mysqld內部發生的事情:
日志文件 記入文件中的信息類型 錯誤日志 記錄啟動、運行或停止時出現的問題。 查詢日志 記錄建立的客戶端連接和執行的語句。 二進制日志 記錄所有更改數據的語句。主要用於復制和即時點恢復。 慢日志 記錄所有執行時間超過long_query_time秒的所有查詢或不使用索引的查詢。 事務日志 記錄InnoDB等支持事務的存儲引擎執行事務時產生的日志。
默認情況下,所有日志創建於mysqld數據目錄中。通過刷新日志,你可以強制 mysqld來關閉和重新打開日志文件(或者在某些情況下切換到一個新的日志)。當你執行一個FLUSH LOGS語句或執行mysqladmin flush-logs或mysqladmin refresh時,出現日志刷新。如果你正使用MySQL復制功能,從復制服務器將維護更多日志文件,被稱為接替日志。
可以用--log-error[=file_name]選項來指定mysqld保存錯誤日志文件的位置。如果沒有給定file_name值,mysqld使用錯誤日志名host_name.err 並在數據目錄中寫入日志文件。如果你執行FLUSH LOGS,錯誤日志用-old重新命名後綴並且mysqld創建一個新的空日志文件。(如果未給出--log-error選項,則不會重新命名)。
查看當前錯誤日志配置:
mysql> SHOW GLOBAL VARIABLES LIKE '%log_error%';
+---------------+---------------------------------------+
| Variable_name | Value |
+---------------+---------------------------------------+
| log_error | /data/mysql/localhost.localdomain.err |
+---------------+---------------------------------------+
1 row in set (0.45 sec)
是否記錄警告日志:
mysql> SHOW GLOBAL VARIABLES LIKE '%log_warnings%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_warnings | 1 |
+---------------+-------+
1 row in set (0.00 sec)
因此,要啟用通用查詢日志,需要至少配置general_log=ON,log_output={TABLE|FILE}。而general_log_file如果沒有指定,默認名是host_name.log。
看看上述幾個值的默認配置:
mysql> SHOW GLOBAL VARIABLES LIKE '%general_log%';
+------------------+---------------------------+
| Variable_name | Value |
+------------------+---------------------------+
| general_log | OFF |
| general_log_file | /data/mysql/localhost.log |
+------------------+---------------------------+mysql> SHOW GLOBAL VARIABLES LIKE '%log_output%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output | FILE |
+---------------+-------+
MySQL如果啟用了slow_query_log=ON選項,就會記錄執行時間超過long_query_time的查詢(初使表鎖定的時間不算作執行時間)。日志記錄文件為slow_query_log_file[=file_name],如果沒有給出file_name值, 默認為主機名,後綴為-slow.log。如果給出了文件名,但不是絕對路徑名,文件則寫入數據目錄。
默認與慢查詢相關變量:
mysql> SHOW GLOBAL VARIABLES LIKE '%slow_query_log%';
+----------------------------+--------------------------------+
| Variable_name | Value |
+----------------------------+--------------------------------+
| slow_query_log | OFF |
| slow_query_log_file | /data/mysql/localhost-slow.log |
+----------------------------+--------------------------------+
服務器參數設定方法與通用查詢日志相同,不做解釋。
默認沒有啟用慢查詢,為了服務器調優,建議開啟。
mysql> SET GLOBAL slow_query_log=ON;
Query OK, 0 rows affected (1.45 sec)##如果要長久生效,則需要在配置文件中定義。
那麼多久算是慢呢?
如果查詢時長超過long_query_time的定義值(默認10秒),即為慢查詢:
mysql> SHOW GLOBAL VARIABLES LIKE 'long_query_time';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
在5.6及以上版本一定要手動指定。5.6以下版本默認file_name為$datadir/mysqld-binlog
二進制日志用於記錄所有更改數據的語句。主要用於復制和即時點恢復。
查看二進制日志的工具為:mysqlbinlog
二進制日志包含了所有更新了數據或者已經潛在更新了數據(例如,沒有匹配任何行的一個DELETE)的所有語句。語句以“事件”的形式保存,它描述數據更改。二進制日志還包含關於每個更新數據庫的語句的執行時間信息。它不包含沒有修改任何數據的語句。
二進制日志的主要目的是在數據庫存在故障時,恢復時能夠最大可能地更新數據庫(即時點恢復),因為二進制日志包含備份後進行的所有更新。二進制日志還用於在主復制服務器上記錄所有將發送給從服務器的語句。
第一種情況:
加入一個表有10萬行數據,而現在要執行一個如下語句將amount字段的值全部在原來的基礎上增加1000:
UPDATE sales.january SET amount=amount+1000;
此時如果要記錄執行後的結果數據的話,日志會非常大。
因此在這種情況下應記錄執行語句。這種方式就是基於語句的二進制日志。
第二種情況:
如果向某個字段插入的是當前的時間呢?如下:
INSERT INTO tb SET Birthdate=CURRENT_TIME();
此時就不能記錄語句了,因為不同時間執行的結果是不一樣的。這是應該記錄這一行的值,這種就是基於行(row)的二進制日志。
在有些情況,可能會結合兩種方式來記錄,這種叫做混合方式的二進制日志。