MySQLのオプションファイル
オプションファイルとはその名の通りMySQL関連プログラムに渡すオプションを列挙したもので、Linuxプラットフォームでは/etc/my.cnf
が有名です。Windowsプラットフォームではmy.ini
というファイル名も利用されますが、今回はCentOS 6.6のyum版MySQL 5.6の構成を例に説明します("yum版"の意図するところについては、第10回 yum, rpmインストールにおけるMySQL 5.6とMySQL 5.7の違いを参照ください)。
デフォルトでオプションファイルが読み込まれる順番
リファレンスマニュアルにも記載がありますが、デフォルトで読み込まれるオプションファイルは複数存在し、「読み込まれる順番」があります。 同じオプションを複数のオプションファイルで指定した場合は「後から読み込まれたファイル」の設定が優先されます(番号の順番にオプションファイルが読み込まれるため、番号が大きいほどオプションの優先順位が高くなります)。
- /etc/my.cnf
- /etc/mysql/my.cnf
- SYSCONFDIR/my.cnf
- $MYSQL_HOME/my.cnf
- --defaults-extra-file=path
- ~/.my.cnf
- ~/.mylogin.cnf
SYSCONFDIRはパッケージのコンパイル時に指定されるオプションです。mysql-community-server-5.6.34-2.el6.x86_64では/usr/etc
がSYSCONFDIRに指定されています。$MYSQL_HOMEは環境変数$MYSQL_HOME
によって決まり、ユーザが明示的に$MYSQL_HOME
を指定しなかった場合、/usr/bin/mysqld_safe
が自動的に/usr
を$MYSQL_HOME
に設定します。--defaults-extra-file
オプション(ドキュメント)によって追加のコンフィグファイルを指定している場合は、この後に読み込まれます。
オプションファイルが読み込まれる順番とパラメーターの関係
yum版では作成されませんが、MySQL 5.6のrpm版やLinux Genericバイナリ版はmysql_install_dbが$MYSQL_HOME/my.cnf
にあたる/usr/my.cnf
を自動で作成します。
$MYSQL_HOME/my.cnf
は、最もよく利用されるオプションファイルである/etc/my.cnf
よりも後から読み込まれます。これにより何が起こるかというと、たとえば以下のようにそれぞれのオプションファイルで同じオプションに異なる値を設定した場合、
採用されるオプションの値は後から読み込まれたオプションファイルのものになります。
なお、同じオプションファイルの中に同じオプションに異なる値を設定した場合でも、
有効になるのは最後に読み込まれたオプションです。
ただし、ignore-db-dirやreplicate-do-tableなどのように、複数回指定することで全てが有効になるオプションもあります。
オプションファイルのインクルード
さらに、オプションファイルの中では!include
ディレクティブや!includedir
ディレクティブを使用することで、デフォルトで読み込まれる以外のパスにあるオプションファイルをインクルードすることができます。この場合でも有効になるのは最後に読み込まれたオプションですが、さてそれでは以下のような/etc/my.cnf
、/etc/included_my.cnf
を設定した場合(/usr/my.cnf
については削除してあります)、最終的に読み込まれるsql_mode
は何になるでしょうか?
正解はANSI_QUOTES
です。sql_mode= NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
を/etc/my.cnf
から読み取ったあと、!include
ディレクティブにより/etc/included_my.cnf
のsql_mode=STRICT_ALL_TABLES
を読み取ってから!include
ディレクティブに戻り、その次のsql_mode= ANSI_QUOTES
を読むからです。
仕組みを知ってしまえば大したことではありませんので、想像を絶するようなインクルードだらけのオプションファイルに出会った時も、丁寧に読み解いてあげてください。
オプションファイルの読み込みに関する3つのオプション
MySQLの標準の動作は「複数のオプションファイルを順番に読み込む」ですが、この動作を変更するためのオプションも用意されています。
オプション名 | 効果 |
--no-defaults | オプションファイルを一切読み込まない |
--defaults-file | 指定したオプションファイルのみを読み込む |
--defaults-extra-file | デフォルトで読み込むオプションファイルに加え指定したオプションファイルを読み込む |
これらのオプションは「オプションファイルの読み込みに関する動作を変更(オーバーライド)する」ためのものですので、オプションファイルの中に直接書き込むことはできません([ERROR] unknown variable
となります)。mysqld_safe
やmysqld
を直接呼び出している箇所に引数として与えることで効果を発揮します。これら3つのオプションは1つめの引数として与えなければなりません。オプションファイルを読み込まずポート番号だけ13306にしたいような場合、mysqld --port=13306 --no-defaults
は誤りで、mysqld --no-defaults --port=13306
としなければなりません。
MySQL 8.0での新機能
2016年10月現在のDMR(DMRについては第8回 MySQLのバージョン体系を知るを参照)であるMySQL 8.0.0ではperformance_schema.variables_infoテーブルが追加されており、パフォーマンススキーマを用いたクエリーでそのパラメーターがどのオプションファイルから読み取られたものかを確認することができるようになっています。
この機能は現在!include
ディレクティブには対応していませんが(!include
ディレクティブを記述したオプションファイルが表示されてしまいます)、今後が楽しみな機能のひとつです。