MySQL 數據目錄(datadir)預設位置往往在系統盤,隨資料增長易填滿根分區,或因磁碟規劃需遷移至專用數據盤。本文提供 Linux、FreeBSD、Windows 三大平台的標準遷移流程,含軟連結法、配置文件法、權限處理與驗證步驟。
datadir 整個目錄,而非單獨移動表文件mysql:mysql# 1. 停止服務
systemctl stop mysqld
# 2. 同步數據(保留屬性、權限、時間戳)
rsync -av /var/lib/mysql/ /data/mysql/
# 3. 備份原目錄(防回滾)
mv /var/lib/mysql /var/lib/mysql.bak
# 4. 修改配置
# /etc/my.cnf
[mysqld]
datadir = /data/mysql
socket = /data/mysql/mysql.sock
# 5. SELinux 打標簽(關鍵)
semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?"
restorecon -Rv /data/mysql
# 6. 啟動驗證
systemctl start mysqld
mysql -e "SHOW VARIABLES LIKE 'datadir';"
systemctl stop mysqld
mv /var/lib/mysql /data/mysql
ln -s /data/mysql /var/lib/mysql
# SELinux 仍需打標簽
systemctl start mysqld
優點:配置文件無需改、回滾只需刪連結換回目錄。缺點:部分工具/腳本可能不識別符號鏈接。
chown -R mysql:mysql /data/mysql
chmod 750 /data/mysql
/usr/local/etc/rc.d/mysql-server stop
mkdir -p /data/mysql
mv /var/db/mysql /data/mysql
ln -s /data/mysql /var/db/mysql
# 權限
chown -R mysql:mysql /data/mysql
/usr/local/etc/rc.d/mysql-server start
FreeBSD 無 SELinux,但需檢查 /etc/rc.conf 中 mysql_dbdir 設置是否衝突。
mysql> SHOW VARIABLES LIKE 'datadir';
+---------------+-------------------+
| Variable_name | Value |
+---------------+-------------------+
| datadir | D:/MySql5.0/data/ |
+---------------+-------------------+
net stop mysql
用資源管理器或 robocopy 將 D:/MySql5.0/data 移至目標位置(如 E:/mysql_data)。
[mysqld]
datadir="E:/mysql_data"
net start mysql
mysql> SHOW VARIABLES LIKE 'datadir';
SHOW VARIABLES LIKE 'datadir'; 確認新路徑SHOW TABLES; 確認表可見SELECT COUNT(*) FROM key_table; 確認數據完整SHOW SLAVE STATUS\G(若為從庫)確認複製正常| 現象 | 可能原因 | 解決 |
|---|---|---|
啟動失敗 Can't create test file | 目錄權限錯誤 / SELinux/AppArmor 阻擋 | chown -R mysql:mysql、restorecon、調整 AppArmor 規則 |
啟動失敗 Unknown/unsupported storage engine: InnoDB | ibdata1/ib_logfile 損壞或遺漏 | 檢查共享表空間文件是否完整遷移、innodb_force_recovery |
| 從庫複製中斷 | relay_log 路徑變更 / datadir 變更導致 relay log 丟失 | 重新 CHANGE MASTER TO 指定正確位置 |
InnoDB 錯誤 tablespace id mismatch | 攜帶 .ibd 文件遷移但未 DISCARD/IMPORT TABLESPACE | 整體遷移 datadir 而非單表文件 |
遵循「停庫、同步、改配、打標、驗證」標準流程,配合平台特性處理權限與安全策略,MySQL 數據目錄遷移可實現零數據丟失、最小停機時間的平滑遷移。