mkdir -p /media/hdb1/db
2. 停止 MySQL 服務
sudo systemctl stop mysql
# 或舊版
sudo /etc/init.d/mysql stop
3. 複製數據(保留屬性、權限、時間戳)
cp -dpR /var/lib/mysql/* /media/hdb1/db/
-d:保留符號鏈接-p:保留權限、時間戳、所有者-R:遞歸複製chown -R mysql:mysql /media/hdb1/db
5. 修改 AppArmor 配置(關鍵步驟,Ubuntu 預設啟用)
sudo vim /etc/apparmor.d/usr.sbin.mysqld
將:
/var/lib/mysql r,
/var/lib/mysql/** rwk,
改為:
/media/hdb1/db r,
/media/hdb1/db/** rwk,
6. 修改 MySQL 配置文件
sudo vim /etc/mysql/my.cnf
找到 [mysqld] 區塊,修改:
datadir = /media/hdb1/db
7. 重啟 AppArmor 與 MySQL
sudo systemctl restart apparmor
sudo systemctl restart mysql
# 登入 MySQL
mysql -u root -p
# 查看數據目錄
SHOW VARIABLES LIKE 'datadir';
-- 應顯示 /media/hdb1/db/
# 測試讀寫
CREATE DATABASE test_migration;
USE test_migration;
CREATE TABLE t (id INT);
INSERT INTO t VALUES (1);
SELECT * FROM t;
| 問題 | 原因 | 解決 |
|---|---|---|
| 啟動失敗,日誌顯示 Permission denied | AppArmor 未更新或目錄權限錯誤 | 檢查 apparmor 配置、chown -R mysql:mysql、重啟 apparmor |
| 啟動失敗,PID file not updated | SELinux(CentOS)或目錄權限 | Ubuntu 通常無 SELinux,檢查目錄權限與 apparmor |
| 舊數據不可見 | 複製未包含隱藏文件或符號鏈接 | 使用 cp -dpR 確保完整複製 |
# 恢復配置
sudo vim /etc/mysql/my.cnf # datadir = /var/lib/mysql
sudo vim /etc/apparmor.d/usr.sbin.mysqld # 恢復 /var/lib/mysql 路徑
sudo systemctl restart apparmor
sudo systemctl restart mysql
mysqldump 或物理備份)/etc/fstab 開機自動掛載,選項 defaults,nofail