edit (¥e)コマンド
mysqlプロンプトにいながら任意のエディタでSQLが編集できちゃいます。具体的には、mysqlコマンドでプロンプト待ちの状態で
mysql> edit
のように edit または ¥e と入力すると、環境変数EDITORで設定してあるエディタが立ち上がりSQLが編集可能になります。編集が終わったらエディタを終了して ; とやればSQLが実行されます。viなどターミナルで動くエディタに慣れている人は長いSQLを編集する時に重宝する機能でしょう。この技は前職の同僚に教えてもらって、以降便利に使っています。
-B (--batch)オプション
$ mysql -uroot -phoge -e "select Host,User,Password from user where user='root'"
のようにmysqlコマンドを実行すると標準出力に下記のような結果が表示されますが、
+-----------+------+-------------------------------------------+
| Host | User | Password |
+-----------+------+-------------------------------------------+
| localhost | root | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
| 127.0.0.1 | root | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
+-----------+------+-------------------------------------------+
このようなクエリの結果を、他のシステムに取り込むためにタブ区切りのTSVで出力したい場合が多々あります。そういう場合は -B (--batch) オプションをつけることで、列の区切りをタブにして出力することができます。-N (--skip-column-names) をつけることでカラム名を出力しないということもできます。
さらに
- -E(--vertical): カラムのデータを縦方向に表示(¥Gと同じ)
- -X(--xml): XML形式で出力
MySQLのプロンプトを変更する
mysqlコマンドでログインすると、デフォルトでは "mysql> " というプロンプトですが、これだとどのMySQLサーバにログインしているのかわからなくなってしまい、「テスト環境だと思って豪快なクエリを投げたら実は本番環境だった」ということがよくあります。そういったミスを防ぐためには、/etc/my.cnf または $HOME/.my.cnf に
[mysql]
prompt=\\u@\\h:\\d>\\_
と書いておくとよいでしょう。プロンプトが "root@db1:pigg>" のようにホスト名やデータベース名を含んだものになるので、先ほどのような勘違いも少しはなくなるはずです。
(なお、my.cnf に設定を書かずに環境変数 MYSQL_PS1 をセットしておくことでも同じことができます)
-U (--safe-updates)オプション
例えば、update user set disabled=1;
のようなWHERE句をつけ忘れた世にも恐ろしいクエリを実行してしまった経験はありませんか?この -U オプションはこのようなクエリを予防するための素晴らしいもので、これを有効にするとWHERE句がないUPDATEやDELETEはエラーで弾いてくれるようになります。より詳細には「UPDATEやDELETEでキーがついているカラムがWHERE句に含まれている場合、もしくはLIMIT句つきの場合のみ更新ができるようになる」という代物だそうです(MySQL 5.1マニュアル参照)。
このようなWHERE句の付け忘れのクエリは mysql コマンドで直にサーバにログインして発行することが多いと思うので、オペレーションユーザの $HOME/.my.cnf に
[mysql]
safe-updates
と書いておくのがよいでしょう。もしくは /etc/my.cnf に書いてしまってもいいかもしれません。
なお、一時的にこのオプションの効果を無効にしたい場合は
mysql> SET SQL_SAFE_UPDATES=0;
とすることで(そのセッション内で)無効にできることを確認しています。