web-dev-qa-db-ja.com

MariaDB 10 CentOS7の移動データディレクトリの問題

CentOS 7とMariaDB 10の新しい「最小」インストール。datadirに使用する追加のマウントされたミラーボリュームがあります。 my.cnf [mysqld]がコメントアウトされると、起動シーケンスは正常に完了し、正常に完了します。データをコピーしました。

Sudo cp -R -p /var/lib/mysql/* /mnt/mysql/

権限は元の権限と同じです。ボリュームは/ etc/fstabにあり、正常にマウントされます/dev/sdb1 /mnt/mysql xfs defaults 0 0

[root@femur mysql]# ls -la
total 110632
drwxr-xr-x. 5 mysql mysql     4096 Oct 20 15:27 .
drwxr-xr-x. 3 root  root        18 Oct 16 16:46 ..
-rw-rw----. 1 mysql mysql    16384 Oct 20 15:27 aria_log.00000001
-rw-rw----. 1 mysql mysql       52 Oct 20 15:27 aria_log_control
-rw-r-----. 1 mysql root      7005 Oct 20 13:49 femur.err
-rw-rw----. 1 mysql mysql 12582912 Oct 20 15:27 ibdata1
-rw-rw----. 1 mysql mysql 50331648 Oct 20 15:27 ib_logfile0
-rw-rw----. 1 mysql mysql 50331648 Oct 20 12:21 ib_logfile1
-rw-rw----. 1 mysql mysql        0 Oct 20 12:22 multi-master.info
drwx--x--x. 2 mysql mysql     4096 Oct 20 12:21 mysql
drwx------. 2 mysql mysql     4096 Oct 20 13:37 performance_schema
drwxr-xr-x. 2 mysql mysql        6 Oct 20 12:21 test

これはmy.cnfにあります

!includedir /etc/my.cnf.d
[mysqld]
log_error = /var/log/mysql-error.log
user = mysql
datadir = /mnt/mysql
socket = /mnt/mysql/mysql.sock

これは私がそれを始めようとしたときに私が得るものです...

'[root@femur mysql]# Sudo systemctl start mysql.service
Job for mysql.service failed. See 'systemctl status mysql.service' and 'journalctl -xn' for details.'

これらの2つのファイルはどちらも多くを語っていませんが、これは/var/log/mysql-error.logにあります。

141020 16:07:09 mysqld_safe Starting mysqld daemon with databases from /mnt/mysql
141020 16:07:09 [Warning] Can't create test file /mnt/mysql/femur.lower-test
141020 16:07:09 [Note] InnoDB: Using mutexes to ref count buffer pool pages
141020 16:07:09 [Note] InnoDB: The InnoDB memory heap is disabled
141020 16:07:09 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
141020 16:07:09 [Note] InnoDB: Memory barrier is not used
141020 16:07:09 [Note] InnoDB: Compressed tables use zlib 1.2.7
141020 16:07:09 [Note] InnoDB: Using Linux native AIO
141020 16:07:09 [Note] InnoDB: Using CPU crc32 instructions
141020 16:07:09 [Note] InnoDB: Initializing buffer pool, size = 128.0M
141020 16:07:09 [Note] InnoDB: Completed initialization of buffer pool
2014-10-20 16:07:09 7f6cb59c9880  InnoDB: Operating system error number 13 in a file operation.
InnoDB: The error means mysqld does not have the access rights to
InnoDB: the directory.
141020 16:07:09 [ERROR] InnoDB: os_file_get_status() failed on './ibdata1'. Can't determine file permissions
141020 16:07:09 [ERROR] InnoDB: The system tablespace must be writable!
141020 16:07:09 [ERROR] Plugin 'InnoDB' init function returned error.
141020 16:07:09 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
141020 16:07:09 [ERROR] mysqld: File '/mnt/mysql/aria_log_control' not found (Errcode: 13 "Permission denied")
141020 16:07:09 [ERROR] mysqld: Got error 'Can't open file' when trying to use aria control file '/mnt/mysql/aria_log_control'
141020 16:07:09 [ERROR] Plugin 'Aria' init function returned error.
141020 16:07:09 [ERROR] Plugin 'Aria' registration as a STORAGE ENGINE failed.
141020 16:07:09 [Note] Plugin 'FEEDBACK' is disabled.
141020 16:07:09 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
141020 16:07:09 [ERROR] Unknown/unsupported storage engine: InnoDB
141020 16:07:09 [ERROR] Aborting

141020 16:07:09 [Note] /usr/sbin/mysqld: Shutdown complete

141020 16:07:09 mysqld_safe mysqld from pid file /mnt/mysql/femur.pid ended

http://www.reddit.com/r/linuxadmin/comments/2ebhpf/adventures_in_moving_mariadb_data_folder/ 少し役に立ちましたが、動作させることができませんでした。

どんな助けでも大歓迎です。

11
RichR

問題は確かにSELinuxです。 MariaDB/MySQLがCentOS7で起動する前に、次の3つのことを行う必要があります。

  1. User:groupがmysql:mysqlであることを確認します
  2. SELinuxタグをmysqld_db_tに設定します
  3. SELinuxユーザーをsystem_uに設定します

これは次のように簡単です。

chcon -Rt mysqld_db_t /database/db
chcon -Ru system_u /database/db
chown -R mysql:mysql /database/db

ディスクを接続した後に必要なことはすべて以下のとおりです。

cfdisk /dev/sdb
pvcreate /dev/sdb1
vgcreate database /dev/sdb1
lvcreate -l 100%FREE -n db database
mkfs.ext4 /dev/database/db
mkdir /database
mount /database
mkdir /database/db
chcon -Rt mysqld_db_t /database/db
chcon -Ru system_u /database/db
chown -R mysql:mysql /database/db
systemctl start mariadb
24
J.C.

まあそれは面白かった...

CentOS 7が「最小限」でSELinuxをインストールしていることが判明しました。これにより、mysqlがマウントされたミラーセットに書き込むことができなかったようです。考えもしなかったかもしれないセキュリティアイテムを探していたところ、ドキュメントですぐに見つかりました。私は以前、SELinuxはモジュールではなくディストリビューションであると(明らかに誤って)考えていました。テストを実行して、そこにあるかどうかを確認しました。

getenforce

テストのために一時的に無効にしました。

setenforce 0

最後に、ミラーセットのディレクトリをdatadirとしてMariaDBを起動でき、エラーは発生しませんでした。この変更を永続的にするには(このサーバーがファイアウォールの背後にあるため)、/ etc/selinux/configに、

- SELINUX=enforcing
+ SELINUX=disabled

これが他の誰かの役に立つことを願っています。すてきな一日を!

6
RichR

このステップバイステップガイドが機能していることがわかりました:https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/SELinux_Users_and_Administrators_Guide/sect -Managing_Confined_Services-MariaDB-Configuration_Examples.html

インストールする必要があります: 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

Mariadb.serviceのジョブが失敗しました。詳細については、「systemctl status postgresql.service」および「journalctl -xn」を参照してください。

ただし、監査デーモンが実行されていて、setroubleshootサービスを使用している場合、拒否は代わりに/var/log/audit/audit.logファイルに記録されます。SELinuxは/で/ usr/libexec/mysqldの「書き込み」アクセスを防止しています。 mysql。完全なSELinuxメッセージの場合。シーラート-lb3f01aff-7fa6-4ebe-ad46-abaef6f8ad71を実行します

この拒否の理由は、/ mysql /がMariaDBデータファイルに対して正しくラベル付けされていないためです。 SELinuxは、MariaDBがusr_tというラベルの付いたコンテンツにアクセスできないようにします。この問題を解決するには、次の手順を実行します。

次のコマンドを実行して、/ mysql /のコンテキストマッピングを追加します。 semanageutilityはデフォルトではインストールされないことに注意してください。システムにない場合は、policycoreutils-pythonpackageをインストールします。

**~]# 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の正しいコンテキストでラベル付けされたので、mysqldstarts:

~]# systemctl start mariadb.service

/ mysql /のコンテキストが変更されたことを確認します。

~]$ ls -lZ /mysql
drwxr-xr-x. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql

場所が変更され、ラベルが付けられ、mysqldが正常に開始されました。この時点で、実行中のすべてのサービスをテストして、正常な動作を確認する必要があります。

0
Milan Rakos