実験用にmy.cnfを編集しやすくする。 Serversman@VPSにMySQLをインストールした際の備忘録(2)

$ less /etc/my.cnf
#!include       /usr/share/mysql/my-medium.cnf
!include        /usr/share/mysql/my-large.cnf
!includedir     /etc/mysql.d
$ less /etc/mysql.d/encoding.cnf
[client]
default-character-set = utf8
[mysqld]
default-character-set = utf8

!include!includedirを使って、my.cnfにあれこれ実験的な設定をしやすくしました。ApacheなどLinux上で良くあるように、設定ファイル本体 my.cnfと、mysql.d/*.cnfを上書き読み込みする設定ファイル群を置く形を、MySQLでもやってみました。

メリット

my-medium.cnfやmy-large.cnfといった、デフォルトとなる設定をした上で、/etc/mysql.dに置いた個別の.cnfファイルで読み込み時に上書きするので、何時でもデフォルトに戻せます。あと、デフォルトからどう変えたかも分かりやすいです。
更に、個別の.cnfファイルを役割毎にちゃんと分けて作れば、設定の見通しもよくなります。

実際に稼動させる環境ならこんな事はする必要ないと思いますが、my.cnfの設定やMySQLの動きを調べたり研究したりする場合は、便利になるんじゃないかと思います。

補足

!include!includedirはグループ指定の影響を受けます。まずmy.cnfを読み込んだ上で、mysql.d/*.cnfが上書きする形で読み込まれないとダメなんですが、これを実現する為に工夫して、上記のようになりました。

$ less /etc/my.cnf
!include all.cnf #all.cnfは必ず読み込まれる
[client]
!include client.cnf #clientグループの場合のみclient.cnfを読み込む
[mysqld]
!include mysqld.cnf #mysqldグループの場合のみmysqld.cnfを読み込む

グループ指定の影響を受けるというのは、こういうことです。つまり、必ず読み込まれるようにするには、my.cnfの最初の方に!include!includedirを置く必要があります。ただそうすると、mysql.d/*.cnfの設定をmy.cnfの下のほうにある設定で上書きしてしまいます。

個別の.cnfファイルに[client]の様なグループを書けば、ちゃんとグループの指定として機能します。なのでmy.cnfでは、まずデフォルト設定をインクルードして、次に個別の.cnfファイルをインクルードする形になりました。

ちなみに、encoding.cnfを適用する前の初期値
mysql> show variables like "%char%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
[mysqld]グループでdefault-character-set = utf8を設定
mysql> show variables like "%char%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
上記に続けて[client]グループでdefault-character-set = utf8を設定
mysql> show variables like "%char%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

環境

サーバー Serversman@VPS Entry
Linux CentOS 5.7
mysql-server 5.0.77-4.el5_6.6