2014-10-20 79 views
6

全新「最小」的CentOS 7與MariaDB的10沿着安裝我有一個額外的安裝,我想使用的DATADIR鏡像卷。當my.cnf [mysqld]被註釋掉時,啓動順序很好,並正常完成。我已經複製了這些數據。MariaDB的10的CentOS 7移動DATADIR愁楚

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

權限與原始權限相同。體積是在/ etc/fstab文件並安裝精細 /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 

這是在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 

這是我所得到的,當我嘗試啓動它...

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

這兩個文件都沒有說太多,但這是在/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/幫助了一點,但我無法得到它的工作。

任何幫助將不勝感激。

回答

6

嗯,這很有趣......

事實證明,這7 CentOS的「最小」安裝SELinux的,這顯然是防止MySQL的從編寫到安裝鏡像集。我正在尋找我可能沒有想過的安全項目,並在文檔中找到它。我以前認爲(顯然是錯誤的),SELinux是一個發行版,而不是一個模塊。一旦我跑了測試,看看它是否存在....

getenforce 

我暫時禁用它來測試。

setenforce 0 

最後,我能夠啓動MariaDB,將鏡像集中的目錄作爲datadir並且沒有錯誤。爲了使這種更改永久(因爲該服務器在防火牆後面),在/ etc/SELinux的/ config中,我做了

- SELINUX=enforcing 
+ SELINUX=disabled 

我希望這可以幫助別人。祝你有美好的一天!

+1

我知道你可能在防火牆後面......但是爲什麼你只是禁用一個安全功能,特別是一個包裝你的數據庫目錄。它確實和更改一些權限一樣簡單。 – 2015-08-01 17:03:49

16

問題確實是SELinux;你需要做三件事情之前MariaDB的/ MySQL將在CentOS 7開始:

  1. 確保用戶:組是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 

wa行我需要在插入磁盤以後做事情洞低於:

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

這個,這是真正的答案。其他人都只是說禁用selinux ....你爲什麼要做這樣的事情? – 2015-08-01 17:02:30

+0

在Fedora 23上,mariadb啓動時會重新標記數據庫文件夾,您需要添加標籤規則。 'sudo semanage fcontext --add --type mysqld_db_t「/ database/db(/.*)?」' – 2016-02-26 20:45:42

+0

完美的解決方案。謝謝! – ytll21 2016-06-21 03:25:46

0

我發現這一步一步地指導工作對我來說: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

您必須安裝: 百勝安裝policycoreutils-蟒蛇

指南:

查看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用戶訪問和組。這臺傳統的Unix權限的SELinux的仍然會觀察:

~]# chown -R mysql:mysql /mysql 

運行以下命令來查看新目錄的初始上下文:

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

這個新創建的目錄的情況下usr_t不目前適合SELinux作爲MariaDB數據庫文件的位置。一旦上下文發生變化,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消息。運行sealert -l b3f01aff-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

引用外部資源很好,但請總結內容,而不是複製和粘貼整個頁面而不使用任何格式! – miken32 2015-11-17 00:36:39

+0

如果鏈接在一段時間後不起作用會怎麼樣?如何總結何時需要應用每一步? – 2015-11-17 09:58:37

+0

格式答案。 – 2015-11-17 10:09:07