mysqlコマンドをより便利に安全にするための小粒なTIPS集 | サイバーエージェント 公式エンジニアブログ
初めまして。2010年の3月に入社した oinume です。新年1月からウィルス性胃腸炎に罹りながらもなんとかこのエントリーを書いています。今回は、mysqlコマンドに関する自分が今まで学んだ&教えてもらった細かい実践的なTIPSを紹介します。小粒ですが何かの役に立てば幸いです。

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形式で出力
なんていうものもあります。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;

とすることで(そのセッション内で)無効にできることを確認しています。

最後に

小粒なTIPS集でしたがいかがでしたでしょうか。弊社ではMongoDBなど新しいデータベースも使い始めていますが、MySQLもまだまだ健在です。今回のようなTIPSがまた溜まれば今後もこのブログで公開していきたいと思います。