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
.