一般查詢日誌是 mysqld 正在執行的動作的一般記錄。當用戶端連線或中斷連線時,伺服器會將資訊寫入此日誌,並記錄從用戶端收到的每個 SQL 陳述式。當您懷疑用戶端中存在錯誤,並想確切知道用戶端傳送到 mysqld 的內容時,一般查詢日誌非常有用。
顯示用戶端連線的每一行還會包含 using
,以指示用於建立連線的協定。connection_type
connection_type
是 TCP/IP
(在未經 SSL 的情況下建立的 TCP/IP 連線)、SSL/TLS
(在經 SSL 的情況下建立的 TCP/IP 連線)、Socket
(Unix Socket 檔案連線)、Named Pipe
(Windows 具名管道連線)或 Shared Memory
(Windows 共享記憶體連線)之一。
mysqld 會按照接收陳述式的順序將它們寫入查詢日誌,這可能與它們執行的順序不同。此記錄順序與二進位日誌的順序相反,二進位日誌會在陳述式執行後但在任何鎖定釋放之前寫入陳述式。此外,查詢日誌可能包含只選取資料的陳述式,而此類陳述式永遠不會寫入二進位日誌。
在複寫來源伺服器上使用基於陳述式的二進位記錄時,其複本收到的陳述式會寫入每個複本的查詢日誌。如果用戶端使用 mysqlbinlog 公用程式讀取事件並將它們傳遞到伺服器,則陳述式會寫入來源的查詢日誌。
但是,當使用基於列的二進位記錄時,更新會以列變更而非 SQL 陳述式的形式傳送,因此,當 binlog_format
為 ROW
時,這些陳述式永遠不會寫入查詢日誌。當此變數設定為 MIXED
時,視所使用的陳述式而定,給定的更新也可能不會寫入查詢日誌。如需更多資訊,請參閱第 19.2.1.1 節,「基於陳述式和基於列的複寫的優點和缺點」。
預設情況下,一般查詢日誌是停用的。若要明確指定初始一般查詢日誌的狀態,請使用 --general_log[={0|1}]
。不帶參數或參數為 1 時,--general_log
會啟用日誌。參數為 0 時,此選項會停用日誌。若要指定日誌檔名,請使用 --general_log_file=
。若要指定日誌目的地,請使用 file_name
log_output
系統變數(如 第 7.4.1 節「選取一般查詢日誌和慢查詢日誌輸出目的地」所述)。
如果您指定 TABLE
日誌目的地,請參閱日誌表和「開啟太多檔案」錯誤。
如果未指定一般查詢日誌檔名,預設名稱為
。除非給定絕對路徑名稱以指定不同的目錄,否則伺服器會在資料目錄中建立該檔案。host_name
.log
若要在執行時停用或啟用一般查詢日誌,或變更日誌檔名,請使用全域 general_log
和 general_log_file
系統變數。將 general_log
設定為 0 (或 OFF
) 以停用日誌,或設定為 1 (或 ON
) 以啟用日誌。設定 general_log_file
以指定日誌檔名。如果日誌檔已開啟,則會關閉該檔案並開啟新檔案。
啟用一般查詢日誌後,伺服器會將輸出寫入 log_output
系統變數指定的任何目的地。如果啟用日誌,伺服器會開啟日誌檔案並將啟動訊息寫入其中。但是,除非選取 FILE
日誌目的地,否則不會將進一步的查詢記錄到檔案中。如果目的地為 NONE
,即使啟用了一般日誌,伺服器也不會寫入任何查詢。如果日誌目的地值不包含 FILE
,設定日誌檔名對記錄沒有影響。
伺服器重新啟動和日誌刷新不會導致產生新的通用查詢日誌檔案(儘管刷新會關閉並重新開啟它)。若要重新命名檔案並建立新檔案,請使用下列命令
$> mv host_name.log host_name-old.log
$> mysqladmin flush-logs general
$> mv host_name-old.log backup-directory
在 Windows 上,請使用 rename 而不是 mv。
您也可以在執行時透過停用日誌來重新命名一般查詢日誌檔案
SET GLOBAL general_log = 'OFF';
停用日誌後,從外部重新命名日誌檔案(例如,從命令列)。然後再次啟用日誌
SET GLOBAL general_log = 'ON';
此方法適用於任何平台,且不需要重新啟動伺服器。
若要針對目前的工作階段停用或啟用一般查詢日誌,請將工作階段 sql_log_off
變數設定為 ON
或 OFF
。(這假設一般查詢日誌本身已啟用。)
寫入一般查詢日誌的陳述式中的密碼會由伺服器重寫,使其不會以純文字形式逐字出現。可以透過使用 --log-raw
選項啟動伺服器來取消對一般查詢日誌的密碼重寫。此選項可能對於診斷目的很有用,可以查看伺服器接收到的陳述式的確切文字,但基於安全原因,不建議用於生產環境。另請參閱第 8.1.2.3 節「密碼和記錄」。
密碼重寫的含義是,無法解析的陳述式(例如,由於語法錯誤)不會寫入一般查詢日誌,因為無法確定它們是否不含密碼。需要記錄所有陳述式(包括包含錯誤的陳述式)的使用案例應使用 --log-raw
選項,請注意,這也會繞過密碼重寫。
只有在預期使用純文字密碼時才會發生密碼重寫。對於具有預期使用密碼雜湊值的語法的陳述式,不會發生重寫。如果錯誤地為此類語法提供了純文字密碼,則密碼會按原樣記錄,而不會進行重寫。
log_timestamps
系統變數控制寫入一般查詢日誌檔案(以及慢查詢日誌檔案和錯誤日誌)的訊息中時間戳記的時區。它不會影響寫入日誌表的一般查詢日誌和慢查詢日誌訊息的時區,但可以透過使用 CONVERT_TZ()
或設定工作階段 time_zone
系統變數,將從這些表格中擷取的列從本機系統時區轉換為任何所需的時區。