將 MySQL 資料目錄從預設 /var/lib/mysql 遷移至大容量掛載點(如 /home/data),需同步修改配置檔、啟動腳本、Socket 路徑、SELinux 上下文。本文提供最小化停機、可回滾的標準化流程。
service mysqld stop
cp -Rp /var/lib/mysql /home/data # -p 保留權限、時間戳、SELinux 上下文
chown -R mysql:mysql /home/data
[mysqld]
datadir=/home/data
socket=/home/data/mysql.sock
# 建議同步加入 client 區段,避免客戶端連不上
[client]
socket=/home/data/mysql.sock
# 找到 datadir 變數行,修改為
datadir="/home/data"
service mysqld start
# 若啟動失敗,嘗試臨時關閉 SELinux
setenforce 0
service mysqld start
現象:mysql -uroot -p 報 Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'。
原因:客戶端讀取 /etc/my.cnf 的 [client] socket,若未設則用編譯時預設 /var/lib/mysql/mysql.sock。
# 在 /etc/my.cnf 追加/確認
[client]
socket=/home/data/mysql.sock
# 或連線時顯式指定
mysql -uroot -p -S /home/data/mysql.sock
# 1. 查看預設上下文
ls -Z /var/lib/mysql
# system_u:object_r:mysqld_db_t:s0
# 2. 給新目錄打標
semanage fcontext -a -t mysqld_db_t "/home/data(/.*)?"
restorecon -Rv /home/data
# 3. 驗證
ls -Z /home/data
# 應顯示 mysqld_db_t
完成後可重新 setenforce 1 開啟 SELinux。
service mysqld stop
mv /home/data /var/lib/mysql # 或恢復備份
# 還原 my.cnf、init.d 腳本
service mysqld start
cp -Rp 保留屬性chown mysql:mysqlmy.cnf [mysqld] + [client] 同步修改 socketinit.d 腳本 datadir 同步mysqld_db_t按清單逐項核對,可確保遷移零故障、秒級回滾。