文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  mysql 客戶端日誌記錄

6.5.1.3 mysql 客戶端日誌記錄

mysql 客戶端可以針對以互動方式執行的陳述式執行這些類型的日誌記錄

  • 在 Unix 上,mysql 會將陳述式寫入歷程記錄檔。依預設,此檔案在您的主目錄中名為 .mysql_history。若要指定不同的檔案,請設定 MYSQL_HISTFILE 環境變數的值。

  • 在所有平台上,如果給定 --syslog 選項,mysql 會將陳述式寫入系統日誌記錄設備。在 Unix 上,這是 syslog;在 Windows 上,則是 Windows 事件記錄檔。日誌訊息出現的目的地取決於系統。在 Linux 上,目的地通常是 /var/log/messages 檔案。

以下討論說明適用於所有日誌記錄類型的特性,並提供有關每個日誌記錄類型的特定資訊。

日誌記錄的發生方式

對於每個已啟用的日誌記錄目的地,陳述式日誌記錄會以下列方式發生

  • 只有在以互動方式執行時,才會記錄陳述式。陳述式是非互動式的,例如,從檔案或管道讀取時。也可以使用 --batch--execute 選項來抑制陳述式日誌記錄。

  • 如果陳述式符合 ignore 清單中的任何模式,則會忽略且不記錄。此清單將在稍後說明。

  • mysql 會個別記錄每個非忽略的非空白陳述式行。

  • 如果非忽略的陳述式跨越多行(不包括終止分隔符號),mysql 會串連這些行以形成完整的陳述式、將換行符號對應至空格,並記錄結果,再加上分隔符號。

因此,跨越多行的輸入陳述式可能會被記錄兩次。請考慮這個輸入

mysql> SELECT
    -> 'Today is'
    -> ,
    -> CURDATE()
    -> ;

在此情況下,mysql 會在其讀取時記錄 SELECT'Today is',CURDATE(); 行。它也會在將 SELECT\n'Today is'\n,\nCURDATE() 對應至 SELECT 'Today is' , CURDATE() 後,記錄完整陳述式,再加上分隔符號。因此,這些行會出現在記錄的輸出中

SELECT
'Today is'
,
CURDATE()
;
SELECT 'Today is' , CURDATE();

為了記錄目的,mysql 會忽略符合 ignore 清單中任何模式的陳述式。依預設,模式清單為 "*IDENTIFIED*:*PASSWORD*",以忽略參考密碼的陳述式。模式比對不區分大小寫。在模式中,有兩個字元是特殊的

  • ? 符合任何單一字元。

  • * 符合零個或多個字元的任何序列。

若要指定其他模式,請使用 --histignore 選項或設定 MYSQL_HISTIGNORE 環境變數。(如果同時指定兩者,則選項值優先。)該值應為一或多個以冒號分隔的模式清單,這些模式會附加到預設模式清單中。

在命令列上指定的模式可能需要加上引號或逸脫,以防止您的命令直譯器以特殊方式處理它們。例如,除了參考密碼的陳述式外,若要抑制記錄 UPDATEDELETE 陳述式,請像這樣呼叫 mysql

mysql --histignore="*UPDATE*:*DELETE*"
控制歷程記錄檔

由於敏感資訊可能會被寫入 .mysql_history 檔案,例如包含密碼的 SQL 語句文字,因此應使用限制性的存取模式來保護該檔案。請參閱第 8.1.2.1 節「終端使用者密碼安全準則」。當使用上箭頭鍵來回溯歷史紀錄時,可以從 mysql 用戶端存取檔案中的語句。請參閱停用互動歷史紀錄

如果您不想維護歷史紀錄檔,請先移除 .mysql_history(如果存在)。然後使用以下任一方法來防止再次建立該檔案。

  • MYSQL_HISTFILE 環境變數設定為 /dev/null。若要使此設定在每次登入時生效,請將其放在您的 shell 的啟動檔案中。

  • .mysql_history 建立為指向 /dev/null 的符號連結;這只需要執行一次即可。

    ln -s /dev/null $HOME/.mysql_history
syslog 記錄特性

如果給定了 --syslog 選項,mysql 會將互動式語句寫入系統記錄設施。訊息記錄具有以下特性。

記錄發生在資訊層級。這對應於 Unix/Linux 上 syslog 功能的 LOG_INFO 優先權,以及 Windows 事件記錄檔的 EVENTLOG_INFORMATION_TYPE。請查閱您的系統文件以了解如何設定您的記錄功能。

訊息大小限制為 1024 個位元組。

訊息由識別符 MysqlClient 以及以下值組成:

  • SYSTEM_USER

    作業系統使用者名稱(登入名稱),如果使用者未知則為 --

  • MYSQL_USER

    MySQL 使用者名稱(使用 --user 選項指定),如果使用者未知則為 --

  • CONNECTION_ID:

    用戶端連線識別符。這與會話中的 CONNECTION_ID() 函數值相同。

  • DB_SERVER

    伺服器主機,如果主機未知則為 --

  • DB

    預設資料庫,如果尚未選取資料庫則為 --

  • QUERY

    記錄的語句文字。

以下是在 Linux 上使用 --syslog 產生的範例輸出。此輸出已格式化以便於閱讀;每個記錄的訊息實際上佔用一行。

Mar  7 12:39:25 myhost MysqlClient[20824]:
  SYSTEM_USER:'oscar', MYSQL_USER:'my_oscar', CONNECTION_ID:23,
  DB_SERVER:'127.0.0.1', DB:'--', QUERY:'USE test;'
Mar  7 12:39:28 myhost MysqlClient[20824]:
  SYSTEM_USER:'oscar', MYSQL_USER:'my_oscar', CONNECTION_ID:23,
  DB_SERVER:'127.0.0.1', DB:'test', QUERY:'SHOW TABLES;'