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

Posted on 2014/01/05

ToC

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

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 を起動中: [失敗]

SELinuxの設定を変更

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

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の状況を確認してみます。 PermissiveDisabledであれば、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にも接続できました。データのディレクトリも変更できました。 ただ、コマンドが多い記事になってしまいました。