MySQL 通用查詢日誌

eric0435發表於2022-03-17

通用查詢日誌是mysqld所生成的記錄。當客戶端連線或斷開時和從客戶端接收到每個SQL語句時伺服器會寫資訊到通用查詢日誌。當懷疑客戶端有錯誤並且想了解客戶端傳送給mysqld的資訊時通用查詢日誌非常有用。

當一個客戶端連線時顯示的每一行也包括using connection_type來指示建立連線的協議。connection_type是TCP/IP(不使用SSL的TCP/IP連線),SSL/TLS(使用SSL的TCP/IP連線),Socket(Unix socket file連線),Named Pipe(Windows命名管道連線),或Shared Memory(Windows共享記憶體連線)。

mysqld以它所接收到的語句順序將它們寫入通用查詢日誌,這可能不同於語句被執行的順序。這個日誌順序與二進位制日誌順序相反,語句會在執行之後但在任何鎖被釋放之前被寫入通用查詢日誌。另外查詢日誌可能包含那些只查詢資料但從沒被寫入二進位制日誌的語句。

當在一個複製主伺服器上使用基於語句的二進位制日誌時,透過從伺服器所接收到的語句會被寫入每個從伺服器的查詢日誌中。如果客戶端使用mysqlbinlog工具讀取事件並將它們傳遞給伺服器,那麼語句會被寫入主伺服器的查詢日誌中。

然而當使用基於行記錄的二進位制日誌時,更新會被當作行改變被髮送而不是SQL語句,並且當binlog_format為ROW時這些語句從來不會被寫入查詢日誌。當這個變數設定為MIXED時依賴於語句的使用,指定的更新也可能不會被寫入查詢日誌。

預設情況下,通用查詢日誌是被禁用的。為了顯式指定初始化通用查詢日誌狀態,使用--general_log[={0|1}]。沒有引數或者引數為1,--general_log啟用日誌。當這個引數為0,這個選項將禁用日誌。為了指定一個日誌檔名,使用--general_log_file=file_name。為了指定日誌目錄,使用--log-output。

如果對通用查詢日誌檔案沒有指定檔名,預設名字為host_name.log。除非指定一個絕對路徑來指定不同的目錄否則伺服器將在資料目錄中建立日誌檔名。

為了在執行時禁用或啟用通用查詢日誌或改變日誌檔名,使用全域性general_log和general_log_file系統變數。設定general_log為0(或OFF)來禁用日誌或1(或ON)來啟用日誌。設定general_log_file指定日誌檔名。如果一個日誌檔案已經被opne,將會關閉它並開啟新檔案。

當通用查詢日誌被啟用時,伺服器將輸出寫入到由--log-output選項或log_output系統變數所指定的任何目錄。如果啟用日誌,伺服器將開啟日誌檔案並將啟動資訊寫入日誌檔案。然而除非FILE日誌目錄被選定否則更多的查詢日誌不會寫入日誌檔案。如果日誌目錄為NONE,即使通用查詢日誌被啟用伺服器也不會將查詢寫入日誌檔案。如果日誌目錄值不包括FILE,設定日誌檔名不會影響日誌記錄。

伺服器重啟和日誌重新整理不會導致生成新的通用查詢日誌檔案(雖然重新整理會關閉和重新開啟日誌檔案)。為了重新命名檔案並建立新檔案,使用以下命令:

shell> mv host_name.log host_name-old.log
shell> mysqladmin flush-logs
shell> 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選項。這個選項對於診斷來說非常有用,為了檢視伺服器所接收到的精確語句文字,但由於安全原因不建議在生產環境中使用。

密碼重寫的一個含義是,不能被解析的語句(例如,由於語法錯誤)不會被寫入通用查詢日誌,因為它們不能被認為是沒有密碼的。需要記錄所有語句(包括有錯誤的語句)的用例應該使用——log-raw選項,記住這也可以繞過密碼重寫。

只有在預期使用純文字密碼時才會發生密碼重寫。對於具有期望密碼雜湊值的語法的語句,不發生重寫。如果為這種語法錯誤地提供了純文字密碼,則按給定的方式記錄密碼,而不進行重寫。例如,如下所示記錄下的語句,因為需要密碼雜湊值

CREATE USER 'user1'@'localhost' IDENTIFIED BY PASSWORD 'not-so-secret';

log_timestamps系統變數控制首寫入通用查詢日誌中資訊的時區(對慢查詢日誌檔案和錯誤日誌也一樣)。它不會影響寫入日誌表中的通用查詢日誌和慢查詢日誌資訊的時區,但從這些表中檢索行記錄使用convert_tz()或設定會話變數time_zone系統變數可以將本地系統時區轉換為任何你所期待的時區。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26015009/viewspace-2871749/,如需轉載,請註明出處,否則將追究法律責任。

相關文章