概要
長年困っていた、.my.cnfに "show-warnings" のオプション書いてたらmysqldumpしたときにunknown optionって怒られる問題。
— ぴんくもひかん (@pinkumohikan) July 16, 2019
show-warningsを "client" じゃなくて "mysql" ディレクティブに書いとけば、mysql clientのときだけshow warningsできることに気づいた🎉
背景
mysqlやmysqldumpなどのコマンドを実行するとき、 .my.cnf
という名前の設定ファイルを用意しておくと文字コードやホスト名、パスワードなどのオプションを省略することができる。
自分は下記のように show-warnings
というオプションを設定していた。mysqlコマンドでは通常、warningの出るDB操作を行ってもwarningは表示されないが、このオプションを設定しておくとコンソールに警告メッセージを表示してくれるようになる。警告を握りつぶして良いことなど何一つとしてないので、必ず指定しておきたいオプションだ。
.my.cnf
[client] show-warnings
警告の例
mysql> drop table if exists db.not_found_table; Query OK, 0 rows affected, 1 warning (0.01 sec) Note (Code 1051): Unknown table 'db.not_found_table'
だが、この設定をしたままmysqldumpを実行すると下記のように怒られてしまう。
$ mysqldump dump_target_table mysqldump: [ERROR] unknown option '--show-warnings'.
原因と対策
原因は show-warnings
オプションはmysqlコマンドにはあるがmysqldumpにはないため、存在しないオプション指定してんじゃねえぞと怒られているわけである。
解決策としては、 show-warnings
オプションを [client]
というgroupではなく [mysql]
というgroupに記載すれば、mysqlコマンドのときだけオプションを適用することができた。
before
[client] show-warnings
after
[mysql] show-warnings
ドキュメントとしてはこの辺り:
If an option group name is the same as a program name, options in the group apply specifically to that program. For example, the [mysqld] and [mysql] groups apply to the mysqld server and the mysql client program, respectively.
The [client] option group is read by all client programs provided in MySQL distributions (but not by mysqld). To understand how third-party client programs that use the C API can use option files, see the C API documentation at Section 28.7.7.50, “mysql_options()”.
これでmysqldumpを実行するときだけ show-warnings
をコメントアウトするというつらい運用から開放される!