CentOS6.4でMySQLのポートを変更するときにはまった

MySQLのポート変更は通常の手順で行くとWindowsもLinuxもあまり変わらないはずで
my.cnfを書き換えてファイアウォールの設定を行うだけ。

Linuxの場合大抵下記のように紹介されてる。

mysqlを終了しておく

# service mysql stop

/etc/my.cnfを書き換えする

# editra /etc/my.cnf
# 下記追加か書き換え
port=3307

ファイアウォールでポートを解放する。

# editra /etc/sysconfig/iptables
# 下記追加 --dportの次の数字を解放したいポートに設定する
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3307 -j ACCEPT

ファイアウォールを再起動

# /etc/init.d/iptables restart

mysqlを開始する

# service mysql start

しかし、CentOS6.4環境では下記エラーが出てMySQLの起動が失敗する

Starting MySQL... ERROR! The server quit without updating PID file (/var/lib/mysql/localhost.localdomain.pid).

MySQLのログを確認すると何やらTCP/IPのPortの権限がないとか書かれている

2013-06-23 18:35:09 5356 [ERROR] Can't start server: Bind on TCP/IP port: Permission denied
2013-06-23 18:35:09 5356 [ERROR] Do you already have another mysqld server running on port: 6000 ?
2013-06-23 18:35:09 5356 [ERROR] Aborting

色々調べても日本語のサイトじゃ情報収集できなく結局下記のオラクル社員のブログ?で情報発見した。
https://blogs.oracle.com/jsmyth/entry/selinux_and_mysql

CentOSにはSELinuxというセキュリティーポリシーのプログラムがあるらしく
こいつが色々と邪魔してた
結果からいくとこうすることで解決できた。

# setenforce 0
# service mysql start
Starting MySQL.. SUCCESS! 
# netstat -nlp | grep 3307
tcp        0      0 :::3307                     :::*                        LISTEN      5772/mysqld

正確に言うと邪魔しているのではなく余計なポートを使わせないようにしているみたいだけど
セキュリティ考えて標準ポートから変えたいんだよね
でもsetenforce 0して逆にセキュリティにあんまりよろしくないのかもしれない

あと同ページには/datadirの権限についてのエラーも書いてあるからもしかしたらデフォルトの設定ではエラー出るかも、まぁ、出たらこれ思い出してもう一度読み直そう
(英語ページ読むのって疲れるんだよねw)

完全にCentOSというかLinuxの知識不足が露呈した一件でした。