MySQLのデータディレクトリ変更

CentOSにインストールされているMySQLを利用していますが、少し前に流行したビックデータの絡みもあってデータ容量が徐々に増えつつあります。
そこで、大容量のディスクを追加して、データディレクトリを新しいディスクに変更しようと思います。インターネットを調べる限りでは、/etc/mysql/my.cnfに設定している「datadir」のパスを変更するだけで良いみたいなので軽い気持ちではじめました。

まず、はじめにmysqldのサービスを停止して、新たなディスク上のmysqlのデータディレクトリ/home1/mysqlに既存のデータを移動します。(実際に作業する際には、念のためコピーして元のディレクトリの名前を変更しておきました。)
そして、/etc/mysql/my.cnfの「datadir」と「socket」の設定値の内容を新しいデータディレクトリに変更します。

[mysqld]
#元の設定値
#datadir=/var/lib/mysql
#socket=/var/lib/mysql/mysql.sock

#新しい設定値
datadir=/home1/mysql
socket=/home1/mysql/mysql.sock

user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

変更後にサービスの再起動をして、めでたしめでたし。。。となるはずだったのですが、コンソールをみてみると失敗。

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

これだけでは、うまくいかないようです。
ログを確認してみると、ディレクトリを変更できないと出力はされているので設定ファイルの内容は読んでいるようですが、なんか別の理由でエラーとなっているようです。

mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
[Warning] Can't create test file /var/lib/mysql/localhost.lower-test
[Warning] Can't create test file /var/lib/mysql/localhost.lower-test
/usr/libexec/mysqld: Can't change dir to '/var/lib/mysql/' (Errcode: 13)

[ERROR] Aborting

[Note] /usr/libexec/mysqld: Shutdown complete
mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended

原因もよくわからず、インターネットを探していたところやっと見つけました。
どうやらSELinuxが関係しているようです。
Change the default MySQL data directory with SELinux enabled

あまりよくわからないながらも、早速、SELinuxの状況を確認してみます。
“Permissive”か“Disabled”であれば、SELinuxの制限に引っかからないようなのですが、“Enforcing”とのことなので関係がありそうです。

[root@localhost ~]# getenforce
Enforcing

続けて、semanage fcontext コマンドで、ファイルの SELinux コンテキストを変更します。semanage fcontext コマンドを使うことで、ファイルシステムが再ラベル付けされた際にも永続的に設定が有効になるようです。

[root@localhost ~]# semanage fcontext -a -t mysqld_db_t "/home1/mysql(/.*)?"
bash: semanage: コマンドが見つかりません

利用したサーバーには、コマンドがないとのことなのでインストールが必要です。
調べた限りでは、policycoreutils-pythonというパッケージに入っているようなので、こちらを導入してみます。

[root@localhost ~]# whereis semanage
semanage:

[root@localhost ~]# yum provides *bin/semanage
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
 * base: mirrors.neusoft.edu.cn
 * extras: mirrors.neusoft.edu.cn
 * updates: mirror.fairway.ne.jp
extras/filelists_db                                                            |  11 kB     00:00     
mongodb/filelists                                                              | 4.7 kB     00:00     
updates/filelists_db                                                           | 649 kB     00:02     
policycoreutils-python-2.0.83-19.39.el6.x86_64 : SELinux policy core python utilities
Repo        : base
Matched from:
Filename    : /usr/sbin/semanage

[root@localhost ~]# yum install policycoreutils-python

インストール完了後に気を取り直して再度、semanage fcontext コマンドを実行します。
今度は問題なくコマンドが通ったので、最後にrestoreconを実行します。
十数行の標準出力が流れた後、問題なく終了したのでおそらく大丈夫でしょう。

[root@localhost ~]# semanage fcontext -a -t mysqld_db_t "/home1/mysql(/.*)?"
[root@localhost ~]# restorecon -Rv /opt/mysql

mysqlのサービスを起動すると、今度は成功です。

[root@localhost ~]# service mysqld start
mysqld を起動中:                                     [  OK  ]

正直なところ、予想より手こずりました。これ全然、簡単じゃないじゃん。。。。
そして、mysqlに接続しようとすると・・・

[root@localhost ~]# mysql -u root -p
Enter password: 
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

また、エラーかよ。
どうやら、クライアントの接続設定も/etc/mysql/my.cnfに必要なようです。

[mysqld]
datadir=/home1/mysql
socket=/home1/mysql/mysql.sock

user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

###追加した設定
[client]
socket = /home1/mysql/mysql.sock

これでようやく、mysqlにも接続できました。データのディレクトリも変更できました。
ただ、コマンドが多い記事になってしまいました。