文章目錄
- MySQL 連接指定端口后,為什么實際仍是 3306?
- 問題現象復現
- 原因分析
- 沒有指定 -h,默認走的是本地 Unix Socket
- 多實例環境中未顯式指定目標地址
- 正確的連接方法
- 方法一:添加 -h 127.0.0.1
- 方法二:添加 --protocol=TCP
- 驗證是否連接成功
- 附加說明
- 總結
- ? 建議
MySQL 連接指定端口后,為什么實際仍是 3306?
在日常運維或開發過程中,有時我們在使用 mysql
命令行工具連接 MySQL 實例時,可能會遇到一個令人疑惑的問題:
mysql -u root -p -P 3307
本以為連接的是監聽在 3307
端口的 MySQL 實例,但登錄進去后執行:
SELECT @@hostname, @@port;
卻發現:
+----------------+--------+
| @@hostname | @@port |
+----------------+--------+
| your-hostname | 3306 |
+----------------+--------+
也就是說,實際連接的是 3306 端口,而不是我們指定的 3307。這是為什么?本文將為你詳細解答。
問題現象復現
命令:
mysql -u root -p -P 3307
登錄成功后執行:
SELECT @@port;
輸出結果卻是:
3306
這說明當前連接的 MySQL 實例監聽端口為 3306,而不是我們指定的 3307。
原因分析
沒有指定 -h,默認走的是本地 Unix Socket
MySQL 客戶端有兩種連接方式:
- Unix Socket(本地文件方式),路徑一般是
/tmp/mysql.sock
- TCP/IP(網絡方式)
當你沒有指定 -h
參數時,例如:
mysql -u root -p -P 3307
MySQL 客戶端會默認使用 Unix Socket 方式連接本地 MySQL 實例,而不是 TCP 連接。
而本地默認的 Socket 通常連接的是 MySQL 默認端口 3306
的實例。這就解釋了為什么你看到的是 @@port = 3306
。
提示:
-P
端口號只在 TCP 連接中才會生效,Socket 連接時會被忽略。
多實例環境中未顯式指定目標地址
如果你在本機運行了多個 MySQL 實例(例如一個監聽 3306,另一個監聽 3307),但沒有明確指定連接主機地址,則默認連接的是 3306 監聽的實例。
正確的連接方法
為了確保連接到指定端口上的實例,你需要強制使用 TCP 連接方式。
方法一:添加 -h 127.0.0.1
mysql -u root -p -P 3307 -h 127.0.0.1
指定主機地址為 127.0.0.1
,客戶端就會使用 TCP 協議連接指定端口。
方法二:添加 --protocol=TCP
mysql -u root -p -P 3307 --protocol=TCP
這個參數顯式告訴 MySQL 客戶端使用 TCP 協議,而不是默認的 Socket。
驗證是否連接成功
進入 MySQL 后執行以下命令驗證:
SELECT @@hostname, @@port, @@socket;
如果你看到的是:
+-------------+--------+----------------------+
| @@hostname | @@port | @@socket |
+-------------+--------+----------------------+
| localhost | 3307 | NULL |
+-------------+--------+----------------------+
說明你成功通過 TCP 連接到了監聽 3307 的實例。
附加說明
如果你使用 socket
配置了多個實例,可能存在多個 socket 文件,如:
# /etc/my.cnf
[mysqld]
port=3306
socket=/var/lib/mysql/mysql.sock[mysqld_multi]
[mysqld1]
port=3306
socket=/var/lib/mysql/mysql.sock[mysqld2]
port=3307
socket=/var/lib/mysql3307/mysql.sock
此時命令行客戶端也可以用 --socket
顯式連接對應實例:
mysql -u root -p --socket=/var/lib/mysql3307/mysql.sock
總結
問題原因 | 解決方法 |
---|---|
未指定 -h ,默認走本地 Socket,連接到了 3306 實例 | 使用 -h 127.0.0.1 或 --protocol=TCP 強制使用 TCP 連接 |
本機有多個 MySQL 實例,未顯式指定主機或 socket 文件 | 使用 --socket=路徑 或 TCP 方式連接指定端口 |
? 建議
以后如果你需要連接指定端口的 MySQL 實例,務必顯式指定 -h
參數或使用 --protocol=TCP
,否則 -P
參數可能不會生效。