タグ別アーカイブ: MySQL5.5




MySQL5.5から5.6にアップデートしたら、「Too many open files」で起動できなかったので「open_files_limit = 8192」で対処した件




投稿日:

MySQL5.6にアップデートしたら起動できなかった

Mysql5.6にアップデート後に、MySQLが起動しない問題が発生しました。

# /etc/init.d/mysql start
Starting MySQL. ERROR! The server quit without updating PID file (/var/lib/mysql/test/test.pid).

というように、pidが残ったままになっているようです。

しかし、

# ll /var/lib/mysql/test/test.pid
ls: cannot access /var/lib/mysql/wdp/ses-king.pid: そのようなファイルやディレクトリはありません

ファイルは存在しない模様。エラーログを見ても何も何も出力されてません。

mysqld_safeコマンドで以下を実行したら、ログが出ない理由が判明しました。

# /usr/local/bin/mysqld_safe --defaults-file=/etc/my.cnf --datadir=/var/lib/mysql/test
150130 20:33:43 mysqld_safe Logging to '/var/lib/mysql/test/test.err'.
/usr/local/bin/mysqld_safe: cannot make pipe for command substitution: Too many open files
/usr/local/bin/mysqld_safe: cannot make pipe for command substitution: Too many open files
/usr/local/bin/mysqld_safe: cannot make pipe for command substitution: Too many open files
/usr/local/bin/mysqld_safe: cannot make pipe for command substitution: Too many open files
/usr/local/bin/mysqld_safe: cannot make pipe for command substitution: Too many open files
/usr/local/bin/mysqld_safe: line 670: /dev/null: Too many open files
/usr/local/bin/mysqld_safe: line 701: /dev/null: Too many open files
/usr/local/bin/mysqld_safe: cannot make pipe for command substitution: Too many open files
/usr/local/bin/mysqld_safe: cannot make pipe for command substitution: Too many open files
/usr/local/bin/mysqld_safe: cannot make pipe for command substitution: Too many open files
/usr/local/bin/mysqld_safe: cannot make pipe for command substitution: Too many open files
/usr/local/bin/mysqld_safe: cannot make pipe for command substitution: Too many open files
/usr/local/bin/mysqld_safe: cannot make pipe for command substitution: Too many open files
/usr/local/bin/mysqld_safe: cannot make pipe for command substitution: Too many open files
/usr/local/bin/mysqld_safe: cannot make pipe for command substitution: Too many open files
mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql/test
/usr/local/bin/mysqld_safe: line 128: /var/lib/mysql/test/test.err: Too many open files
rm: error while loading shared libraries: libc.so.6: cannot open shared object file: Error 24
/usr/local/bin/mysqld_safe: cannot make pipe for command substitution: Too many open files
/usr/local/bin/mysqld_safe: cannot make pipe for command substitution: Too many open files
/usr/local/bin/mysqld_safe: eval: line 165: syntax error near unexpected token `2'
/usr/local/bin/mysqld_safe: eval: line 165: ` --log-error=/var/lib/mysql/test/test.err >> 2>&1'
/usr/local/bin/mysqld_safe: line 165: warning: syntax errors in . or eval will cause future versions of the shell to abort as Posix requires
/usr/local/bin/mysqld_safe: cannot make pipe for command substitution: Too many open files
/usr/local/bin/mysqld_safe: cannot make pipe for command substitution: Too many open files
mysqld_safe mysqld from pid file /var/lib/mysql/test/test.pid ended
/usr/local/bin/mysqld_safe: line 128: /var/lib/mysql/test/test.err: Too many open files

Too many open files の模様です。MySQLのみならず、Linuxで起きる症状です。

こちらのサイトによると、
参照:Linux サーバでの「Too many open files」対策について – akishin999の日記

「Too many open files」は Linux でプロセスが開けるファイルディスクリプタの上限に達してしまうと発生するエラーです。
「ファイルディスクリプタ」という名前ですが、 Linux ではソケットもファイルディスクリプタなので、ファイルを開いた場合だけでなく、ソケットを使って通信を行う場合にもファイルディスクリプタが使用されます。
そのため、Apache や Tomcat などで高負荷なサイトを運用している場合などには、比較的遭遇する確率の高いエラーではないでしょうか。

このサイトでも試している

# vi /etc/security/limits.conf

* soft nofile 65536
* hard nofile 65536

を実施。しかし、mysqldについては変わる気配がない。。。


そして今回の解決策は。

limits.confはPAM認証を通るものしか効かず、以下によるとmysqld_safeを利用するときはこれに当てはまらないそうです。

参考:mysqldのファイルディスクリプタ数 – Studio3104::BLOG.new

# vi /etc/my.cnf

[mysqld_safe]
open_files_limit = 8192

上記の対応で無事起動ができました。
8192はネットからの流用なので自分で数字を計算したほうがよさそうです。