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
と書いておくとよい。