將 MySQL 數據目錄從 /var/lib/mysql 遷移至掛載雲盤(如 /mnt/data/mysql)是擴容、災備的常規操作。Ubuntu 引入 AppArmor 強制存取控制,若未同步更新策略,MySQL 將啟動失敗。本文提供標準化遷移流程、AppArmor 規則修改、權限保持、驗證清單與回滾方案。
# 1. 確認目標掛載點已掛載、檔案系統健康 df -h /mnt/data lsblk -f # 2. 停止 MySQL 服務 sudo systemctl stop mysql # 3. 同步複製數據(保留屬性、時間戳、稀疏檔) sudo rsync -avHAX /var/lib/mysql/ /mnt/data/mysql/ # 4. 修改目標目錄擁有者 sudo chown -R mysql:mysql /mnt/data/mysql sudo chmod 750 /mnt/data/mysql
# 編輯 AppArmor MySQL 策略 sudo vim /etc/apparmor.d/usr.sbin.mysqld # 找到原有路徑規則,新增目標路徑(保留原路徑以防回滾) # 原:/var/lib/mysql r, → 新增: /mnt/data/mysql r, /mnt/data/mysql/** rwk, # 保存後重新載入策略 sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld # 或重啟 AppArmor 服務 sudo systemctl restart apparmor
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf # 修改 datadir datadir = /mnt/data/mysql # 可選:調整 innodb_data_home_dir、innodb_log_group_home_dir 等相關路徑
sudo systemctl start mysql # 檢查狀態 sudo systemctl status mysql # 登入驗證數據完整性 mysql -u root -p -e "SHOW DATABASES; SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA='your_db';"
| 現象 | 原因 | 解決 |
|---|---|---|
啟動失敗,日誌 Permission denied | AppArmor 策略未生效或路徑錯誤 | sudo aa-status | grep mysqld 確認策略載入;dmesg | grep apparmor 看拒絕詳情 |
啟動失敗,InnoDB: Operating system error number 13 | 目錄擁有者非 mysql:mysql 或權限不足 | chown -R mysql:mysql /mnt/data/mysql; chmod 750 /mnt/data/mysql |
| 從庫同步中斷 | 主庫遷移導致 binlog 位置變化 | 遷移前停寫、記錄 SHOW MASTER STATUS,遷移後從庫 CHANGE MASTER TO 重新定位 |
查詢報錯 Table doesn't exist | rsync 遺漏隱藏檔或符號鏈接 | 使用 rsync -avHAX 保留硬鏈接、ACL、擴展屬性 |
# 1. 停止 MySQL sudo systemctl stop mysql # 2. 恢復配置 sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf # datadir = /var/lib/mysql # 3. 恢復 AppArmor(移除新增路徑並重載) sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld # 4. 啟動 sudo systemctl start mysql
遷移數據目錄是「換心手術」,AppArmor 是 Ubuntu 特有的「免疫排斥反應」。按流程操作、雙邊驗證、預留回滾,方能萬無一失。