はじめまして。サーバの構築業務を担当している川合です。
今回は、実際の構築業務の中でつまずいてしまった内容で記事を書かせていただきました。
この記事を見ていただいて、同じ問題で悩んでいる方の解決に役立てれば幸いです。
概要
CentOS7系でMySQL5.6を利用すると、my.cnfに設定したパラメータが正常に反映されないという現象が発生します。
特定の条件でのみ発生する現象となりますが、実際の環境を見ながら現象の確認から解決方法まで解説していきたいと思います。
利用する環境は、CentOS Linux release 7.4.1708 (Core)
MySQLは、mysql-community-server の 5.6.37-2.el7.x86_64 を利用しています。
MySQLの設定ファイルであるmy.cnfファイルは、デフォルトのものを利用します。
現象の確認
それでは、インストールしたMySQLを起動させてみましょう。
エラーなく起動できれば、一度MySQLのログファイルを確認してみます。
デフォルトの設定ですと、/var/log/mysqld.log にログが出力されています。
cat /var/log/mysqld.log |grep "Buffered warning"
[Warning] Buffered warning: Changed limits: max_open_files: 1024 (requested 5000)
[Warning] Buffered warning: Changed limits: table_open_cache: 431 (requested 2000)
max_open_files と table_open_cache で警告が出ていることが確認できます。
どちらも requested に記載されているデフォルトの値より何故か低い値が設定されています。
cat /proc/pidof mysqld
/limits |grep "Max open files"
Max open files 1024 4096 files
Soft Limitが1024、Hard Limitが4096であることが確認できます。
max_open_filesについては、limitsに記載されている数値ではなくMySQLのopen_files_limitの数値が反映されています。
SHOW GLOBAL VARIABLES LIKE 'open_files_limit';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| open_files_limit | 1024 |
+------------------+-------+
SHOW GLOBAL VARIABLES LIKE 'open_files_limit';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| table_open_cache | 431 |
+------------------+-------+
どちらもログに出力されている通りの数値になっています。
それでは、open_files_limitとtable_open_cache の数値を変更してみましょう。
table_open_cache=2000
open_files_limit=5000
デフォルトの数値を明示的に /etc/my.cnf に追記してMySQLを再起動してみます。
同様にログファイルを確認してみると
[Warning] Buffered warning: Could not increase number of max_open_files to more than 1024 (request: 5000)
[Warning] Buffered warning: Changed limits: table_open_cache: 431 (requested 2000)
設定している数値自体に変化はないため、requestedは変化していません。
ただ、max_open_filesを1024より増やせないというログ内容に変わりました。
SHOW GLOBAL VARIABLES LIKE 'open_files_limit';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| open_files_limit | 1024 |
+------------------+-------+
SHOW GLOBAL VARIABLES LIKE 'open_files_limit';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| table_open_cache | 431 |
+------------------+-------+
数値も先ほどと変化がないことから、ファイルディスクリプタ周りの設定が原因ではないかと確認することができました。
解決方法
MySQLのファイルディスクリプタの制限値を設定します。
CentOS7系は、systemdで管理されていますので従来のlimits.confに設定を追加する方法より簡単に設定ができます。
具体的には、制限値を変更したいサービスのユニットファイルにLimitNOFILE=任意の数値 を追加するだけとなります。
ただ、ユニットファイルそのものに設定を追加してしまうとアップデートされたタイミングで上書きされてしまう問題があるので、追加分の設定ファイルを別で用意する形をとります。
用意するファイルは、/etc/systemd/system/mysqld.service.d/limits.conf です。
mkdir /etc/systemd/system/mysqld.service.d
vi /etc/systemd/system/mysqld.service.d/limits.conf
[Service]
LimitNOFILE=5000
systemctl daemon-reload
systemctl restart mysqld
systemd と mysql の設定を反映させます。
cat /proc/pidof mysqld
/limits |grep "Max open files"
Max open files 5000 5000 files
制限が緩和されていることを確認できます。
MySQLのログファイルを確認してみると、今まで出力されていた警告が消えていることを確認できます。
SHOW GLOBAL VARIABLES LIKE 'open_files_limit';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| open_files_limit | 5000 |
+------------------+-------+
SHOW GLOBAL VARIABLES LIKE 'open_files_limit';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| table_open_cache | 2000 |
+------------------+-------+
設定した数値が反映されていることが確認できます。
内容が確認できれば、/etc/my.cnf から open_files_limit を削除します。
設定を削除する意図としましては、LimitNOFILEに記載した数値がそのままopen_files_limitの数値になるためです。
/etc/my.cnfに設定が記載されていることで、この部分のみ設定変更してしまい実際にはLimitNOFILEを変更していないので数値が変わっていないという問題を防ぐためでもあります。
まとめ
CentOS7系でMySQL5.6を利用する場合は、MySQLで扱えるファイルディスクリプタの設定を始めに変更しておく必要があります。
その際は、ユニットファイルを編集するのではなく上書きする部分のみを別ファイルとして利用する方法が比較的安全です。
今回設定値は、デフォルトのものを利用しましたが利用する環境に合わせて設定を変更していく必要があります。
また今回詳細な説明は省いていますが open_files_limit の数値の算出にはmax_connections table_open_cache の数値も関わってきますので注意が必要です。
プロフィール
サーバ構築周り全般を対応しております。
LINK
クラウドベリージャム:プロフィールページ