今天在啟動mysql的時候,使用/etc/init.d/mysqld start 報錯
Starting MySQL (Percona Server).mkdir: cannot create directory `/var/lib/mysql': File exists chown: cannot access `/var/lib/mysql': Permission denied chmod: cannot access `/var/lib/mysql': Permission denied rm: cannot remove `/var/lib/mysql/mysql.sock': Permission denied ERROR! The server quit without updating PID file (/var/run/mysqld/mysqld.pid).
一看這種是權限問題,但查看發現目錄權限已經是對的
查看啟動腳本,是啟動的時候調用/usr/bin/mysqld_safe啟動進程,兩個都是shell腳本,改用調試模式執行
發現在目錄判斷的時候會失效
實際上這個目錄是存在的,查看啟動失敗的日志
也是權限問題,但目錄權限正確,所以可能的問題就出在啟動mysql_safe腳本的時候導致某些問題的出現
換用以下方式啟動
[shell#] sh /etc/init.d/mysqld start
發現啟動成功,這種情況相當於直接以root用戶啟動,
查看日志/var/log/audit/audit.log 發現發現時selinux限制了mysql啟動時對數據目錄的chown
type=AVC msg=audit(1492495884.134:8627): avc: denied { getattr } for pid=11695 comm="chown" path="/var/lib/mysql" dev=dm-0 ino=392235 scontext=unconfined_u:system_r:mysqld_safe_t:s0 tcont ext=unconfined_u:object_r:var_lib_t:s0 tclass=lnk_file
因為這里我們用不上selinux直接關掉,臨時關掉的方式如下:
[shell#] setenforce 0
永久關掉需要修改 /etc/selinux/config 再重啟機器就好
SELINUX=disabled
也可以打開相關目錄的權限
[shell#]chcon -R -t mysqld_db_t dir
再啟動便不會報錯
附:
關於selinux與mysql相關的一些問題可查看 https://blogs.oracle.com/jsmyth/entry/selinux_and_mysql