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, UPDATE と DELETE は保存したくないときがあると思う。
任意のステートメントを履歴ファイルに保存したくないときは MYSQL_HISTIGNORE 環境変数か --histignore オプションを指定すると履歴ファイルへの保存を抑制できる。
たとえば '*INSERT*' を MYSQL_HISTIGNORE 環境変数を指定しておくと以下の use sample_db, select * from sample_table と exit ステートメントは履歴ファイルに保存するけど 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_table と exit ステートメントは履歴ファイルに保存するけど 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/null を MYSQL_HISTFILE 環境変数指定しておくことでもすべてのステートメントを履歴ファイルに保存しないようにできる。
たとえば .bashrc とかに MYSQL_HISTFILE=/dev/null と書いておくとよい。