磁盤空間不足時,將 MySQL 數據目錄從默認 /var/lib/mysql 遷移至大容量分區(如 /home/data/mysql)是常規運維操作。本文提供 Ubuntu 12.04+ 通用的標準遷移流程,含權限處理、配置修改、AppArmor 適配、驗證清理全步驟。
/home/data),文件系統建議 ext4/xfs。cp /etc/mysql/my.cnf /etc/mysql/my.cnf.bak。sudo service mysql stop
# 或 systemctl stop mysql (Ubuntu 16.04+)
sudo rsync -av /var/lib/mysql/ /home/data/mysql/
# -a 歸檔模式保留所有屬性,-v 顯示進度
# 結尾斜桿 / 表示複製目錄內容而非目錄本身
sudo chown -R mysql:mysql /home/data/mysql
sudo chmod -R 750 /home/data/mysql # 目錄 750,文件 640 更安全
sudo vim /etc/mysql/my.cnf
# 找到 [mysqld] 區塊,修改 datadir
datadir = /home/data/mysql
sudo vim /etc/apparmor.d/usr.sbin.mysqld
# 在文件中添加兩行(路徑按實際調整)
/home/data/mysql/ r,
/home/data/mysql/** rwk,
# 重載 AppArmor
sudo service apparmor reload
sudo service mysql start
# 檢查錯誤日誌
sudo tail -f /var/log/mysql/error.log
# 登錄驗證數據完整性
mysql -u root -p -e "SHOW DATABASES; SELECT COUNT(*) FROM your_table;"
確認新目錄運行穩定 24+ 小時後,可刪除舊數據目錄釋放空間:
sudo rm -rf /var/lib/mysql # 謹慎執行,確保無其他實例依賴
| 現象 | 原因 | 解決 |
|---|---|---|
啟動失敗,錯誤日誌顯示 Can't create/write to file | AppArmor 未放行新路徑 | 檢查 /etc/apparmor.d/usr.sbin.mysqld 配置並 reload |
權限正確但啟動報 Permission denied | 目標分區掛載選項含 noexec/nosuid | mount -o remount,exec,suid /home/data 或修改 /etc/fstab |
| 從庫複製中斷 | 主庫數據目錄路徑變更導致 relay log 路徑異常 | 重新配置從庫 CHANGE MASTER TO 或重做從庫 |
核心口訣:停服務、rsync 複製、改權限、改 my.cnf、配 AppArmor、啟驗證、清舊目錄。AppArmor 是 Ubuntu 遷移特有的「隱形攔截器」,漏配必失敗,務必列入標準操作清單。