オプションファイルの書式
オプションファイルには「オプショングループ」があり、各MySQL関連プログラムはそれぞれ「どのオプショングループを読んで自分にそのパラメータを適用するか」が決められています。
多くの場合、各プログラムはプログラムの名前と同じオプショングループを読み取りますが、[client]
オプショングループが複数のプログラムから読み取られるなど、若干の例外もあります。また、MySQL 5.7.16現在、バックアップ用クライアントのmysqlpump(mysqlpumpであってmysqldumpではない)が読み取るオプショングループが[mysqlpump]ではなく何故か[mysql_dump]であるなど、バグによって読み取るオプショングループが間違っている例もあります(MySQL Bugs: #83144: mysqlpump reads mysql_dump group, not mysqlpump in config-group)。
オプショングループ
MySQL関連の各プログラムは、プログラムごとに読み取るオプショングループが決められています。defaults-group-suffixオプションにより多少オプショングループ名を変更することは可能ですが、接尾辞以上のオプショングループの変更(たとえば、mysqld
が[client]
オプショングループを読み取るなど)はできません。
プログラム | オプショングループ |
mysqlcheck | [mysqlcheck], [client] |
mysqlpump | [mysql_dump][1], [client] |
mysql | [mysql], [client] |
mysql_install_db | [mysql_install_db] |
mysql_secure_installation | [mysql_secure_installation], [mysql], [client] |
mysql_ssl_rsa_setup | [mysql_ssl_rsa_setup], [mysql_install_db], [mysqld] |
mysqladmin | [mysqladmin], [client] |
mysqlbinlog | [mysqlbinlog], [client] |
mysqldump | [mysqldump], [client] |
mysqlimport | [mysqlimport], [client] |
mysqlshow | [mysqlshow], [client] |
mysqlslap | [mysqlslap], [client] |
mysqltest | [mysqltest], [client] |
my_print_defaults | 任意[2] |
mysqld | [mysqld], [server], [mysqld-5.x][3], [mysql-cluster][4] |
myisamchk | [myisamchk] |
myisampack | [myisampack] |
mysqld_safe | [mysqld_safe], [safe_mysqld] |
※1)前の段落の通り、これは mysqlpump
のバグであり本来は [mysqlpump]
オプショングループが読み込まれるべきである
※2)my_print_defaultsはオプショングループを引数で指定して、オプションファイルから読み取られる値を返すためのプログラム
※3)"[mysqld-5.7] オプショングループはMySQL Server 5.7シリーズにのみ読み取られる"ことを利用して、「特定のバージョンでのみ有効にしたいオプション」をこのオプショングループで設定するというTIPSが有名
※4)MySQL Clusterが有効な状態でビルドされている場合のみ
[client]
オプショングループの誤った使い方
前の段落の表のとおり、[client]
オプショングループはMySQLの各種コマンドラインクライアントから共通で読み取られるオプションを記述するためのオプショングループです。
ありがちな間違いとして、mysql
コマンドラインクライアントにしか存在しないオプションを[client]
オプショングループに書いてしまい、mysqldump
やmysqladmin
が[client]
オプショングループを読み込んだ際に「[ERROR] unknown option」という間違いがあります。たとえばuser=root
、socket=/var/lib/mysql/mysql.sock
などはどのコマンドラインクライアントにも存在するオプションなので[client]
オプショングループに書くのは間違いではありませんが、prompt= "\u@\h:\p"
はmysql
コマンドラインクライアント専用のオプションのため、[client]
オプショングループではなく[mysql]
オプショングループに記載するべきです(以下は、prompt
オプションを[client]
オプショングループに書いてしまったため、mysqldump
が--prompt
を設定しようとして「unknown option」のエラーを出力している例です)。
便利なloose接頭辞
MySQLには、オプション名の先頭につけることで特別な効果を発揮する接頭辞(プレフィックス)があります(MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.2.5 プログラムオプション修飾子)。
loose
接頭辞はそれらの接頭辞の1つであり、「認識できないオプションを入力された場合でもエラーにせずワーニングのみを出力する」効果があります(各種MySQLのプログラムはオプションのパースがエラーになった場合、異常終了します。ワーニングであれば起動できます)。
これはたとえば、「プラグインをインストールする時点ではオプションファイルに記載されていないといけないパラメータだが、MySQLサーバー自体のオプションではないためにプラグインのインストール前にオプションファイルに記載されているとエラーになる」ようなオプションを記述する用途に利用できます(MySQL公式ドキュメントに記載されている範囲では、MeCab全文検索プラグインが該当します)。
1回目のINSTALL PLUGIN
ではmecab-rc-file
オプションが指定されていないため、ビルド時の環境である/export/home/pb2/build/..
にファイルを探しに行き、失敗しています。しかし、mecab
プラグインがインストールされていない状態でオプションファイルにmecab-rc-file
オプションを設定すると、[ERROR] unknown variable
によってMySQLサーバーが起動できなくなってしまいます。これを避けるために、loose
接頭辞を使ったloose-mecab-rc-file
オプションを設定することで、サーバー起動時には[Warning] unknown variable
の出力のみでサーバーを起動できるように、また、INSTALL PLUGIN
の時点ではmecab-rc-file
オプションの設定値を読み込み正しい場所にmecabrc
ファイルを探しに行くことができるようになります。
あるいは、「ほとんどのクライアントでは有効なオプションだが、まれに存在しない」オプションであるdefault_character_set
などもこのloose
接頭辞を使うことで設定することができます(とはいえ、このテクニックを用いて[client]
オプショングループに設定したいオプションを、筆者はdefault_character_set
以外に思いつきませんでしたが)。
オプションファイルとオプショングループを上手に使い分けて、快適なMySQLライフを楽しみましょう。