全力で怠けたい

怠けるために全力を尽くしたいブログ。

mysql コマンドのステートメント履歴の削除とか履歴を保存しない設定のメモ。

mysql コマンドは実行する SELECT とか UPDATE ステートメントを記録するので、カーソルキーの上下でステートメント履歴をたどることができる。 ステートメント履歴は便利なんだけどパスワードとかの機密情報は記録したくないとか、過去に実行した UPDATE とか DELETE の履歴は削除したいとかそもそも履歴に残したくないときがあるので、mysql コマンドのステートメント履歴の削除方法とかをメモしておく。

mysql コマンドのステートメント履歴

すべてのステートメント履歴の削除

mysql コマンドは実行したステートメントを履歴ファイルに記録する。

デフォルトでは .mysql_history というファイル名でユーザーのホームディレクトリに記録しているので、.mysql_history を消すとすべてのステートメント履歴を削除できる。

$ rm ~/.mysql_history

個別のステートメント履歴の削除

個別のステートメントの履歴だけ削除するときは .mysql_history の中身を編集する。 エディターで .mysql_history を開いて編集してから保存してもいいし、sed コマンドとかで編集してもいい。

ステートメントの履歴ファイルの指定

mysql コマンドは実行したステートメントをデフォルトでは .mysql_history というファイル名でユーザーのホームディレクトリに記録するけど、履歴ファイルの保存場所は MYSQL_HISTFILE 環境変数で指定できる。 たとえば履歴ファイルをホームディレクトリの .mymysql_history というファイルに保存するなら .bashrc とかに MYSQL_HISTFILE=~/.mymysql_history と追加しておく。

ステートメント履歴を記録しない方法: --batch オプション, --execute オプション

mysql コマンドは対話的に実行しているときだけステートメントを履歴ファイルに保存するので、ステートメントをファイルとかパイプから mysql コマンドに流し込むときはステートメントは履歴ファイルに保存しない。

たとえば以下の select * from sample_table ステートメントは履歴ファイルには保存しない。

$ echo 'select * from sample_table' | mysql -h127.0.0.1 -uroot -proot -P3306

mysql コマンドを実行するときに --batch オプション か --execute オプションを指定することでもステートメントを履歴ファイルに保存するのを抑制できる。

たとえば以下の show databases ステートメントexit ステートメントは履歴ファイルに保存しない。

$  mysql -h127.0.0.1 -uroot -proot -P3306 --batch
show databases;
Database
information_schema
mysql
performance_schema
exit

以下の show databases ステートメントは履歴ファイルに保存しない。

$ mysql -h127.0.0.1 -uroot -proot -P3306 --execute='show databases'
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+

任意のステートメントを履歴ファイルに保存しない方法

ステートメントの履歴は保存したいけどパスワードとかの機密情報は保存したくないとか、 SELECT は保存したいけど INSERT, UPDATEDELETE は保存したくないときがあると思う。 任意のステートメントを履歴ファイルに保存したくないときは MYSQL_HISTIGNORE 環境変数--histignore オプションを指定すると履歴ファイルへの保存を抑制できる。

たとえば '*INSERT*'MYSQL_HISTIGNORE 環境変数を指定しておくと以下の use sample_db, select * from sample_tableexit ステートメントは履歴ファイルに保存するけど insert into sample_table values (2) ステートメントは履歴ファイルに保存しない。

$ MYSQL_HISTIGNORE='*INSERT*' mysql -h127.0.0.1 -uroot -proot -P3306

mysql> use sample_db;
mysql> select * from sample_table;
+------+
| id   |
+------+
|    1 |
+------+
1 rows in set (0.00 sec)

mysql> insert into sample_table values (2);
Query OK, 1 row affected (0.01 sec)

mysql> exit
Bye

--histignore オプションでも同じことができる。

たとえば *INSERT*--histignore= オプションに指定すると以下の use sample_db, select * from sample_tableexit ステートメントは履歴ファイルに保存するけど insert into sample_table values (3) ステートメントは履歴ファイルに保存しない。

$ mysql -h127.0.0.1 -uroot -proot -P3306 --histignore='*INSERT*'

mysql> use sample_db;
mysql> select * from sample_table;
+------+
| id   |
+------+
|    1 |
+------+
1 rows in set (0.00 sec)

mysql> insert into sample_table values (3);
Query OK, 1 row affected (0.01 sec)

mysql> exit
Bye

ちなみに mysql コマンドはデフォルトでは *IDENTIFIED*:*PASSWORD* を無視するのでパスワードとかが履歴ファイルに保存されることはない。 MYSQL_HISTIGNORE 環境変数あるいは --histignore オプションを指定すると指定したステートメントがデフォルトの無視リスト(*IDENTIFIED*:*PASSWORD*) に追加される。

すべてのステートメントを履歴ファイルに保存しない方法

すべてのステートメントを履歴ファイルに保存したくないときは履歴ファイルを /dev/null へのシンボリックリンクにしてしまえばよい。

たとえば履歴ファイルが ~/.mysql_history なら以下のコマンドを実行すれば以後すべてのステートメントは履歴ファイルに保存しなくなる。

$ ln -s /dev/null ~/.mysql_history

あるいは /dev/nullMYSQL_HISTFILE 環境変数指定しておくことでもすべてのステートメントを履歴ファイルに保存しないようにできる。 たとえば .bashrc とかに MYSQL_HISTFILE=/dev/null と書いておくとよい。

参考ページ