MySQL 8.0 リファレンスマニュアル


4.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 は行を連結して完全なステートメントを形成し、改行をスペースに対応付け、結果に区切り文字を付け加えてログに記録します。

その結果、複数行にまたがる入力ステートメントが 2 回ログに記録されることがあります。 次の入力について考えます。

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*" で、パスワードを参照するステートメントを無視します。 パターン一致では、大/小文字は区別されません。 パターン内では、特殊文字が 2 つあります。

  • ? は任意の 1 文字に一致します。

  • * はゼロ個以上の文字の任意のシーケンスに一致します。

追加のパターンを指定するには、--histignore オプションを使用するか、または MYSQL_HISTIGNORE 環境変数を設定します。 (両方を指定した場合はオプション値が優先されます。) この値は、コロンで区切られた 1 つ以上のパターンのリストである必要があり、デフォルトのパターンリストに追加されます。

コマンド行で指定されたパターンは。コマンドインタプリタで特殊な扱いを受けることを防ぐために、引用符で囲むかエスケープ処理を行う必要がある場合があります。 たとえば、パスワードを参照するステートメントに加えて UPDATE ステートメントおよび DELETE ステートメントのロギングを抑制するには、mysql を次のように呼び出します。

shell> mysql --histignore="*UPDATE*:*DELETE*"
履歴ファイルの制御

.mysql_history ファイルには、パスワードを含む SQL ステートメントのテキストなどの機密情報が書き込まれる場合があるため、制限付きアクセスモードで保護するようにしてください。 セクション6.1.2.1「パスワードセキュリティーのためのエンドユーザーガイドライン」を参照してください。 up-arrow キーを使用して履歴をリコールすると、ファイル内のステートメントに mysql クライアントからアクセスできます。 インタラクティブ履歴の無効化を参照してください。

履歴ファイルを維持しない場合は、.mysql_history が存在すればまずそれを削除します。 次の手法のいずれかを使用してふたたび作成されないようにします。

  • MYSQL_HISTFILE 環境変数を /dev/null に設定します。 ログインするたびにこの設定が有効になるようにするには、これをシェルの起動ファイルに置きます。

  • .mysql_history/dev/null へのシンボリックリンクとして作成します。これは一度のみの実行で済みます。

    shell> ln -s /dev/null $HOME/.mysql_history
syslog ロギング特性

--syslog オプションが指定されている場合、mysql は対話型のステートメントをシステムロギング機能に書き込みます。 メッセージロギングには、次の特性があります。

ロギングは information レベルで行われます。 これは、Unix/Linux syslog 機能の syslog および Windows イベントログの EVENTLOG_INFORMATION_TYPELOG_INFO 優先度に対応します。 ロギング機能の構成については、システムのドキュメントを参照してください。

メッセージサイズは 1024 バイトに制限されています。

メッセージは、MysqlClient という識別子の後に次の値が続くもので構成されます:

  • SYSTEM_USER

    オペレーティングシステムのユーザー名 (ログイン名)。ユーザーが不明な場合は --

  • MYSQL_USER

    MySQL ユーザー名 (--user オプションで指定) または -- (ユーザーが不明な場合)。

  • CONNECTION_ID:

    クライアント接続識別子。 これは、セッション内の CONNECTION_ID() 関数の値と同じです。

  • DB_SERVER

    サーバーホスト、またはホストが不明な場合は --

  • DB

    デフォルトのデータベース、またはデータベースが選択されていない場合は --

  • QUERY

    ログに記録されたステートメントのテキスト。

次に、--syslog を使用して Linux で生成される出力のサンプルを示します。 この出力は読みやすくするためにフォーマットされており、ログに記録される各メッセージは実際には単一行を取ります。

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;'

関連キーワード:  ステートメント, ロギング, プログラム, サーバー, ログ, 記録, パターン, テーブル, 表示, コマンド