CentOSとcPanelを使用しています。私のサーバーでは、すべてのMySQLデータベースが/var/lib/mysql
に保存されます。現在、/var
は100%使用されており、MySQLは動作を停止しています。特にこのサーバーがcPanelで管理されていることを考慮して、データベースを/home/mysql
などの新しいディレクトリに移動するにはどうすればよいですか?
アクセス権がないため、cpanelからこれを確認できませんが、これはsshとSudoによってrootに接続されたコンソールからの例です。シンボリックリンクの代わりに/ etc/fstabにバインドエントリを使用するための引数がありますが、これは私にとってはうまくいきます。
私の通常の手順は、mysqlを停止し、ディレクトリの内容を移動し、オリジナルをリンクして、mysqldを再起動することです。
[tomh@workstation001 ~]$ Sudo su -
[root@workstation001 ~]#
[root@workstation001 ~]# service mysqld stop
Stopping mysqld (via systemctl):
[ OK ]
[root@workstation001 ~]# mv /var/lib/mysql/ /opt/
[root@workstation001 ~]# ln -s /opt/mysql /var/lib/
[root@workstation001 ~]# ls -la /var/lib/mysql
lrwxrwxrwx 1 root root 10 Feb 26 23:02 /var/lib/mysql -> /opt/mysql
[root@workstation001 ~]# service mysqld start
Starting mysqld (via systemctl): [ OK ]
[root@workstation001 ~]# mysql -uroot
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.18-log MySQL Community Server (GPL)
mysql> show databases;
...
| Database |
+-----------------------+
| information_schema |
| mysql |
| performance_schema |
| test
似たような質問に気づきました。これは複製に近いもので、selinuxを有効にして上記を実行する際のいくつかの問題に言及しています。 http://crashmag.net/change-the-default-mysql-data-directory-with-selinux-enabled
したがって、selinuxを使用している場合は、いくつかの追加手順があります。
mysql
データディレクトリを変更する場合は、mysql構成ファイルを編集してdatadir
値を変更する必要があります。
datadir = /home/user/data
新しいデータディレクトリ[〜#〜] must [〜#〜]はmysql
が所有し、適切なセキュリティコンテキストを持っています。
chown -R mysql.mysql /home/user/data
chcon -R -t mysqld_db_t /home/user/data
mySQLサーバーを再起動します
/etc/init.d/mysqld restart
私は this 段階的なガイドが私のために働いていることを発見しました。
インストールする必要があります:
yum install policycoreutils-python
ガイド:
Mysqlのデフォルトのデータベースの場所のSELinuxコンテキストを表示します。
~]# ls -lZ /var/lib/mysql
drwx------. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql
これは、データベースファイルの場所のデフォルトのコンテキスト要素であるmysqld_db_t
を示しています。このコンテキストは、正しく機能するために、この例で使用される新しいデータベースの場所に手動で適用する必要があります。
Mysqldデーモンを停止します。
~]# systemctl stop mariadb.service
データベースの新しい場所に新しいディレクトリを作成します。この例では、/ mysql /が使用されています。
~]# mkdir -p /mysql
データベースファイルを古い場所から新しい場所にコピーします。
~]# cp -R /var/lib/mysql/* /mysql/
この場所の所有権を変更して、mysqlユーザーおよびグループによるアクセスを許可します。これにより、SELinuxが引き続き監視する従来のUnix権限が設定されます。
~]# chown -R mysql:mysql /mysql
次のコマンドを実行して、新しいディレクトリの初期コンテキストを確認します。
~]# ls -lZ /mysql
drwxr-xr-x. mysql mysql unconfined_u:object_r:usr_t:s0 mysql
この新しく作成されたディレクトリのコンテキストusr_tは、現時点ではMariaDBデータベースファイルの場所としてのSELinuxには適していません。コンテキストが変更されると、MariaDBはこの領域で適切に機能できるようになります。
メインのMariaDB構成ファイル/etc/my.cnf
をテキストエディターで開き、datadir
オプションを変更して新しい場所を参照するようにします。この例では、入力する必要がある値は/mysql
です。
[mysqld]
datadir=/mysql
このファイルを保存して終了します。
mysqld
を起動します。サービスの開始に失敗し、拒否メッセージが/var/log/messages
ファイルに記録されます。
~]# systemctl start mariadb.service
Job for mariadb.service failed. See 'systemctl status postgresql.service' and 'journalctl -xn' for details.
ただし、監査デーモンが実行されており、setroubleshoot
サービスを使用している場合、拒否は代わりに/var/log/audit/audit.log
ファイルに記録されます。
SELinux is preventing `/usr/libexec/mysqld` "write" access on /mysql. For complete SELinux messages. run `sealert -l b3f01aff-7fa6-4ebe-ad46-abaef6f8ad71`
この拒否の理由は、mysqlがMariaDBデータファイルに対して正しくラベル付けされていないためです。 SELinuxは、MariaDBがusr_t
というラベルの付いたコンテンツにアクセスできないようにします。この問題を解決するには、次の手順を実行します。
次のコマンドを実行して、mysqlのコンテキストマッピングを追加します。 semanageutility
はデフォルトではインストールされないことに注意してください。システムにない場合は、policycoreutils-python
パッケージをインストールしてください。
~]# semanage fcontext -a -t mysqld_db_t "/mysql(/.*)?"
このマッピングは/etc/selinux/targeted/contexts/files/file_contexts.local
ファイルに書き込まれます:
~]# grep -i mysql /etc/selinux/targeted/contexts/files/file_contexts.local
/mysql(/.*)? system_u:object_r:mysqld_db_t:s0
次に、restorecon
ユーティリティを使用して、このコンテキストマッピングを実行中のシステムに適用します。
~]# restorecon -R -v /mysql
mysqlの場所がMariaDBの正しいコンテキストでラベル付けされたので、mysqldが開始します。
~]# systemctl start mariadb.service
mysqlのコンテキストが変更されたことを確認します。
~]$ ls -lZ /mysql
drwxr-xr-x. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql
場所が変更され、ラベルが付けられ、mysqld
が正常に開始されました。この時点で、実行中のすべてのサービスをテストして、正常な動作を確認する必要があります。