MySQL道普請便り

第33回 MySQLのオプションファイル my.cnfの豆知識[その2]

この記事を読むのに必要な時間:およそ 3 分

オプションファイルの書式

オプションファイルには「オプショングループ」があり,各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]オプショングループに書いてしまい,mysqldumpmysqladmin[client]オプショングループを読み込んだ際に「[ERROR] unknown option」という間違いがあります。たとえばuser=rootsocket=/var/lib/mysql/mysql.sockなどはどのコマンドラインクライアントにも存在するオプションなので[client]オプショングループに書くのは間違いではありませんが,prompt= "\u@\h:\p"mysqlコマンドラインクライアント専用のオプションのため,[client]オプショングループではなく[mysql]オプショングループに記載するべきです(以下は,promptオプションを[client]オプショングループに書いてしまったため,mysqldump--promptを設定しようとして「unknown option」のエラーを出力している例です)。

$ mysqldump -S /var/lib/mysql/mysql.sock -u root
mysqldump: [ERROR] unknown variable 'prompt=\u@\h:\p> '

便利なloose接頭辞

MySQLには,オプション名の先頭につけることで特別な効果を発揮する接頭辞(プレフィックス)がありますMySQL :: MySQL 5.6 リファレンスマニュアル :: 4.2.5 プログラムオプション修飾子)。

loose接頭辞はそれらの接頭辞の1つであり,「認識できないオプションを入力された場合でもエラーにせずワーニングのみを出力する」効果があります(各種MySQLのプログラムはオプションのパースがエラーになった場合,異常終了します。ワーニングであれば起動できます)。

これはたとえば,「プラグインをインストールする時点ではオプションファイルに記載されていないといけないパラメータだが,MySQLサーバー自体のオプションではないためにプラグインのインストール前にオプションファイルに記載されているとエラーになる」ようなオプションを記述する用途に利用できます(MySQL公式ドキュメントに記載されている範囲では,MeCab全文検索プラグインが該当します)。

mysql> INSTALL PLUGIN mecab SONAME 'libpluginmecab.so';
ERROR 1123 (HY000): Can't initialize function 'mecab'; Plugin initialization function failed.

$ less /var/log/mysqld.log
..
2016-11-13T16:16:58.192098Z 3 [ERROR] Mecab: createModel() failed: param.cpp(69) [ifs] no such file or directory: /export/home/pb2/build/sb_0-20230202-1472569797.71/mecab-0.996-el6-x86-64bit/etc/mecabrc
2016-11-13T16:16:58.192106Z 3 [ERROR] Plugin 'mecab' init function returned error.

$ echo "loose-mecab-rc-file=/usr/lib64/mysql/mecab/etc/mecabrc" >> /etc/my.cnf
$ service mysqld restart

mysql> INSTALL PLUGIN mecab SONAME 'libpluginmecab.so';
Query OK, 0 rows affected (0.00 sec)

$ less /var/log/mysqld.log
..
2016-11-13T16:22:46.807090Z 0 [Warning] unknown variable 'loose-mecab-rc-file=/usr/lib64/mysql/mecab/etc/mecabrc'
..
2016-11-13T16:23:11.475482Z 4 [Note] Mecab: Trying createModel(--rcfile=/usr/lib64/mysql/mecab/etc/mecabrc)
2016-11-13T16:23:11.491115Z 4 [Note] Mecab: Loaded dictionary charset is utf-8

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以外に思いつきませんでしたが)。

$ vim /etc/my.cnf
..
[client]
loose_default_character_set= utf8mb4
..

$ mysql --help | grep utf8mb4
default-character-set             utf8mb4

$ mysqldump --help | grep utf8mb4
default-character-set             utf8mb4

$ mysqlcheck --help | grep utf8mb4
default-character-set             utf8mb4

$ mysqlbinlog --help | grep utf8mb4
mysqlbinlog: [Warning] unknown variable 'loose_default_character_set=utf8mb4'

オプションファイルとオプショングループを上手に使い分けて,快適なMySQLライフを楽しみましょう。

著者プロフィール

yoku0825

GMOメディア株式会社のDBA。日本MySQLユーザ会員。主に地雷担当。主食はMySQLだがPercona Server,MariaDB,InfiniDBにMroongaストレージエンジンなど,mysqldでありさえすれば雑食。

Twitter:@yoku0825

コメント

コメントの記入