2012年11月13日火曜日

my.cnfのパラメータ優先順位

複数のmy.cnfがデフォルトで読み込まれるパスに置いてあったり、
中で!includeしたり、直接オプションを渡したりしたとき。

同じパラメータが指定されている場合は、常に後勝ち(後から設定された方で上書き)です。


Linux系のMySQLでは、
/etc/my.cnf -> /etc/mysql/my.cnf -> SYSCONFDIR/my.cnf -> $MYSQL_HOME/my.cnf -> defaults-extra-fileで指定されたファイル -> $HOME/.my.cnf -> 直接渡したオプション
の順番で読み込まれる。

優先順位で考えると、後勝ちなので後ろが一番強い。

SYSCONFDIRはcmakeのオプションで指定するものの、デフォルトは/usr/local/mysql/etcになっていた(5.6.8-rcのsource)
$MYSQL_HOMEは、mysqld_safeがごにょごにょして/usrに置き換えられる場合が多い(CentOS)


さて、実験。

# cat /etc/my.cnf
[mysqld]
innodb_buffer_pool_size = 200M

# cat /usr/my.cnf   #MYSQL_HOME/my.cnf

[mysqld]
innodb_buffer_pool_size = 1G

mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_buffer_pool_size';
+-------------------------+------------+
| Variable_name           | Value      |
+-------------------------+------------+
| innodb_buffer_pool_size | 1073741824 |
+-------------------------+------------+
1 row in set (0.00 sec)


 ⇒後勝ち。


# cat /etc/my.cnf
!include /etc/my2.cnf
[mysqld]
innodb_buffer_pool_size = 200M

# cat /etc/my2.cnf
[mysqld]
innodb_buffer_pool_size = 250M

mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_buffer_pool_size';

+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_buffer_pool_size | 209715200 |
+-------------------------+-----------+
1 row in set (0.00 sec)

 ⇒includeして250Mの値を1行目で得た後、3行目で200Mで上書き。


cat /etc/my.cnf
[mysqld]
innodb_buffer_pool_size = 200M

!include /etc/my2.cnf


cat /etc/my2.cnf
[mysqld]
innodb_buffer_pool_size = 250M

mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_buffer_pool_size';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_buffer_pool_size | 262144000 |
+-------------------------+-----------+
1 row in set (0.00 sec)

 ⇒200Mの値を3行目でincludeして250Mの値で上書き。


ただし、--defaults-fileを指定すると、そのファイル以外のデフォルトファイルは読まなくなる。
他のデフォルトファイルも読ませたい場合は、--defaults-extra-fileで指定すること。


【2012/11/13 14:08】
本家のリンク貼り忘れた。。

http://dev.mysql.com/doc/refman/5.5/en/option-files.html


【2013/05/30 00:10】
MariaDB 5.5.30のINSTALL_SYSCONFDIRは/etcになってた。
/etc/my.cnf -> /etc/mysql/my.cnf -> /etc/my.cnfの順番に読んだりしないのこれ?(調べてない

0 件のコメント :

コメントを投稿