遷移 MySQL datadir 是常見運維操作,但許多人遷移後啟動服務正常,卻發現客戶端無法連線,報錯:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
本文詳解遷移標準流程、失敗根因與三種解決方案。
service mysqld stop
mkdir -p /data
mv /var/lib/mysql /data/
vi /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
將腳本內 datadir=/var/lib/mysql 改為 datadir=/data/mysql
service mysqld start
服務端已正確讀取新 socket 路徑並啟動,但客戶端程式(mysql 命令列)仍去預設路徑 /var/lib/mysql/mysql.sock 尋找 Socket 檔案。MySQL 客戶端預設 Socket 路徑在編譯時固化,不受 [mysqld] 區塊影響。
ln -s /data/mysql/mysql.sock /var/lib/mysql/mysql.sock
service mysqld restart
客戶端找到舊路徑軟連結 → 指向新 Socket → 連線成功。
vi /etc/my.cnf
[mysql]
socket=/data/mysql/mysql.sock
mysql 客戶端啟動時會讀取 [mysql] 區塊配置,直接使用新路徑。
chown -R mysql:mysql /data/mysql/
chmod 660 /data/mysql/test/*
確保 MySQL 進程使用者對新目錄有完整讀寫權限。
mysql -u root -p
# 成功進入交互模式表示遷移完成
SHOW VARIABLES LIKE 'datadir';
SHOW VARIABLES LIKE 'socket';
semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?")my.cnf 與啟動腳本,便於回滾mysqlcheck -A --auto-repair 檢查表完整性核心心法:服務端與客戶端 Socket 路徑必須一致。方案一兼容性最好(不改動任何客戶端配置),方案二最標準,方案三常被遺漏但同樣關鍵。