MySQLのオプションファイル
オプションファイルとはその名の通りMySQL関連プログラムに渡すオプションを列挙したもので、/etc/
が有名です。Windowsプラットフォームではmy.
というファイル名も利用されますが、
デフォルトでオプションファイルが読み込まれる順番
リファレンスマニュアルにも記載がありますが、
- /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./usr/
がSYSCONFDIRに指定されています。$MYSQL_$MYSQL_
によって決まり、$MYSQL_
を指定しなかった場合、/usr/
が自動的に/usr
を$MYSQL_
に設定します。--defaults-extra-file
オプション
オプションファイルが読み込まれる順番とパラメーターの関係
yum版では作成されませんが、$MYSQL_
にあたる/usr/
を自動で作成します。
$MYSQL_
は、/etc/
よりも後から読み込まれます。これにより何が起こるかというと、
$ vim /etc/my.cnf .. [mysqld] sql_mode= NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,ONLY_FULL_GROUP_BY,PIPES_AS_CONCAT .. $ vim /usr/my.cnf [mysqld] sql_mode= NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
採用されるオプションの値は後から読み込まれたオプションファイルのものになります。
mysql> SELECT @@sql_mode; +--------------------------------------------+ | @@sql_mode | +--------------------------------------------+ | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | +--------------------------------------------+ 1 row in set (0.00 sec)
なお、
$ vim /usr/my.cnf [mysqld] sql_mode= NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES sql_mode= ANSI_QUOTES sql_mode= NO_ZERO_DATE $ sudo service mysqld restart mysql> SELECT @@sql_mode; +--------------+ | @@sql_mode | +--------------+ | NO_ZERO_DATE | +--------------+ 1 row in set (0.00 sec)
有効になるのは最後に読み込まれたオプションです。
ただし、
オプションファイルのインクルード
さらに、!include
ディレクティブや!includedir
ディレクティブを使用することで、/etc/
、/etc/
を設定した場合/usr/
については削除してあります)、sql_
は何になるでしょうか?
$ vim /etc/my.cnf .. [mysqld] sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES !include /etc/included_my.cnf sql_mode= ANSI_QUOTES .. $ vim /etc/included_my.cnf [mysqld] sql_mode= STRICT_ALL_TABLES
正解はANSI_
です。sql_
を/etc/
から読み取ったあと、!include
ディレクティブにより/etc/
のsql_
を読み取ってから!include
ディレクティブに戻り、sql_
を読むからです。
仕組みを知ってしまえば大したことではありませんので、
オプションファイルの読み込みに関する3つのオプション
MySQLの標準の動作は
オプション名 | 効果 |
---|---|
--no-defaults | オプションファイルを一切読み込まない |
--defaults-file | 指定したオプションファイルのみを読み込む |
--defaults-extra-file | デフォルトで読み込むオプションファイルに加え指定したオプションファイルを読み込む |
これらのオプションは[ERROR] unknown variable
となります)。mysqld_
やmysqld
を直接呼び出している箇所に引数として与えることで効果を発揮します。これら3つのオプションは1つめの引数として与えなければなりません。オプションファイルを読み込まずポート番号だけ13306にしたいような場合、mysqld --port=13306 --no-defaults
は誤りで、mysqld --no-defaults --port=13306
としなければなりません。
MySQL 8.0での新機能
2016年10月現在のDMR
mysql80> SELECT * FROM performance_schema.variables_info WHERE variable_source <> 'COMPILED'; +--------------------------+-----------------+-------------------------+-----------+----------------------+ | VARIABLE_NAME | VARIABLE_SOURCE | VARIABLE_PATH | MIN_VALUE | MAX_VALUE | +--------------------------+-----------------+-------------------------+-----------+----------------------+ | basedir | COMMAND_LINE | | 0 | 0 | | binlog_checksum | GLOBAL | /etc/my.cnf | 0 | 0 | | datadir | COMMAND_LINE | | 0 | 0 | | foreign_key_checks | DYNAMIC | | 0 | 0 | | general_log_file | GLOBAL | /etc/my.cnf | 0 | 0 | | innodb_fast_shutdown | SERVER | /usr/mysql/8.0.0/my.cnf | 0 | 2 | | innodb_file_per_table | GLOBAL | /etc/my.cnf | 0 | 0 | | innodb_lock_wait_timeout | GLOBAL | /etc/my.cnf | 1 | 1073741824 | | innodb_log_file_size | GLOBAL | /etc/my.cnf | 4194304 | 18446744073709551615 | | log_error | COMMAND_LINE | | 0 | 0 | | log_output | GLOBAL | /etc/my.cnf | 0 | 0 | | log_slave_updates | GLOBAL | /etc/my.cnf | 0 | 0 | | long_query_time | GLOBAL | /etc/my.cnf | 0 | 4719230590769954816 | | lower_case_table_names | GLOBAL | /etc/my.cnf | 0 | 2 | | performance_schema | GLOBAL | /etc/my.cnf | 0 | 0 | | pid_file | COMMAND_LINE | | 0 | 0 | | plugin_dir | COMMAND_LINE | | 0 | 0 | | port | COMMAND_LINE | | 0 | 65535 | | query_cache_size | GLOBAL | /etc/my.cnf | 0 | 18446744073709551615 | | query_cache_type | GLOBAL | /etc/my.cnf | 0 | 0 | | relay_log | GLOBAL | /etc/my.cnf | 0 | 0 | | relay_log_recovery | GLOBAL | /etc/my.cnf | 0 | 0 | | server_id | COMMAND_LINE | | 0 | 4294967295 | | skip_name_resolve | GLOBAL | /etc/my.cnf | 0 | 0 | | slow_query_log | GLOBAL | /etc/my.cnf | 0 | 0 | | slow_query_log_file | GLOBAL | /etc/my.cnf | 0 | 0 | | socket | COMMAND_LINE | | 0 | 0 | +--------------------------+-----------------+-------------------------+-----------+----------------------+ 27 rows in set (0.00 sec)
この機能は現在!include
ディレクティブには対応していませんが!include
ディレクティブを記述したオプションファイルが表示されてしまいます)、