以前管理していた Web サイトの改修案件が来たのでついでという事で古くなってきたサーバのOSやソフトウェアもろともアップデートする事にした。
順調に進んでいたが MySQL だけ正常に動かなかった。エラーメッセージは以下の通り。
150605 04:55:06 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
(中略)
150605 4:55:07 [Note] Server hostname (bind-address): '127.0.0.1'; port: 3306
150605 4:55:07 [Note] - '127.0.0.1' resolves to '127.0.0.1';
150605 4:55:07 [Note] Server socket created on IP: '127.0.0.1'.
150605 4:55:07 [ERROR] Can't start server : Bind on unix socket: Permission denied
150605 4:55:07 [ERROR] Do you already have another mysqld server running on socket: /var/run/mysqld/mysqld.sock ?
150605 4:55:07 [ERROR] Aborting
150605 4:55:07 InnoDB: Starting shutdown...
150605 4:55:08 InnoDB: Shutdown completed; log sequence number 99860116
150605 4:55:08 [Note] /usr/sbin/mysqld: Shutdown complete
150605 04:55:08 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
パーミッションが無いとの事だがこれだけではよくわからない。とりあえず1つずつ確かめてみる。
ファイルが既に存在しているのか確認
$ ls /var/run/mysqld/
$
無し
ポート番号が既に使われているのかの確認
$ netstat -a | grep 3306
$
無し
my.cnf を他の同一構成のサーバと目diffしてみるが同じようだ。
と、ここで apparmor の存在を知る。
apparmor の設定を確認。これも他のサーバと見比べてみる。
$ cat /etc/apparmor.d/usr.sbin.mysqld
(中略)
/var/run/mysqld/mysqld.pid rw,
/var/run/mysqld/mysqld.sock w,
/run/mysqld/mysqld.pid rw,
/run/mysqld/mysqld.sock w,
大丈夫そうではある。
いよいよわからなくなってきたので apparmor が悪いのか確かめる為に apparmor を無効にしてみる。
$ sudo aa-disable /usr/sbin/mysqld
Disabling /usr/sbin/mysqld.
Traceback (most recent call last):
File "/usr/sbin/aa-disable", line 30, in <module>
tool.cmd_disable()
File "/usr/lib/python3/dist-packages/apparmor/tools.py", line 148, in cmd_disable
raise apparmor.AppArmorException(cmd_info[1])
apparmor.common.AppArmorException: "AppArmor parser error for /etc/apparmor.d/usr.sbin.mysqld in /etc/apparmor.d/usr.sbin.mysqld at line 44: Could not open 'local/usr.sbin.mysqld'\n"
apparmor を無効化する際にエラーが出た。usr.sbin.mysqld の44行目でパースエラーが出ているようだ。該当部分は以下の一行。
#include <local/usr.sbin.mysqld>
特に問題は無さそうだと思ったが念のためこのファイルを確認してみる。
$ ls /etc/apparmor.d/local/usr.sbin.mysqld
$
ファイルが無い、これのせいか?正常に動いているほうのサーバには該当ファイルはあるが中身はコメントのみで実質空のようだ。とりあえずファイルを作ろう。
$ sudo touch /etc/apparmor.d/local/usr.sbin.mysqld
これで無効にしてみる。
$ sudo aa-disable /usr/sbin/mysqld
Disabling /usr/sbin/mysqld.
無効化できた。
$ sudo service mysql start
mysql start/running, process 14551
MySQL も起動できた。
もしかして上記のファイルが無かったが為に MySQL が動かなかったのか。再度 apparmor を有効にしてみる。
一応、現在有効になっているかどうかは apparmor_status コマンドで見る事ができる。
$ sudo apparmor_status
apparmor module is loaded.
4 profiles are loaded.
4 profiles are in enforce mode.
/sbin/dhclient
/usr/lib/NetworkManager/nm-dhcp-client.action
/usr/lib/connman/scripts/dhclient-script
/usr/sbin/tcpdump
0 profiles are in complain mode.
0 processes have profiles defined.
0 processes are in enforce mode.
0 processes are in complain mode.
0 processes are unconfined but have a profile defined.
aa-enforce で有効化する。
$ sudo aa-enforce /usr/sbin/mysqld
Setting /usr/sbin/mysqld to enforce mode.
$ sudo apparmor_status
apparmor module is loaded.
5 profiles are loaded.
5 profiles are in enforce mode.
/sbin/dhclient
/usr/lib/NetworkManager/nm-dhcp-client.action
/usr/lib/connman/scripts/dhclient-script
/usr/sbin/mysqld
/usr/sbin/tcpdump
0 profiles are in complain mode.
1 processes have profiles defined.
0 processes are in enforce mode.
0 processes are in complain mode.
1 processes are unconfined but have a profile defined.
/usr/sbin/mysqld (14551)
これで mysqld を再起動。
$ sudo service mysql restart
mysql stop/waiting
mysql start/running, process 15719
動いた。
疲れた...。
※以下を参考にしました。
ubuntu - mysql: Bind on unix socket: Permission denied - Server Fault
コメント