MySQLはバージョン8.0に入ってからは多くの機能が追加、改善され続けています。ただ、その改善の中には昔は利用可能だった機能やオプションが削除されたり、非推奨になるパターンもあります。
MySQL 8.0.16にvalidate-configというオプションが追加されました。このオプションはサーバーに設定されたオプションを検証するためのオプションです。今回はこのvalidate-configについて説明していきます。なお、利用している環境は、CentOS 7、MySQLはバージョン8.0.23を利用しております。
validate-configオプション
validate-configオプションは、その名の通り、MySQLの設定を検証してくれるオプションになります。つまり、起動時に渡すオプションやmy.cnfの設定ファイルに記述した各種オプションについて、正常なオプションであるかを検証します。
まずは起動確認としてmysqldコマンドを実行してみます。
$ mysqld --defaults-file=/etc/mysql/my.cnf
...〈ログ省略〉
2021-03-15T20:11:22.628902+09:00 0 [System] [MY-010931] [Server] /usr/local/mysql8023/bin/mysqld: ready for connections. Version: '8.0.23' socket: '/etc/tmp/mysql.sock' port: 3306 MySQL Community Server - GPL.
特に問題なく起動できることが確認できました。このMySQLを一度落として、今度は--validate-configオプションをつけて起動してみます。
$ mysqld --defaults-file=/etc/mysql/my.cnf --validate-config
$
$ ps aux | grep mysqld | grep -v grep
$
特になにもなく、すぐにコマンドプロンプトが返ってきました。プロセスを確認してもmysqldは起動してないことが確認できます。今度は存在しないオプションを渡して実行してみましょう。
$ mysqld --defaults-file=/etc/mysql/my.cnf --validate-config --sonzaishinai-option
2021-03-15T20:25:36.903944+09:00 0 [ERROR] [MY-000068] [Server] unknown option '--sonzaishinai-option'.
2021-03-15T20:25:36.904064+09:00 0 [ERROR] [MY-010119] [Server] Aborting
エラーが返ってきました。もちろんMySQLは起動していません。
このように--validate-configオプションを追加して実行することで、mysqlを完全に立ち上げずにオプションの検証のみを実行することができます。今度は、my.cnfのmysqldセクションに存在しないオプションを追加して実行してみます。
$ vi /etc/mysql/my.cnf
$ mysqld --defaults-file=/etc/mysql/my.cnf --validate-config
2021-03-15T20:29:34.876933+09:00 0 [ERROR] [MY-000068] [Server] unknown option '--sonzaishinai-option'.
2021-03-15T20:29:34.877023+09:00 0 [ERROR] [MY-010119] [Server] Aborting
同様にエラーが出力されました。validate-configオプションを実行してエラーの有無で終了コードを確認してみると、エラーが出ない場合は正常終了(0) 、エラーが出た場合は1となっています。
$ mysqld --defaults-file=/etc/mysql/my.cnf --validate-config
echo $?
0
$ mysqld --defaults-file=/etc/mysql/my.cnf --validate-config --sonzaishinai-option
2021-03-15T20:34:38.485759+09:00 0 [ERROR] [MY-000068] [Server] unknown option '--sonzaishinai-option'.
2021-03-15T20:34:38.486024+09:00 0 [ERROR] [MY-010119] [Server] Aborting
$ echo $?
1
WARNINGを表示
validate-configはlog-error-verbosity
と組み合わせて利用することで、WARNINGを表示されることができます。試しに、log-error-verbosityと組み合わせて、read-onlyオプションに定義されていない値を入れて実行してみましょう。
$ mysqld --defaults-file=/etc/mysql/my.cnf --validate-config --log-error-verbosity=2 --read_only=3
2021-03-15T20:50:57.688257+09:00 0 [Warning] [MY-000076] [Server] option 'read_only': boolean value '3' was not recognized. Set to OFF.
$ echo $?
0
WARNINGを表示させることができました。なお、上記の通り、エラーではないため終了コードは0となります。
loose接頭辞の扱い
第33回 MySQLのオプションファイル my.cnfの豆知識[その2] の便利なloose接頭辞でも紹介したとおり、オプション名の先頭にlooseを使うことで、MySQLサーバー自体のオプションではないプラグインのオプションを設定することができます。validate-configオプションでloose接頭辞が検出された場合は、起動時と同じようにERRORではなくWARNING扱いとなります。
$ mysqld --defaults-file=/etc/mysql/my.cnf --validate-config --log-error-verbosity=2 --loose
2021-03-15T21:06:00.522701+09:00 0 [Warning] [MY-000067] [Server] unknown variable 'loose-mecab-rc-file=/usr/lib64/mysql/mecab/etc/mecabrc'.
PLUGINのオプションの扱い
PLUGINで利用されるオプションについてはvalidate-configでは判定できません。たとえば、下記のようなsemisyncプラグインをインストールしてある環境でも、validate-configではエラーとなってしまいます。
$ mysqld --defaults-file=/etc/mysql/my.cnf --validate-config
2021-03-18T09:52:40.841398+09:00 0 [ERROR] [MY-000067] [Server] unknown
variable 'rpl_semi_sync_master_enabled=1'.
2021-03-18T09:52:40.841480+09:00 0 [ERROR] [MY-010119] [Server] Aborting
PLUGINのオプションを利用する場合は、loose接頭辞をつけてWARNINGにすることをおすすめします。実際、Worklog にも、プラグインの初期化は行われないためにプラグインの変数は認識しない旨が記載されております。
mysqld-auto.cnfも判定対象?
先ほどのrpl_semi_sync_master_enabled
をSET PERSISTで設定して、mysqld-auto.cnfに設定させてエラーになるか確認してみましょう。
mysql> SET PERSIST rpl_semi_sync_master_enabled=1;
Query OK, 0 rows affected (0.00 sec)
$ mysqld --defaults-file=/etc/mysql/my.cnf --validate-config
$
今度はエラーとならずに返ってきました。プラグインの変数はvalidate-configでは認識しない点を考えると、mysqld-auto.cnfはvalidate-configの対象ではないと考えて良いかと思います。
mysqld_safeにわたすとどうなるのか
起動時にmysqld_safeを利用してオプションに--validate-configを渡して実行すると、もちろんですが起動しません。これはmysqld_safeの中身を見たことがある人ならすぐにおわかりかもしれませんが、mysqld_safeは実行時に受け取った引数(オプション)をもとにmysqldコマンドを実行するため、mysqld --validate-configを実行したのと同じになるからです。ただし、エラーがあった場合の出力先は標準出力ではなくerror.logに出力されるため注意してください。
validate-configはどういうときに使うと便利か
ここまで挙動を見ていきましたが、validate-configはどういうときに使うと便利なのでしょうか。たとえば、動的にmy.cnfを生成している場合などは、生成したmy.cnfをvalidate-configで検証して処理をすすめるのも良いかもしれません。
また、近年のMySQLはアップデートでさまざまなオプションが追加、削除されています。バージョンアップをする際は、validate-configをかけることで事前にエラーとなるオプションの存在に気づくことができるかもしれないので、検証のときに実行してみるのも良いかと思います。とはいえ、validate-configを使わなくても、起動時のログを注意深く見るとエラーが出ているので気付けるかもしれません。
まとめ
今回は、MySQL 8.0.16で追加されたvalidate-configオプションについてみていきました。特に重要なオプションではありませんが、知っておくと、スクリプトの作成時やバージョンアップ時に問題のヒントとして利用できるかもしれません。
今回のvalidate-configについてはMySQL Server BlogのHow to validate server configuration settings. にも説明があるので、ぜひご一読ください。