web-dev-qa-db-fra.com

MariaDB 10 CentOS 7 remue les problèmes de datadir

Nouvelle installation "minimale" de CentOS 7 avec MariaDB 10. Je dispose d’un volume supplémentaire en miroir monté que je souhaite utiliser pour le datadir. La séquence de démarrage est correcte et se termine normalement lorsque my.cnf [mysqld] est mis en commentaire. J'ai copié les données ..

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

Les autorisations sont identiques à celles de l'original. Le volume est dans/etc/fstab et monte bien /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

c'est dans 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

C'est ce que je reçois quand j'essaie de le démarrer ...

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

Aucun de ces deux fichiers n'en dit long, mais c'est dans /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/ m'a un peu aidé, mais je n'ai pas réussi à le faire fonctionner.

Toute aide serait grandement appréciée.

8
RichR

Le problème est bien SELinux; vous devez faire trois choses avant que MariaDB/MySQL ne démarre sur CentOS 7:

  1. Assurez-vous que l'utilisateur: le groupe est mysql:mysql
  2. Définissez la balise SELinux sur mysqld_db_t
  3. Définissez l'utilisateur SELinux sur system_u

C'est aussi simple que:

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

Voici ce que je devais faire après avoir branché un disque:

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.

Eh bien c'était intéressant ...

Il s’avère que CentOS 7 "minimal" installe SELinux, ce qui empêchait apparemment mysql d’écrire sur l’ensemble monté en miroir. Je cherchais des éléments de sécurité auxquels je n'aurais peut-être pas pensé et les ai trouvés dans la documentation. J'avais déjà pensé (évidemment à tort) que SELinux était une distribution, pas un module. Une fois, j'ai fait le test pour voir s'il était là ....

getenforce

Je l'ai temporairement désactivé pour tester.

setenforce 0

Enfin, j'ai pu démarrer MariaDB avec le répertoire du jeu en miroir comme datadir et aucune erreur. Pour rendre cette modification permanente (car ce serveur est derrière un pare-feu), dans/etc/selinux/config, j’ai fait

- SELINUX=enforcing
+ SELINUX=disabled

J'espère que ça aidera quelqu'un d'autre. Passez une bonne journée!

5
RichR

J'ai trouvé ce guide pas à pas qui fonctionnait pour moi: https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/SELinux_Users_and_Administrators_Guide/sect-Managing_Confined_Services_MonDB .html

Vous devez installer: yum install policycoreutils-python

Guide:

Affichez le contexte SELinux de l'emplacement de base de données par défaut pour mysql:

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

Cela montre mysqld_db_t qui est l'élément de contexte par défaut pour l'emplacement des fichiers de base de données. Ce contexte devra être appliqué manuellement au nouvel emplacement de la base de données qui sera utilisé dans cet exemple pour qu'il fonctionne correctement.

Arrêtez le démon mysqld:

~]# systemctl stop mariadb.service

Créez un nouveau répertoire pour le nouvel emplacement de la ou des bases de données. Dans cet exemple,/mysql/est utilisé:

~]# mkdir -p /mysql

Copiez les fichiers de base de données de l'ancien emplacement vers le nouvel emplacement:

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

Modifiez la propriété de cet emplacement pour permettre l'accès à l'utilisateur et au groupe mysql. Ceci définit les autorisations Unix traditionnelles que SELinux respectera toujours:

~]# chown -R mysql:mysql /mysql

Exécutez la commande suivante pour voir le contexte initial du nouveau répertoire:

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

Le contexte usr_t de ce répertoire nouvellement créé ne convient pas actuellement à SELinux en tant qu'emplacement pour les fichiers de base de données MariaDB. Une fois le contexte modifié, MariaDB pourra fonctionner correctement dans ce domaine.

Ouvrez le fichier de configuration principal de MariaDB /etc/my.cnf avec un éditeur de texte et modifiez l’option datadir afin qu’elle fasse référence au nouvel emplacement. Dans cet exemple, la valeur à entrer est/mysql:

[mysqld]
datadir=/mysql

Enregistrez ce fichier et quittez.

Démarrer mysqld. Le service ne devrait pas pouvoir démarrer et un message de refus sera consigné dans le fichier/var/log/messages:

~]# systemctl start mariadb.service

La tâche pour mariadb.service a échoué. Voir 'systemctl status postgresql.service' et 'journalctl -xn' pour plus de détails.

Cependant, si le démon d'audit est en cours d'exécution et avec lui le service setroubleshoot, le refus sera consigné dans le fichier /var/log/audit/audit.log à la place: SELinux empêche/usr/libexec/mysqld l'accès "write" sur/mysql. Pour des messages SELinux complets. exécuter sealert -l b3f01aff-7fa6-4ebe-ad46-abaef6f8ad71

La raison de ce refus est que/mysql/n'est pas correctement étiqueté pour les fichiers de données MariaDB. SELinux empêche MariaDB d’avoir accès au contenu étiqueté usr_t. Effectuez les étapes suivantes pour résoudre ce problème:

Exécutez la commande suivante pour ajouter un mappage de contexte pour/mysql /. Notez que semanageutility n'est pas installé par défaut. S'il manque sur votre système, installez le paquetage policycoreutils-python.

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

Ce mappage est écrit dans le fichier /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

Maintenant, utilisez l'utilitaire restorecon pour appliquer ce mappage de contexte au système en cours d'exécution:

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

Maintenant que l'emplacement/mysql/a été étiqueté avec le contexte correct pour MariaDB, mysqldstarts:

~]# systemctl start mariadb.service

Confirmez que le contexte a changé pour/mysql /:

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

L'emplacement a été modifié et étiqueté, et mysqld a démarré avec succès. À ce stade, tous les services en cours d'exécution doivent être testés pour confirmer le fonctionnement normal.

0
Milan Rakos