MySQLの設定ファイルmy.cnfはOSやインストール方法によって場所が異なる。
PostgreSQLのshow config_file;のように設定ファイルの場所を直接返すSQL文はなく、SHOW VARIABLESにも該当する項目はない。
稼働しているMySQLの設定ファイルの場所を確認するには、mysqldコマンドの探索順表示や--print-defaultsオプションを使う。
参考: 【PostgreSQL】postgresql.confの場所を探す(show config_file)
mysqld –verbose –helpで探索順を確認する
mysqld --verbose --helpを実行すると、設定ファイルを読み込む順序が表示される。
$ mysqld --verbose --help | grep -A 3 "Default options"
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
The following groups are read: mysql_cluster mysqld server mysqld-8.0
複数のファイルが存在する場合はすべて読み込まれ、後から読み込んだファイルの設定値が優先される。mysqldは[mysqld]・[server]・[mysqld-8.0]などのグループのみを読み込む。
mysqlクライアントコマンドでも同様に確認できるが、探索するファイルの並び自体は同じで、読み込むグループがclient・mysqlに変わる。
$ mysql --verbose --help | grep -A 3 "Default options"
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
The following groups are read: mysql client
mysqld向けの[mysqld]グループに書いた設定は、mysqlクライアントの接続時には反映されない。
–print-defaultsで実際に適用される設定を確認する
mysqld --verbose --helpはコンパイル時に決まった探索順を表示するだけで、実際にどのファイルが存在し、どんな値が読み込まれたかまでは分からない。
実際に適用される設定を確認するには--print-defaultsオプションを使う。
$ mysqld --print-defaults
/usr/sbin/mysqld would have been started with the following arguments:
--skip-host-cache --skip-name-resolve --datadir=/var/lib/mysql --socket=/var/run/mysqld/mysqld.sock --secure-file-priv=/var/lib/mysql-files --user=mysql --pid-file=/var/run/mysqld/mysqld.pid
表示される引数は、探索順にある設定ファイルのうち実際に存在するファイルの内容をマージした結果である。--print-defaultsは起動せずに引数を表示するだけなので、稼働中のサーバーに対しても安全に実行できる。
ただし、稼働中のサーバーが--defaults-fileオプション付きで起動されている場合は、オプションなしの--print-defaultsでは同じ結果にならない。
起動スクリプトやsystemdのUnit定義に--defaults-fileの指定がないかもあわせて確認する。
インストール方法によって配置場所が異なる
mysqld --verbose --helpが示す探索順のうち、実際にファイルが存在する場所はディストリビューションやインストール方法によって異なる。
Docker公式イメージ(mysql:8.0、Debian系)では/etc/my.cnfに1ファイルで設定が書かれており、末尾の!includedirディレクティブで/etc/mysql/conf.d/配下も読み込む。
# /etc/my.cnf 抜粋
[mysqld]
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
...
!includedir /etc/mysql/conf.d/
一方、Ubuntuにapt install mysql-serverした場合は/etc/mysql/my.cnfが本体であり、こちらも!includedirで分割された構成になっている。
実際の[mysqld]設定は/etc/mysql/mysql.conf.d/mysqld.cnfに書かれており、/etc/mysql/my.cnf自体を直接編集することはあまりない。
# /etc/mysql/my.cnf 抜粋
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
!includedirはディレクトリ内の.cnfで終わるファイルをすべて読み込むディレクティブであり、複数の設定ファイルを分割管理する際に使う。
どの構成であっても、最終的にどの値が有効かを確認したい場合は--print-defaultsの結果を見るのが確実である。
参考
- MySQL Documentation: Using Option Files
- MySQL Documentation: Command-Line Options that Affect Option-File Handling
