別サーバから持ってきたmysqlが起動しない

別のサーバで起動していたmysqlディレクトリごと固めて持ってきたものが起動しない。

関係しているサーバは3台。

サーバA:RHEL6 x64 mysql5.1
サーバB:RHEL6 x64 mysql5.1
サーバC:CentOS6 x64 mysql5.1

mysqlの細かいバージョンはCentOSだけ異なる。

サーバAで作ったホットバックアップをサーバBで起動
その後不要データを削除して、ホットバックアップ作成
サーバCでそれを起動・・・で、起動できない

結果だけ書いておくと、SELinuxのせいだった。

以下、確認したこと。

# service mysqld start
MySQL Daemon failed to start.
mysqld を起動中:                                           [失敗]

この時、/var/log/mysqld.logにログなし。
/var/lib/mysql以下にホスト名.errファイルなし。

別方法で起動を試す。

# /etc/init.d/mysqld start
MySQL Daemon failed to start.
mysqld を起動中:                                           [失敗]

またもエラーログなし。

別方法。

# bash -x /etc/init.d/mysqld start
+ . /etc/rc.d/init.d/functions
++ TEXTDOMAIN=initscripts
()
+ return 0
+ touch /var/lock/subsys/mysqld
+ return 0
+ exit 0

無事起動した。
ログを確認すると、サーバA, Bで起動するのと同じ感じ。
エラーは出ていない。
ログインにも成功。

また、以下でも起動に成功した。

# bash /etc/init.d/mysqld start
mysqld を起動中:                                           [  OK  ]
# sh /etc/init.d/mysqld start
mysqld を起動中:                                           [  OK  ]

/etc/init.d/mysqldファイルの先頭をちょっと変更(-x追加)して起動。

#!/bin/sh -x
# /etc/init.d/mysqld start
+ . /etc/rc.d/init.d/functions
++ TEXTDOMAIN=initscripts
()
+ return 1
+ return 1
+ exit 1

起動失敗。

/var/log/messagesを見ても関連するログは出ていなかった。
しばし考えた後、SELinuxが頭をよぎった。

# getenforce
Enforcing

利いている!

/var/log/audit/audit.logを見た。
my.cnfとか関係ありそうなものが出ている。

SELinuxの一時解除を実行。

# setenforce 0
# service mysqld start

起動した…。orz
こんな簡単なことだったとは…。

やはり、新しい環境になった時にはSELinux注意しないとハマる。

/etc/init.d/mysqldファイルを直接いじってしまったので、元に戻しておく。

bash -xから起動して成功した場合の出力と、スクリプト内に-xを追加して失敗した場合の出力を比較(diff -y)したので、貼り付けて置く。


# service mysqld start | # bash -x /etc/init.d/mysqld start
+ . /etc/rc.d/init.d/functions + . /etc/rc.d/init.d/functions
++ TEXTDOMAIN=initscripts ++ TEXTDOMAIN=initscripts
(略)
+ get_mysql_option mysqld datadir /var/lib/mysql + get_mysql_option mysqld datadir /var/lib/mysql
++ /usr/bin/my_print_defaults mysqld ++ /usr/bin/my_print_defaults mysqld
++ sed -n 's/^--datadir=//p' <
++ tail -n 1 ++ tail -n 1
> ++ sed -n 's/^--datadir=//p'
+ result=/var/lib/mysql + result=/var/lib/mysql
+ '[' -z /var/lib/mysql ']' + '[' -z /var/lib/mysql ']'
(略)
+ get_mysql_option mysqld socket /var/lib/mysql/mysql.sock + get_mysql_option mysqld socket /var/lib/mysql/mysql.sock
++ /usr/bin/my_print_defaults mysqld ++ /usr/bin/my_print_defaults mysqld
++ tail -n 1 <
++ sed -n 's/^--socket=//p' ++ sed -n 's/^--socket=//p'
> ++ tail -n 1
+ result=/var/lib/mysql/mysql.sock + result=/var/lib/mysql/mysql.sock
+ '[' -z /var/lib/mysql/mysql.sock ']' + '[' -z /var/lib/mysql/mysql.sock ']'
+ socketfile=/var/lib/mysql/mysql.sock + socketfile=/var/lib/mysql/mysql.sock
+ get_mysql_option mysqld_safe log-error /var/log/mysqld.log + get_mysql_option mysqld_safe log-error /var/log/mysqld.log
++ /usr/bin/my_print_defaults mysqld_safe <
++ sed -n 's/^--log-error=//p' ++ sed -n 's/^--log-error=//p'
++ tail -n 1 ++ tail -n 1
> ++ /usr/bin/my_print_defaults mysqld_safe
+ result=/var/log/mysqld.log + result=/var/log/mysqld.log
+ '[' -z /var/log/mysqld.log ']' + '[' -z /var/log/mysqld.log ']'
(略)
+ chown mysql:mysql /var/lib/mysql + chown mysql:mysql /var/lib/mysql
+ chmod 0755 /var/lib/mysql + chmod 0755 /var/lib/mysql
+ safe_pid=32729 | + safe_pid=401
+ ret=0 + ret=0
+ TIMEOUT=120 + TIMEOUT=120
(略)
+ RESPONSE='/usr/bin/mysqladmin: connect to server at '\''loc + RESPONSE='/usr/bin/mysqladmin: connect to server at '\''loc
error: '\''Can'\''t connect to local MySQL server through soc error: '\''Can'\''t connect to local MySQL server through soc
Check that mysqld is running and that the socket: '\''/var/li Check that mysqld is running and that the socket: '\''/var/li
grep -q 'Access denied for user' <
+ echo '/usr/bin/mysqladmin: connect to server at '\''localho + echo '/usr/bin/mysqladmin: connect to server at '\''localho
error: '\''Can'\''t connect to local MySQL server through soc error: '\''Can'\''t connect to local MySQL server through soc
Check that mysqld is running and that the socket: '\''/var/li Check that mysqld is running and that the socket: '\''/var/li
+ /bin/kill -0 32729 | + grep -q 'Access denied for user'
> + /bin/kill -0 401
+ sleep 1 + sleep 1
+ let TIMEOUT=120-1 + let TIMEOUT=120-1
+ '[' 119 -gt 0 ']' + '[' 119 -gt 0 ']'
++ /usr/bin/mysqladmin --socket=/var/lib/mysql/mysql.sock --u ++ /usr/bin/mysqladmin --socket=/var/lib/mysql/mysql.sock --u
+ RESPONSE='/usr/bin/mysqladmin: connect to server at '\''loc | + RESPONSE='mysqld is alive'
error: '\''Can'\''t connect to local MySQL server through soc <
Check that mysqld is running and that the socket: '\''/var/li <
error: '\''Can'\''t connect to local MySQL server through soc <
Check that mysqld is running and that the socket: '\''/var/li <
+ echo '/usr/bin/mysqladmin: connect to server at '\''localho <
error: '\''Can'\''t connect to local MySQL server through soc <
Check that mysqld is running and that the socket: '\''/var/li <
grep -q 'Access denied for user' <
+ /bin/kill -0 32729 <
+ echo 'MySQL Daemon failed to start.' <
MySQL Daemon failed to start. <
+ ret=1 <
+ break + break
+ '[' 119 -eq 0 ']' + '[' 119 -eq 0 ']'
+ '[' 1 -eq 0 ']' | + '[' 0 -eq 0 ']'
+ action 'mysqld を起動中: ' /bin/false | + action 'mysqld を起動中: ' /bin/true
+ local STRING rc + local STRING rc
+ STRING='mysqld を起動中: ' + STRING='mysqld を起動中: '
+ echo -n 'mysqld を起動中: ' + echo -n 'mysqld を起動中: '
mysqld を起動中: + shift mysqld を起動中: + shift
+ /bin/false | + /bin/true
+ failure 'mysqld を起動中: ' | + success 'mysqld を起動中: '
+ local rc=1 <
+ '[' color '!=' verbose -a -z '' ']' + '[' color '!=' verbose -a -z '' ']'
+ echo_failure | + echo_success
+ '[' color = color ']' + '[' color = color ']'
+ echo -en '\033[60G' + echo -en '\033[60G'
+ +
[+ '[' color = color ']' [+ '[' color = color ']'
+ echo -en '\033[0;31m' | + echo -en '\033[0;32m'
+ echo -n $'\345\244\261\346\225\227' | + echo -n ' OK '
失敗+ '[' color = color ']' | OK + '[' color = color ']'
+ echo -en '\033[0;39m' + echo -en '\033[0;39m'
+ echo -n ']' + echo -n ']'
]+ echo -ne '\r' ]+ echo -ne '\r'
+ return 1 | + return 0
+ '[' -x /bin/plymouth ']' | + return 0
+ /bin/plymouth --details | + rc=0
+ return 1 <
+ rc=1 <
+ echo + echo

+ return 1 | + return 0
+ return 1 | + touch /var/lock/subsys/mysqld
+ exit 1 | + return 0
> + exit 0

ところどころ、出力の順番が異なっているところがある。
そこが原因なんだろうか。

SELinux用に、mysqlディレクトリの設定を追加しておいた。

# restorecon -FRv /var/lib/mysql