預設 /var/lib/mysql 磁碟空間不足,需遷移至 /var/lib/mysql2。RPM 安裝環境下的標準化遷移流程,含服務管理、權限修正、配置同步、啟動驗證。
/var/lib/mysql → 目標:/var/lib/mysql2service mysql stop
cd /var/lib
# 方案 A:複製(保留原目錄回滾)
cp -R mysql mysql2
# 方案 B:重命名(極快,無額外空間佔用)
# mv mysql mysql2
chown -R mysql:mysql mysql2
chmod 750 mysql2 # 建議:目錄 750,檔案 640,由 mysql 進程擁有
/etc/my.cnf[mysqld]
datadir=/var/lib/mysql2
socket=/var/lib/mysql2/mysql.sock
# 其他參數保持不變
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
/etc/init.d/mysql# 找到原行註釋
# datadir=/var/lib/mysql
# 新增
datadir=/var/lib/mysql2
若使用 systemd(CentOS 7+),改用 systemctl edit mysql 建立 drop-in 覆寫 Environment=DATADIR=/var/lib/mysql2。
service mysql start
# 或
/etc/init.d/mysql start
# 驗證
mysql -u root -p -e "SHOW VARIABLES LIKE 'datadir';"
# 應輸出 /var/lib/mysql2
[ERROR]。SHOW VARIABLES LIKE 'datadir'; 顯示新路徑。Seconds_Behind_Master=0。| 現象 | 原因 | 解決 |
|---|---|---|
啟動失敗 Can't create test file | 目錄擁有者非 mysql | chown -R mysql:mysql /var/lib/mysql2 |
| Socket 連線失敗 | my.cnf 與啟動腳本 socket 路徑不一致 | 統一指向 /var/lib/mysql2/mysql.sock |
| SELinux 拒絕存取 | 新目錄無 mysqld_db_t 標籤 | semanage fcontext -a -t mysqld_db_t "/var/lib/mysql2(/.*)?"; restorecon -Rv /var/lib/mysql2 |
| AppArmor 拒絕 (Ubuntu) | profile 限制舊路徑 | 修改 /etc/apparmor.d/usr.sbin.mysqld 加入新路徑 → service apparmor reload |