首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Linux 環境下 MySQL data 目錄遷移標準化操作流程

     編輯:MySQL 資料庫相關知識

適用場景

yum/rpm 安裝 MySQL 時,`datadir` 預設為 `/var/lib/mysql`。為提升 I/O 效能、隔離系統盤與資料盤、滿足合規要求,常需遷移至獨立掛載點(如 `/data/mysql` 或 `/home/mysql`)。本文提供標準化、可驗證的遷移流程。

遷移前置檢查

# 確認當前 datadir
mysql -u root -p -e "SHOW VARIABLES LIKE 'datadir';"

# 確認目標分區掛載點與剩餘空間
df -h /data
ls -ld /data/mysql 2>/dev/null || echo "目標目錄不存在,將自動建立"

標準遷移步驟

1. 停止相關服務(防止寫入衝突)

systemctl stop httpd    # 或 service httpd stop
systemctl stop mysqld   # 或 service mysqld stop

2. 使用 mv 移動目錄(保留 SELinux 上下文與權限)

mv /var/lib/mysql /data/mysql
# 若目標父目錄不存在:mkdir -p /data && mv /var/lib/mysql /data/
為何用 mv 而非 cp?
`mv` 在同一檔案系統內僅修改目錄項,瞬間完成,且完整保留 inode、權限、SELinux 標籤(`context`)。`cp -a` 雖也保留屬性,但跨檔案系統時需重新寫入資料,耗時且易遺漏 SELinux 上下文,導致後續啟動被 SELinux 攔截。

3. 修改 MySQL 配置檔 `/etc/my.cnf`

[mysqld]
# datadir=/var/lib/mysql          # 註釋舊路徑
datadir=/data/mysql               # 新路徑

# socket=/var/lib/mysql/mysql.sock
socket=/data/mysql/mysql.sock

[mysqld_safe]
socket=/data/mysql/mysql.sock

[client]
socket=/data/mysql/mysql.sock

[mysql.server]
socket=/data/mysql/mysql.sock

4. 同步修改 PHP 連線配置 `/etc/php.ini`

PHP PDO/MySQLi 預設讀取 `mysql.default_socket`,若為空則 fallback 至編譯時預設(通常 `/var/lib/mysql/mysql.sock`),**必須顯式指定新路徑**,否則 PHP 應用無法連線。

[mysql]
mysql.default_socket = /data/mysql/mysql.sock

[mysqli]
mysqli.default_socket = /data/mysql/mysql.sock

[pdo_mysql]
pdo_mysql.default_socket = /data/mysql/mysql.sock

5. SELinux 環境下的額外處理(關鍵)

# 檢查目標目錄 SELinux 標籤
ls -Z /data/mysql
# 應為:system_u:object_r:mysqld_db_t:s0

# 若標籤不正確,恢復預設標籤
restorecon -Rv /data/mysql

# 或臨時關閉 SELinux 驗證(不建議生產環境)
# setenforce 0

6. 啟動服務並驗證

systemctl start mysqld
systemctl start httpd

# 驗證 datadir 生效
mysql -u root -p -e "SHOW VARIABLES LIKE 'datadir';"

# 驗證 PHP 連線
php -r "$mysqli = new mysqli('localhost', 'root', 'pass'); var_dump($mysqli->connect_errno);"

常見問題排查表

現象原因解決
MySQL 啟動失敗,日誌顯示 Permission denied目錄擁有者非 mysql:mysql,或 SELinux 封鎖`chown -R mysql:mysql /data/mysql` + `restorecon -Rv /data/mysql`
PHP 連線報 "Can't connect to local MySQL server through socket"`php.ini` 未更新 socket 路徑修改 `php.ini` 三處 `default_socket`,重啟 php-fpm/httpd
遷移後資料表損壞/丟失移動前未完全停止寫入,或用 `cp` 遺漏隱藏檔嚴格遵循「停服務 → mv → 改配置 → 啟動」順序
錯誤日誌報 "Unknown/unsupported storage engine: InnoDB"`ibdata1`、`ib_logfile*` 路徑錯誤或權限問題確認 `innodb_data_home_dir`、`innodb_log_group_home_dir` 或預設在 `datadir` 下

驗收清單

  • [ ] `SHOW VARIABLES LIKE 'datadir'` 輸出新路徑
  • [ ] `ls -l /data/mysql` 擁有者為 `mysql:mysql`,權限 750
  • [ ] `ls -Z /data/mysql` SELinux 標籤為 `mysqld_db_t`
  • [ ] MySQL 服務啟動無錯誤日誌
  • [ ] PHP/應用層連線測試通過
  • [ ] 讀寫業務 SQL 執行正常
  • [ ] 備份腳本路徑已同步更新

總結

Linux 下 MySQL `datadir` 遷移核心在於:**停服務 → mv 保留屬性 → 改雙端配置 → SELinux 恢復標籤 → 啟動驗證**。嚴格遵循流程可將風險降至最低,避免「服務啟動了但應用連不上」或「SELinux 暗坑」等典型問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved