読者です 読者をやめる 読者になる 読者になる

知らなかった。mysql の -o オプション

 mysql クライアントコマンドにはたくさんのオプションがあります*1
その中には使ったことのないオプションもいっぱいあって、私はこの -o オプションというのを知りませんでした。

  -o, --one-database  Only update the default database. This is useful for
                      skipping updates to other database in the update log.


 指定したスキーマだけをターゲットにできるもののようで、更新ログをそのまま
 流し込む時に特定のDBだけを相手にする(他はエラーになる)時に便利だと
 書いてあるのですが、んー。使い出がイメージできません。。


 それはともかく、今回書きたかったのはコレではなくて、、、、
 こんなことがあったんですよ。
 まず MySQL サーバに接続して、その際スキーマ指定を忘れたので use で指定。

$ mysql (略)
mysql> use test
Database changed
mysql> 


 で、テーブル一覧を見る。

mysql> SHOW TABLES;
Ignoring query to other database

  えええっ!? 見せてよ。。。
  なんで? 
  ・・・と軽いパニック状態。 データベース一覧を見ようと SHOW DATABASE しても、、

mysql> SHOW DATABASES;
Ignoring query to other database

 こんな状態。


 ここで悪さをしていたのが「-o オプション」だったわけです!


 私が mysql コマンドに与えたオプションは、

$ mysql -root

 見事に "u" が抜けていたために(本当は -uroot でユーザ名を指定したかった)、r, o, t オプションが有効になったわけですね。



 ちなみにデフォルトデータベースを指定しての -o オプションは以下のような動作をします。
他のスキーマへデフォルトDBを変更してもエラーにならずに、あたかも成功したように振る舞ってくれるのです。「変更できません」としてくれたほうが混乱少ないと思うのですが、エラーは変更時ではなく変更先の状態で何かクエリを投げようとしたときなのですね。


 デフォルトDBがmysqlコマンド起動時に指定したものと異なっている状態で、あらゆるSQL文がエラーになります。 以下は簡単な実行例です。

$ mysql -root test
mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| test       |
+------------+
1 row in set (0.00 sec)

mysql> use mysql
Database changed

mysql> SELECT DATABASE();
Ignoring query to other database

mysql> SHOW TABLES;
Ignoring query to other database

mysql> use test
Database changed

mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| test       |
+------------+
1 row in set (0.00 sec)

 いやぁ、ほんとに驚いた(笑)。
 

#確認バージョンは 5.5.1-m2


.

*1:mysql --help で確認できます