MySQL連接指定端口后實際仍是3306的原因分析及解決方法
MySQL 連接指定端口后,為什么實際仍是 3306?
在日常運維或開發(fā)過程中,有時我們在使用 mysql
命令行工具連接 MySQL 實例時,可能會遇到一個令人疑惑的問題:
mysql -u root -p -P 3307
本以為連接的是監(jiān)聽在 3307
端口的 MySQL 實例,但登錄進去后執(zhí)行:
SELECT @@hostname, @@port;
卻發(fā)現(xiàn):
+----------------+--------+ | @@hostname | @@port | +----------------+--------+ | your-hostname | 3306 | +----------------+--------+
也就是說,實際連接的是 3306 端口,而不是我們指定的 3307。這是為什么?本文將為你詳細解答。
問題現(xiàn)象復(fù)現(xiàn)
命令:
mysql -u root -p -P 3307
登錄成功后執(zhí)行:
SELECT @@port;
輸出結(jié)果卻是:
3306
這說明當(dāng)前連接的 MySQL 實例監(jiān)聽端口為 3306,而不是我們指定的 3307。
原因分析
沒有指定 -h,默認走的是本地 Unix Socket
MySQL 客戶端有兩種連接方式:
- Unix Socket(本地文件方式),路徑一般是
/tmp/mysql.sock
- TCP/IP(網(wǎng)絡(luò)方式)
當(dāng)你沒有指定 -h
參數(shù)時,例如:
mysql -u root -p -P 3307
MySQL 客戶端會默認使用 Unix Socket 方式連接本地 MySQL 實例,而不是 TCP 連接。
而本地默認的 Socket 通常連接的是 MySQL 默認端口 3306
的實例。這就解釋了為什么你看到的是 @@port = 3306
。
提示:-P 端口號只在 TCP 連接中才會生效,Socket 連接時會被忽略。
多實例環(huán)境中未顯式指定目標地址
如果你在本機運行了多個 MySQL 實例(例如一個監(jiān)聽 3306,另一個監(jiān)聽 3307),但沒有明確指定連接主機地址,則默認連接的是 3306 監(jiān)聽的實例。
正確的連接方法
為了確保連接到指定端口上的實例,你需要強制使用 TCP 連接方式。
方法一:添加 -h 127.0.0.1
mysql -u root -p -P 3307 -h 127.0.0.1
指定主機地址為 127.0.0.1
,客戶端就會使用 TCP 協(xié)議連接指定端口。
方法二:添加 --protocol=TCP
mysql -u root -p -P 3307 --protocol=TCP
這個參數(shù)顯式告訴 MySQL 客戶端使用 TCP 協(xié)議,而不是默認的 Socket。
驗證是否連接成功
進入 MySQL 后執(zhí)行以下命令驗證:
SELECT @@hostname, @@port, @@socket;
如果你看到的是:
+-------------+--------+----------------------+ | @@hostname | @@port | @@socket | +-------------+--------+----------------------+ | localhost | 3307 | NULL | +-------------+--------+----------------------+
說明你成功通過 TCP 連接到了監(jiān)聽 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
顯式連接對應(yīng)實例:
mysql -u root -p --socket=/var/lib/mysql3307/mysql.sock
總結(jié)
問題原因 | 解決方法 |
---|---|
未指定 -h,默認走本地 Socket,連接到了 3306 實例 | 使用 -h 127.0.0.1 或 --protocol=TCP 強制使用 TCP 連接 |
本機有多個 MySQL 實例,未顯式指定主機或 socket 文件 | 使用 --socket=路徑 或 TCP 方式連接指定端口 |
建議
以后如果你需要連接指定端口的 MySQL 實例,務(wù)必顯式指定 -h
參數(shù)或使用 --protocol=TCP
,否則 -P
參數(shù)可能不會生效。
以上就是MySQL連接指定端口后實際仍是3306的原因分析及解決方法的詳細內(nèi)容,更多關(guān)于MySQL連接指定端口實際是3306的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
mysql 8.0.18各版本安裝及安裝中出現(xiàn)的問題(精華總結(jié))
這篇文章主要介紹了mysql 8.0.18各版本安裝及安裝中出現(xiàn)的問題,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-12-12win10 安裝 mysql 5.7 msi版的教程圖文詳解
這篇文章主要介紹了win10 安裝 mysql 5.7 msi版的教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05MySql中的IFNULL、NULLIF和ISNULL用法詳解
本文主要介紹了MySql中的IFNULL、NULLIF和ISNULL用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03Ubuntu10下如何搭建MySQL Proxy讀寫分離探討
MySQL Proxy是一個處于你的Client端和MySQL server端之間的簡單程序,它可以監(jiān)測、分析或改變它們的通信2012-11-11