iT邦幫忙

1

MariaDB 更改 datadir 後無法啟動

  • 分享至 

  • xImage

各位好,我的 CentOS 7 系統碟切分的很小,資料庫資料日益肥大快撐不住了,所以要更換資料儲存位置,參考了這一篇文章 How To Change a MariaDB Data Directory to a New Location on CentOS 7

我先開了一台 Centos 7 的虛機做實驗,執行步驟如下:

service mariadb stop
mkdir /data/
rsync -avh /var/lib/mysql/ /data/
mv /var/lib/mysql /var/lib/mysql_bk
chown mysql:mysql -R /data

修改 /etc/my.cnf。

[mysqld]
datadir=/data/
socket=/data/mysql.sock

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

[client]
port=3306
socket=/data/mysql.sock

# include all files from the config directory
!includedir /etc/my.cnf.d

然後執行啟動。

service mariadb start

得到錯誤資訊。

Job for mariadb.service failed because the control process exited with error code. See "systemctl status mariadb.service" and "journalctl -xe" for details.

查看 mariadb.log 後得到。

230216 02:37:46 mysqld_safe Starting mysqld daemon with databases from /data/
230216  2:37:46 [Note] /usr/libexec/mysqld (mysqld 5.5.68-MariaDB) starting as process 6016 ...
230216  2:37:46 [Warning] Can't create test file /data/localhost.lower-test
230216  2:37:46 InnoDB: The InnoDB memory heap is disabled
230216  2:37:46 InnoDB: Mutexes and rw_locks use GCC atomic builtins
230216  2:37:46 InnoDB: Compressed tables use zlib 1.2.7
230216  2:37:46 InnoDB: Using Linux native AIO
230216  2:37:46 InnoDB: Initializing buffer pool, size = 128.0M
230216  2:37:46 InnoDB: Completed initialization of buffer pool
230216  2:37:46  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.
InnoDB: File name ./ibdata1
InnoDB: File operation call: 'open'.
InnoDB: Cannot continue operation.
230216 02:37:46 mysqld_safe mysqld from pid file /var/run/mariadb/mariadb.pid ended

即便我把 /data/ 的權限設定為 777 都一樣得到沒有權限的資訊,不知道是哪邊出了問題。

看更多先前的討論...收起先前的討論...
chan15 iT邦新手 2 級 ‧ 2023-02-16 11:00:16 檢舉
查到了,是 SELinux ...............
Ray iT邦大神 1 級 ‧ 2023-02-16 11:41:15 檢舉
我還正想說: 請你 setenforce 0 試試看, 結果你就找到了....
wiseguy iT邦超人 1 級 ‧ 2023-02-16 11:48:20 檢舉
看到你的指令,特別再提醒一下:
你的 mysql.sock 擺在 /data 目錄,但原則上 /data 應該只允許 mysql 這個帳號存取。所以,如果是遵循原則,那麼除非你的 client runner 就用 mysql 身份在執行,不然 socket 連線沒人能連得到。
但如果你把 /data 的存取權改為 777, 並解除 SELinux 限制,為了讓 process 可以用 socket 連資料庫,那就是完全沒安全可言。阿貓阿狗帳號都能摳走資料庫檔案。
所以建議把 mysql.sock 擺在其他所有人能存取的地方,比如 /tmp。/data 則應把 group, others 權限清掉。
chan15 iT邦新手 2 級 ‧ 2023-02-17 08:50:42 檢舉
謝謝樓上兩位
chan15 iT邦新手 2 級 ‧ 2023-02-17 09:09:06 檢舉
請教 @wiseuy,我改 777 只是想測試理由,最終解是使用原本的權限並且開啟 selinux 權限,另外照您說的 myql.sock 本來就存在於只准 mysql:mysql 權限的 /var/lib/mysql 目錄,我權限照樣搬應該結果要一樣才是吧?
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
JamesDoge
iT邦高手 1 級 ‧ 2023-02-16 19:57:15
最佳解答

你可以使用以下命令檢查 SELinux 是否啟用:

sestatus

如果 SELinux 為啟用狀態,則可以使用以下命令將 /data/ 目錄標記為可讀寫的:

chcon -Rv --type=mysql_db_t /data/

重新啟動 MariaDB:

systemctl start mariadb

我要發表回答

立即登入回答