Linux の使い方: MySQL の datadir を標準以外に変更すると起動できなくなる場合 (CentOS 5.4)


MySQL のデータベース保存場所を変更する

CentOS 5.4 上で稼働している MySQLで、データベースの保存場所を既定の /var/lib/mysql から別の場所に変更すると、次のエラーが表示されて MySQL が起動できなくなる場合がありました。

Timeout error occurred trying to start MySQL Daemon.

エラーログ "/var/log/mysql.log" を確認すると、次のエラーが記録されていました。

100202 12:39:22 mysqld started

100202 12:39:22 [Warning] Can't create test file /home/mysql/myhost.lower-test

100202 12:39:22 [Warning] Can't create test file /home/mysql/myhost.lower-test

^G/usr/libexec/mysqld: Can't change dir to '/home/mysql/' (Errcode: 13)

100202 12:39:22 [ERROR] Aborting

 

100202 12:39:22 [Note] /usr/libexec/mysqld: Shutdown complete

 

100202 12:39:22 mysqld ended

これは SELinux というセキュリティーポリシーによってアクセス制御がされているために発生するもののようでした。

他にも "socket" の値を "/var/lib/mysql/mysql.sock" から変更した場合にも、同様に SELinux の影響により似たような症状が発生する場合があります。

 

SELinux を設定するためには、"setenforce 0" を実行して SELinux を Permissive モードで起動した上で、MySQL を起動させます。

すると、SELinux の影響で起動できなくなっている場合には正しく動作するようになるので、まずは次のようにして MySQL がどの SELinux ドメインで実行されているかを確認します。

ps -eZ | grep mysqld

これで、出力結果の ":" で区切られた 3 番目の内容から、MySQL (mysqld) が "mysqld_t" ドメイン内で動作していることが分かります。

後はこのドメインに対して適切な許可を追加することになります。

 

試してみた感じでは、以下の許可設定を追加すれば起動することができるようになりました。

allow mysqld_t file_t:dir { write search read remove_name getattr add_name };
allow mysqld_t file_t:file { write getattr read lock create unlink };
allow mysqld_t file_t:sock_file { create unlink };
allow mysqld_t tmp_t:sock_file create;
allow mysqld_t var_lib_t:sock_file create;

もしかすると他にも、運用の中で必要となる許可設定が出てくるかもしれません。それぞれのパスの中での関係ファイルの取り扱いについて、SELinux の許可設定を行う必要があるようですので、設定ファイル内のパスに応じても上記内容は変わってくる感じでした。

なお、SELinux の設定方法については Linux のセキュリティ設定 (SELinux) の方に記してありますので、そちらを参考にしてください。