一般查詢日誌是 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
系統變數,可以將從這些資料表擷取的列從本機系統時區轉換為任何所需的時區。