2014-10-20 16 views
6

Nuova installazione "minima" di CentOS 7 insieme a MariaDB 10. Dispongo di un volume mirroring aggiuntivo che desidero utilizzare per il datadir. La sequenza di avvio è corretta e completa normalmente quando my.cnf [mysqld] è commentato. Ho copiato i dati ..MariaDB 10 CentOS 7 guai di datadir in movimento

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

Le autorizzazioni sono identiche a quelle dell'originale. Il volume è in/etc/fstab e monta bene /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 

questo è 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 

Questo è ciò che ottengo quando provo ad avviarlo ...

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

Nessuna di queste due file dice molto, ma questo è 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/ aiutato un po ', ma non ero in grado di farlo funzionare.

Qualsiasi aiuto sarebbe molto apprezzato.

risposta

6

Bene che è stato interessante ...

si scopre, che CentOS 7 "minimal" installa SELinux, che a quanto pare impediva mysql dalla scrittura al set di mirroring montato. Stavo cercando articoli di sicurezza che potrei non aver pensato e trovato proprio lì nei documenti. In precedenza avevo pensato (ovviamente erroneamente) che SELinux fosse una distribuzione, non un modulo. Una volta eseguito il test per verificare se fosse presente ...

getenforce 

L'ho temporaneamente disabilitato per il test.

setenforce 0 

Infine, sono stato in grado di iniziare MariaDB con la directory nel set di mirroring come datadir e nessun errore. Per rendere questo cambiamento permanente (perché questo server è protetto da un firewall), in/etc/selinux/config, ho fatto

- SELINUX=enforcing 
+ SELINUX=disabled 

Spero che questo aiuta a qualcun altro. Vi auguro una buona giornata!

+1

Capisco che potresti trovarti dietro un firewall ... Ma perché dovresti disabilitare una funzionalità di sicurezza, in particolare una directory di database. È davvero semplice come cambiare alcune autorizzazioni. –

16

Il problema è in effetti SELinux; è necessario fare tre cose prima di MariaDB/MySQL avrà inizio su CentOS 7:

  1. Assicurarsi che l'utente: gruppo è mysql:mysql
  2. Impostare il tag SELinux per mysqld_db_t
  3. Impostare l'utente SELinux per system_u

Questo è semplice come:

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

Il w buco cosa avevo bisogno di fare dopo aver collegato un disco è qui sotto:

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 
+0

Questa è la vera risposta. Tutti gli altri dicono semplicemente disabilitare selinux .... Perché dovresti fare una cosa del genere? –

+0

Su Fedora 23 la cartella del database viene rinominata all'avvio mariadb e occorre aggiungere una regola di etichettatura. 'sudo semanage fcontext --add --type mysqld_db_t"/database/db (/.*)? "' –

+0

soluzione perfetta. Grazie! – ytll21

0

ho trovato questa guida passo passo lavorando per me: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

È necessario installare: yum install policycoreutils- python

Guida:

Vedere le contesto di SELinux della posizione del database predefinito per MySQL:

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

Questo dimostra mysqld_db_t che è l'elemento contesto predefinito per la posizione del file di database. Questo contesto dovrà essere applicato manualmente al nuovo percorso del database che verrà utilizzato in questo esempio affinché funzioni correttamente.

arrestare il demone mysqld:

~]# systemctl stop mariadb.service 

creare una nuova directory per la nuova posizione del database (s). In questo esempio,/mysql/viene utilizzato:

~]# mkdir -p /mysql 

Copiare i file di database dalla vecchia posizione alla nuova posizione:

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

Cambiare la proprietà di questa posizione per consentire l'accesso da parte dell'utente mysql e gruppo. Questa imposta le autorizzazioni Unix tradizionali che SELinux sarà ancora osservare:

~]# chown -R mysql:mysql /mysql 

Eseguire il comando riportato di seguito per vedere il contesto iniziale della nuova directory:

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

L'usr_t contesto di questa nuova directory non è attualmente adatto a SELinux come posizione per i file di database MariaDB. Una volta modificato il contesto, MariaDB sarà in grado di funzionare correttamente in quest'area.

Aprire il file di configurazione MariaDB principale /etc/my.cnf con un editor di testo e modificare l'opzione datadir in modo che si riferisca alla nuova posizione.In questo esempio il valore che deve essere inserito è/mysql:

[mysqld] 
datadir=/mysql 

Salvare il file e uscire.

Inizio mysqld. Il servizio non dovesse iniziare, e un messaggio di rifiuto verrà iscritto per l'/ var/log/file di messaggi:

~]# systemctl start mariadb.service 

lavoro per mariadb.service riuscita. Vedi 'systemctl status postgresql.service' e 'journalctl -xn' per i dettagli.

Tuttavia, se il demone audit è in funzione e con lui il servizio setroubleshoot, la negazione verrà registrato nel file /var/log/audit/audit.log invece: SELinux impedisce/usr/libexec/mysqld " scrivi "accesso su/mysql. Per i messaggi completi di SELinux. run sealert -l b3f01aff-7fa6-4ebe-ad46-abaef6f8ad71

Il motivo di questo rifiuto è che/mysql/non è etichettato correttamente per i file di dati MariaDB. SELinux sta impedendo a MariaDB di accedere ai contenuti etichettati come usr_t. Effettuare le seguenti operazioni per risolvere questo problema:

Eseguire il seguente comando per aggiungere un mapping di contesto per/mysql /. Si noti che la semanageutility non è installata per impostazione predefinita. Se manca sul tuo sistema, installa policycoreutils-pythonpackage.

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

Questo mapping è scritto nel file /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

ora usano il programma di utilità restorecon di applicare questa mappatura contesto il sistema in esecuzione:

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

Ora che il/mysql/location è stato etichettato con il contesto corretto per MariaDB, mysqldstarts:

~]# systemctl start mariadb.service 

Confermare il contesto è cambiato per/mysql /:

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

La posizione è stata modificata ed etichettata e mysqld è stato avviato correttamente. A questo punto tutti i servizi in esecuzione dovrebbero essere testati per confermare il normale funzionamento.

+0

Fare riferimento a una risorsa esterna va bene, ma per favore riassumere il contenuto piuttosto che copiare e incollare intere pagine senza alcun tipo di formattazione! – miken32

+0

Cosa succede se il collegamento non funziona dopo un po 'di tempo? Come riassumere quando è necessario applicare ogni passaggio? –

+0

Risposta formattata. –