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_TYPE
の LOG_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;'