df -h /home)service mysqld stop # 或 systemctl stop mysqld # 驗證進程已停 ps aux | grep mysql
cd /var/lib cp -a mysql /home/mysql_data/ # -a = -dR --preserve=all 遞歸保留所有屬性、時間戳、软連結
大數據量建議用 rsync -av /var/lib/mysql/ /home/mysql_data/mysql/ 可斷點續傳、顯示進度。
/etc/my.cnf
[mysqld] datadir=/home/mysql_data/mysql socket=/home/mysql_data/mysql/mysql.sock # 原行註釋備份 # datadir=/var/lib/mysql # socket=/var/lib/mysql/mysql.sock
/etc/init.d/mysqld (或 /etc/rc.d/init.d/mysqld)
# 修改 datadir 變量 datadir="/home/mysql_data/mysql"
/usr/bin/mysqld_safe
# 修改 DATADIR 變量 DATADIR="/home/mysql_data/mysql"
ln -s /home/mysql_data/mysql/mysql.sock /var/lib/mysql/mysql.sock
chown -R mysql:mysql /home/mysql_data/mysql chmod 750 /home/mysql_data/mysql
service mysqld start # 檢查錯誤日誌 tail -f /var/log/mysqld.log # 或 journalctl -u mysqld -f # 連接測試 mysql -u root -p -e "SHOW VARIABLES LIKE 'datadir';" mysql -u root -p -e "SELECT @@datadir;"
# 1. 編輯服務單元文件 systemctl edit mysqld # 添加覆蓋配置 [Service] ExecStartPre=/bin/bash -c "mkdir -p /home/mysql_data/mysql && chown mysql:mysql /home/mysql_data/mysql" # 或直接修改 /usr/lib/systemd/system/mysqld.service 中的 Environment 變量 # 2. 重載配置 systemctl daemon-reload # 3. 啟動 systemctl start mysqld
# 1. 標記目標目錄上下文 semanage fcontext -a -t mysqld_db_t "/home/mysql_data/mysql(/.*)?" restorecon -Rv /home/mysql_data/mysql # 2. 或暫時置寬容模式驗證 setenforce 0 # 確認無 SELinux 阻攔後再 enforce
| 檢查項 | 命令 | 預期結果 |
|---|---|---|
| datadir 生效 | SHOW VARIABLES LIKE 'datadir'; | /home/mysql_data/mysql/ |
| Socket 可連 | mysql -S /home/mysql_data/mysql/mysql.sock | 連接成功 |
| 權限正確 | ls -ld /home/mysql_data/mysql | mysql:mysql 750 |
| 數據完整 | SELECT COUNT(*) FROM core_table; | 行數一致 |
| 寫入測試 | INSERT INTO test_tbl VALUES (1); | 成功 |
# 1. 停止服務 service mysqld stop # 2. 恢復配置文件三處 datadir 指回 /var/lib/mysql # 3. 刪除軟連結 rm -f /var/lib/mysql/mysql.sock # 4. 啟動 service mysqld start
數據目錄遷移核心三步:停服務 → 複制數據保留屬性 → 修改三處配置 + Socket 連結 + 權限修正。systemd/SELinux 環境需額外處理單元文件與安全上下文。遷移前務必備份配置文件,驗證清單逐項確認,預留回滾方案。