Selecting General Query Log and Slow Query Log Output Destinations

爲一般查詢日誌和慢查詢日誌輸出指定輸出路徑

翻譯文檔鏈接:https://dev.mysql.com/doc/refman/5.6/en/log-destinations.html

如果一般查詢日誌和慢查詢日誌有啓用的話,MySQL服務端對這些日誌的輸出保存位置做了靈活的控制。日誌可以保存在文件中或者mysql這個系統數據庫的general_log和slow_log表中,而且兩者可以共同選擇。

在服務端啓動時候做日誌控制

log_output 這個系統變量可以指定日誌輸出的目標位置。設置該變量本身不會啓用日誌;它們必須要分開設置啓用(log_ouput只是控制日誌設置存儲地方,是否啓用查詢日誌和慢查詢日誌,還要取決於其他的變量的設置)。

  • 如果log_output 在啓動的時候默認不指定,默認記錄是FILE(文件中)。
  • 如果log_output 在啓動的時候指定了,它的值可以是一個或者多個(多個之間使用逗號隔開),值可以是TABLE(表示把日誌記錄在系統表中),FILE(表示把日誌記錄在文件中),NONE(不記錄日誌到表或者文件中)。如果多個值中包含了NONE,不管它出現的前後位置,其優先級要高於FILE和TABLE,即不會把日誌記錄到文件或者表中,就是不記錄。

general_log系統變量控制是否啓用一般查詢日誌(控制記錄一般查詢日誌到指定的目標路徑)。如果在服務端啓動的時候,general_log可以選擇設置爲1或者0表示啓用或者不啓用一般查詢日誌。如果想要自定義記錄到的日誌文件名,可以使用general_log_file變量。

同理地,slow_query_log變量控制是否啓用慢查詢日誌。slow_query_log_file用於指定慢查詢日誌文件的文件名。如果服務端啓動了一般查詢日誌和慢查詢日誌中的其中任何一個,服務端會打開相應的日誌文件,並且會把啓動消息記錄到日誌中。然而,除非選擇了記錄日誌的文件,否則不會進一步記錄內容到日誌文件中。

例如:

  • 把一般查詢日誌記錄到日誌表和日誌文件中,使用命令行選擇 --log_output=TABLE,FILE指定日誌記錄到的位置,–general_log來啓動一般查詢日誌的記錄功能。
  • 只把一般查詢日誌和慢查詢日誌記錄到日誌表中,使用 --log_output=TABLE來選擇記錄的目標位置, --general_log和 --slow_query_log來啓用一般查詢日誌和慢查詢日誌。
  • 只把慢查詢日誌記錄到日誌文件中,使用 --log_output=FILE來選定日誌記錄目標位置,使用 --slow_query_log來啓用慢查詢日誌記錄。這種情況中,因爲log_output默認設置爲FILE,可以不用顯式指明–log_output=FILE

在運行時做日誌控制

在運行時控制日誌記錄日誌和日誌文件相關的系統變量有:

  • log_output變量用於定義記錄的目標位置或者方式。這個變量可以在運行時修改;
  • general_log和slow_query_log變量表明是否啓動或者關閉查詢日誌和慢查詢日誌。可以在運行時候修改,ON表示啓用,OFF表示不啓用;
  • general_log_file和slow_query_log_file變量表明一般查詢日誌和慢查詢日誌的定義位置。可以在服務端啓動時候設置這些變量或者在運行時修改。
  • 在當前會話級別禁止或啓用一般查詢日誌的記錄,可以通過設置會話級別的sql_log_off這個變量,ON表示啓用,OFF表示關閉。(默認假設一般查詢日誌是啓動的)。

使用系統表記錄日誌的好處和特點

把日誌記錄到表中有以下好處:

  • 記錄的內容有標準格式。查看當前日誌表結構,可以使用以下語句:

    SHOW CREATE TABLE mysql.general_log;
    SHOW CREATE TABLE mysql.slow_log;
    
  • 日誌內容可以通過SQL語句來訪問。這樣可以指定的查詢具體的字段或者查詢的日誌記錄數。

  • 不需要登錄到服務器主機去直接訪問文件系統,遠程客戶端只要對日誌表擁有合適的權限,就可以直接通過發起查詢來查看日誌。

使用日誌表有以下特點:

  • 一般而言,使用日誌表來記錄日誌的主要目的是提供給用戶一個可以觀察服務端運行時候的一個查看接口,並不會影響服務端的運行。

  • CREATE TABLE,ALTER TABLE 以及 DROP TABLE都可以對日誌表進行操作。對於ALTER TABLE 和 DROP TABLE操作日誌表,日誌表將會不能使用,我們必須要關閉它,後文將會描述。

  • 默認,日誌表使用CSV存儲引擎來記錄逗號分隔的值格式的數據。如果用戶能夠訪問.CSV文件,他就可以訪問日誌表包含的數據內容,這個CSV格式的文件也很容易被導入到其他諸如電子表格(例如excel)這樣的能處理CSV格式的程序。

    日誌表可以被修改成MyISAM存儲引擎。而且日誌表在使用過程中,不能使用ALTER TABLE來修改。日誌必須首先被禁止。沒有比CSV或MyISAM存儲引擎更適合做日誌表的存儲引擎了。(CSV是因爲格式比較方便,MyISAM是因爲日誌表讀多寫少,這個也視具體情況而言,默認應該是符合這種基準)

  • 爲了能夠修改(或者刪除)日誌表,你可以使用以下策略來先關閉日誌的記錄。案例中是以一般查詢日誌表設置爲說明,對於慢查詢日誌原理一樣,無非是使用slow_log表和slow_query_log系統變量。

    SET @old_log_state = @@GLOBAL.general_log;
    SET GLOBAL general_log = 'OFF';
    ALTER TABLE mysql.general_log ENGINE = MyISAM;
    SET GLOBAL general_log = @old_log_state;
    
    #思想是先使用一個變量來存儲全局變量的值,然後使用SET語句修改關閉,然後調整之後,然後修改回來。
    
    • TRUNCATE TABLE對日誌表是有效的操作。這樣可以清除過期的日誌內容.

    • RENAME TABLE對日誌表是有效的操作。可以使用以下策略來自動重命名日誌表(例如,去執行日誌的輪詢)

      USE mysql;
      DROP TABLE IF EXISTS general_log2;
      CREATE TABLE general_log2 LIKE general_log;
      RENAME TABLE general_log TO general_log_backup, general_log2 TO general_log;
      
    • CHECK TABLE對日誌表是有效的操作。

    • LOCK TABLES 不能用於日誌表。

    • INSERT, DELETE 以及 UPDATE不能用於日誌表。這些操作只在MySQL服務端內部允許的。

    • FLUSH TABLES WITH READ LOCK 以及 read_only系統變量的狀態對日誌表的記錄沒有影響。MySQL服務端總是能寫日誌表。

    • 寫入日誌表的內容不會寫入到二進制日誌中,因此,這部分操作並不會同步到從服務器。

    • 刷新日誌表或日誌文件,分別使用FLUSH TABLES或FLUSH LOGS。

    • 日誌表上不允許建分區。

    • 使用mysqldump導出的時候,日誌表的內容並不會導出。日誌表的表結構語句會被導出。

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