Unix では、mysql クライアントはインタラクティブに実行されたステートメントを履歴ファイルにログ記録します。デフォルトでは、このファイルは .mysql_history
という名前で、ユーザーのホームディレクトリにあります。別のファイルを指定する場合は、MYSQL_HISTFILE
環境変数値を設定します。
ロギングの方法
ステートメントのロギングは次のように行われます。
ステートメントは、インタラクティブに実行された場合のみログに記録されます。ステートメントは、たとえばファイルまたはパイプから読み取られる場合はインタラクティブではありません。
--batch
オプションまたは--execute
オプションを使用することによって、ステートメントのロギングを抑制することもできます。ステートメントは、「ignore」 リスト内のパターンのいずれかに一致する場合には無視され、ログに記録されません。このリストについてはあとで説明します。
mysql は、無視されず空でない各ステートメント行を個別にログに記録します。
無視されないステートメントが複数の行にまたがる場合 (終端区切り文字を含まない)、mysql は行を連結して完全なステートメントを形成し、改行をスペースに対応付け、結果に区切り文字を付け加えてログに記録します。
その結果、複数行にまたがる入力ステートメントが 2 回ログに記録されることがあります。次の入力について考えます。
mysql> SELECT
-> 'Today is'
-> ,
-> CONCAT()
-> ;
この場合、mysql は 「SELECT」、「'Today is'」、「,」、「CONCAT()」、および 「;」 の各行を読み取りながらログに記録します。また、SELECT\n'Today is'\n,\nCURDATE()
を SELECT 'Today is' , CURDATE()
に対応付けたあと、区切り文字を追加した完全なステートメントもログに記録します。したがって、ログに記録される出力には次の行があります。
SELECT
'Today is'
,
CURDATE()
;
SELECT 'Today is' , CURDATE();
MySQL 5.6.8 では、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「パスワードセキュリティーのためのエンドユーザーガイドライン」を参照してください。
履歴ファイルを維持しない場合は、.mysql_history
が存在すればまずそれを削除します。次の手法のいずれかを使用してふたたび作成されないようにします。
MYSQL_HISTFILE
環境変数を/dev/null
に設定します。ログインするたびにこの設定が有効になるようにするには、これをシェルの起動ファイルに置きます。-
.mysql_history
を/dev/null
へのシンボリックリンクとして作成します。これは一度のみの実行で済みます。shell> ln -s /dev/null $HOME/.mysql_history