生產環境常需將 MySQL 預設資料目錄 /var/lib/mysql 遷移至掛載大容量磁碟的路徑(如 /var/lib/mysql2)。本文記錄基於 CentOS 6.4 + MySQL 5.6.13 (RPM 安裝) 的標準化遷移步驟,含配置檔、啟動腳本、權限、SELinux 等關鍵細節。
/var/lib/mysql → /var/lib/mysql2service mysql stop
# 或
/etc/init.d/mysql stop
cd /var/lib
# 方案 A:複製(保留原目錄回滾)
cp -R mysql mysql2
# 方案 B:重命名(節省空間,無回滾)
# mv mysql mysql2
chown -R mysql:mysql mysql2
chmod 750 mysql2 # 確保目錄權限正確
/etc/my.cnf[mysqld]
# 原有 socket, datadir 註解或修改
socket = /var/lib/mysql2/mysql.sock
datadir = /var/lib/mysql2
# 若有 pid-file 路徑同步修改
pid-file = /var/lib/mysql2/mysqld.pid
/etc/init.d/mysql# 找到 datadir 變數定義行
# datadir=/var/lib/mysql ← 註解掉
datadir=/var/lib/mysql2 ← 新增此行
# 同步修改 socket 變數(如腳本中有定義)
# socket=/var/lib/mysql/mysql.sock
socket=/var/lib/mysql2/mysql.sock
# 檢查當前標籤
ls -Z /var/lib/mysql2
# 應為 system_u:object_r:mysqld_db_t:s0
# 若標籤不正確,恢復預設標籤
restorecon -Rv /var/lib/mysql2
# 或永久允許(不推薦生產)
# setsebool -P mysql_connect_any 1
service mysql start
# 或
/etc/init.d/mysql start
# 檢查錯誤日誌
tail -f /var/log/mysqld.log
# 或
tail -f /var/lib/mysql2/$(hostname).err
mysql -uroot -p -e "SHOW VARIABLES LIKE 'datadir';"
# 輸出應為 /var/lib/mysql2/
| 現象 | 原因 | 解決 |
|---|---|---|
啟動失敗,錯誤日誌顯示 Can't create test file | 目錄權限/擁有者錯誤 | chown -R mysql:mysql /var/lib/mysql2 && chmod 750 /var/lib/mysql2 |
啟動失敗,Permission denied 或 SELinux 拒絕 | SELinux 標籤缺失 | restorecon -Rv /var/lib/mysql2 |
| Socket 連線失敗 | client 端 my.cnf 未同步 socket 路徑 | 編輯 /etc/my.cnf [client] 區段 socket=/var/lib/mysql2/mysql.sock |
| 啟動後資料為空 | 遷移前未停止服務導致資料不一致 | 務必 完全停止 服務後再複製/移動 |
tar 完整備份ANALYZE TABLE 更新統計資訊df -h 確認新磁碟空間充足遵循標準化流程、重視 SELinux 與權限細節,MySQL 資料目錄遷移可在十分鐘內平滑完成,零資料損失、零配置遺漏。