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