預設 datadir = /var/lib/mysql 位於根分區,磁碟空間不足需遷移至大容量分區(如 /home/data/mysql)。
sudo systemctl stop mysql # 或 sudo service mysql stop
sudo mkdir -p /home/data/mysql sudo cp -rp /var/lib/mysql/* /home/data/mysql/ # -p 保留權限、時間戳、擁有者;-r 遞歸
sudo chown -R mysql:mysql /home/data/mysql sudo chmod -R 750 /home/data/mysql
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf # 找到 datadir 行,修改為: datadir = /home/data/mysql # 註解舊行:# datadir = /var/lib/mysql
Ubuntu 預設啟用 AppArmor 限制 MySQL 只能存取 /var/lib/mysql。需調整策略:
sudo vim /etc/apparmor.d/usr.sbin.mysqld # 找到 /var/lib/mysql/ 相關行,複製並修改為新路徑: /home/data/mysql/ r, /home/data/mysql/** rwk, # 重新載入 AppArmor sudo systemctl reload apparmor # 或 sudo /etc/init.d/apparmor reload
sudo systemctl start mysql sudo systemctl status mysql # 驗證資料完整性 mysql -u root -p -e "SHOW DATABASES; SELECT COUNT(*) FROM mysql.user;"
# 確認新目錄運作正常後 sudo rm -rf /var/lib/mysql # 或備份留存:sudo mv /var/lib/mysql /var/lib/mysql.bak
sudo systemctl stop mysql sudo mv /var/lib/mysql /home/data/mysql sudo ln -s /home/data/mysql /var/lib/mysql sudo systemctl start mysql
優點:無需改配置、AppArmor 通常允許符號連結目標。缺點:部署工具/備份腳本可能誤判路徑,不如修改 datadir 明確。
| 現象 | 原因 | 解決 |
|---|---|---|
| 啟動失敗,日誌 Permission denied | 新目錄擁有者非 mysql:mysql 或權限不足 | chown -R mysql:mysql /home/data/mysql; chmod 750 |
| 啟動失敗,AppArmor DENIED | 未更新 AppArmor 策略 | 修改 /etc/apparmor.d/usr.sbin.mysqld 並 reload |
| InnoDB 錯誤:無法開啟 .ibd 檔案 | 複製遺漏檔案 / 檔案系統不支援 | 用 cp -rp 或 rsync -a 完整複製;確認目標分區支援延伸屬性 |
| 複本/叢集環境同步中斷 | datadir 變更影響複本協調 | 按複本拓撲依序遷移,更新 CHANGE MASTER TO 等 |
mysqldump --single-transaction --routines --triggers --all-databases > full_backup.sqlrsync -avH /var/lib/mysql/ /home/data/mysql/(可斷點續傳、驗證檢核和)Ubuntu 遷移 MySQL datadir 核心步驟:停服務 → cp -rp 複製 → chown 權限 → 改 my.cnf datadir → 更新 AppArmor → 重啟驗證 → 清理舊目錄。AppArmor 是 Ubuntu 特有的關鍵阻礙,務必同步調整。生產環境務必備份、維護窗口、rsync 複製、事後 ANALYZE。