單機跑多個 MySQL 實例 (如 3306/3307/3308) 時,mysql -u root -p 預設連 3306,且本機連線走 Unix Socket 而非 TCP,導致 -P 3307 不生效。本文釐清連線機制並給出正確登入姿勢。
mysql -h localhost → **Unix Socket** (讀 [client] socket 或編譯時預設 /tmp/mysql.sock)。mysql -h 127.0.0.1 → **TCP/IP** (走 -P port)。-S /path/to/mysql.sock → 明確指定 Socket 檔案。# 實例 3306 (預設)
mysql -u root -p
# 實例 3307 (兩種等價方式)
mysql -u root -p -h 127.0.0.1 -P 3307
mysql -u root -p -S /data/mysql_3307/mysql.sock
# 實例 3308
mysql -u root -p -h 127.0.0.1 -P 3308
# 或
mysql -u root -p -S /data/mysql_3308/mysql.sock
-P 3307 単獨用不生效?mysql -u root -p -P 3307
# 實際連的是 3306,因為 -h localhost 觸發 Socket 連線,-P 被忽略
鐵律:多實例本機登入,必須顯式指定 -h 127.0.0.1 或 -S socket_path。
my.cnf 區隔[mysqld_3306]
port=3306
socket=/data/mysql_3306/mysql.sock
datadir=/data/mysql_3306/data
pid-file=/data/mysql_3306/mysql.pid
[mysqld_3307]
port=3307
socket=/data/mysql_3307/mysql.sock
datadir=/data/mysql_3307/data
pid-file=/data/mysql_3307/mysql.pid
[client_3307]
socket=/data/mysql_3307/mysql.sock
port=3307
啟動:mysqld --defaults-file=/etc/my_3307.cnf --defaults-group-suffix=_3307 &
mysql> SHOW VARIABLES LIKE 'socket';
mysql> SELECT @@port, CONNECTION_ID();
mysql> \s -- Status 顯示 Connection: 127.0.0.1 via TCP/IP 或 Localhost via UNIX socket
結語:MySQL 多實例本機登入的核心是「區分 Socket vs TCP」。養成習慣:腳本/應用統一用 127.0.0.1:port,手動運維用 -S socket,徹底杜絕「以為連 3307 實際連 3306」的低級錯誤。