it-swarm.com.de

MariaDB 10 CentOS 7 bewegt Datenweh

Brandneue "Minimal" -Installation von CentOS 7 zusammen mit MariaDB 10. Ich habe ein zusätzliches bereitgestelltes gespiegeltes Volume, das ich für den Datadir verwenden möchte. Die Startsequenz ist in Ordnung und wird normal beendet, wenn my.cnf [mysqld] auskommentiert wird. Ich habe die Daten kopiert ..

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

Die Berechtigungen sind identisch mit denen des Originals. Das Volume befindet sich in/etc/fstab und ist in Ordnung. /dev/sdb1 /mnt/mysql xfs defaults 0 0

[[email protected] 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

das ist in 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

Das bekomme ich, wenn ich versuche, es zu starten ...

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

Keine dieser beiden Dateien sagt viel aus, aber dies befindet sich in /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/ hat ein bisschen geholfen, aber ich konnte es nicht zum Laufen bringen.

Jede Hilfe wäre sehr dankbar.

8
RichR

Das Problem ist in der Tat SELinux; Sie müssen drei Dinge tun, bevor MariaDB/MySQL unter CentOS 7 gestartet wird:

  1. Stellen Sie sicher, dass die Gruppe user: mysql:mysql ist.
  2. Setzen Sie das SELinux-Tag auf mysqld_db_t
  3. Setzen Sie den SELinux-Benutzer auf system_u

Das ist so einfach wie:

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

Die ganze Sache, die ich tun musste, nachdem ich eine Diskette eingesteckt hatte, ist unten:

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
21
J.C.

Na das war ja interessant ...

Es stellte sich heraus, dass CentOS 7 "minimal" SELinux installiert, was anscheinend mysql daran hinderte, auf das gemountete gespiegelte Set zu schreiben. Ich suchte nach Sicherheitselementen, an die ich möglicherweise nicht gedacht habe, und fand sie genau dort in den Dokumenten. Ich hatte vorher (offensichtlich fälschlicherweise) gedacht, SELinux sei eine Distribution, kein Modul. Einmal habe ich den Test durchgeführt, um zu sehen, ob er da war ...

getenforce

Ich habe es vorübergehend deaktiviert, um es zu testen.

setenforce 0

Schließlich konnte ich MariaDB mit dem Verzeichnis in der gespiegelten Gruppe als Datadir und ohne Fehler starten. Um diese Änderung dauerhaft zu machen (da sich dieser Server hinter einer Firewall befindet), habe ich in/etc/selinux/config eine Änderung vorgenommen

- SELINUX=enforcing
+ SELINUX=disabled

Ich hoffe das hilft jemand anderem. Ich wünsche ihnen einen wunderbaren Tag!

5
RichR

Ich habe festgestellt, dass diese schrittweise Anleitung für mich funktioniert: https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/SELinux_Users_and_Administrators_Guide/sect-Managing_Confined_Services-MariaDB-C .html

Sie müssen Folgendes installieren: yum install policycoreutils-python

Anleitung:

Zeigen Sie den SELinux-Kontext des Standard-Datenbankverzeichnisses für mysql an:

~]# ls -lZ /var/lib/mysql
drwx------. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql

Dies zeigt mysqld_db_t, das das Standardkontextelement für den Speicherort von Datenbankdateien ist. Dieser Kontext muss manuell auf den neuen Datenbankspeicherort angewendet werden, der in diesem Beispiel verwendet wird, damit er ordnungsgemäß funktioniert.

Stoppen Sie den mysqld-Daemon:

~]# systemctl stop mariadb.service

Erstellen Sie ein neues Verzeichnis für den neuen Speicherort der Datenbank (en). In diesem Beispiel wird/mysql/verwendet:

~]# mkdir -p /mysql

Kopieren Sie die Datenbankdateien vom alten Speicherort an den neuen Speicherort:

~]# cp -R /var/lib/mysql/* /mysql/

Ändern Sie den Besitz dieses Speicherorts, um den Zugriff durch den MySQL-Benutzer und die Gruppe zuzulassen. Dies legt die traditionellen Unix-Berechtigungen fest, die SELinux weiterhin beachtet:

~]# chown -R mysql:mysql /mysql

Führen Sie den folgenden Befehl aus, um den ursprünglichen Kontext des neuen Verzeichnisses anzuzeigen:

~]# ls -lZ /mysql
drwxr-xr-x. mysql mysql unconfined_u:object_r:usr_t:s0   mysql

Der Kontext usr_t dieses neu erstellten Verzeichnisses eignet sich derzeit nicht für SELinux als Speicherort für MariaDB-Datenbankdateien. Sobald der Kontext geändert wurde, kann MariaDB in diesem Bereich ordnungsgemäß funktionieren.

Öffnen Sie die MariaDB-Hauptkonfigurationsdatei /etc/my.cnf mit einem Texteditor und ändern Sie die Option datadir so, dass sie auf den neuen Speicherort verweist. In diesem Beispiel sollte der Wert/mysql eingegeben werden:

[mysqld]
datadir=/mysql

Speichern Sie diese Datei und beenden Sie sie.

Starten Sie mysqld. Der Dienst kann nicht gestartet werden, und eine Ablehnungsnachricht wird in der Datei/var/log/messages protokolliert:

~]# systemctl start mariadb.service

Auftrag für mariadb.service fehlgeschlagen. Weitere Informationen finden Sie unter 'systemctl status postgresql.service' und 'journalctl -xn'.

Wenn jedoch der Audit-Daemon ausgeführt wird und mit ihm der Fehlerbehebungsdienst ausgeführt wird, wird die Ablehnung stattdessen in der Datei /var/log/audit/audit.log protokolliert: SELinux verhindert/usr/libexec/mysqld den Schreibzugriff auf/MySQL. Für vollständige SELinux-Nachrichten. Führen Sie sealert -l b3f01aff-7fa6-4ebe-ad46-abaef6f8ad71 aus

Der Grund für diese Ablehnung ist, dass/mysql/für MariaDB-Datendateien nicht korrekt gekennzeichnet ist. SELinux verhindert, dass MariaDB auf den mit usr_t gekennzeichneten Inhalt zugreifen kann. Führen Sie die folgenden Schritte aus, um dieses Problem zu beheben:

Führen Sie den folgenden Befehl aus, um eine Kontextzuordnung für/mysql/hinzuzufügen. Beachten Sie, dass die Semanageutility nicht standardmäßig installiert ist. Wenn es auf Ihrem System fehlt, installieren Sie das policycoreutils-pythonpackage.

**~]# semanage fcontext -a -t mysqld_db_t "/mysql(/.*)?"**

Diese Zuordnung wird in die Datei /etc/selinux/targeted/contexts/files/file_contexts.local geschrieben:

~]# grep -i mysql /etc/selinux/targeted/contexts/files/file_contexts.local

/mysql(/.*)? system_u: object_r: mysqld_db_t: s0

Verwenden Sie jetzt das Dienstprogramm restorecon, um diese Kontextzuordnung auf das ausgeführte System anzuwenden:

**~]# restorecon -R -v /mysql**

Nachdem das Verzeichnis/mysql/mit dem korrekten Kontext für MariaDB gekennzeichnet wurde, startet mysqldstarts:

~]# systemctl start mariadb.service

Bestätigen Sie, dass sich der Kontext für/mysql/geändert hat:

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

Der Speicherort wurde geändert und beschriftet, und mysqld wurde erfolgreich gestartet. Zu diesem Zeitpunkt sollten alle ausgeführten Dienste getestet werden, um den normalen Betrieb zu bestätigen.

0
Milan Rakos