MySQL連接指定端口后實(shí)際仍是3306的原因分析及解決方法
MySQL 連接指定端口后,為什么實(shí)際仍是 3306?
在日常運(yùn)維或開發(fā)過程中,有時(shí)我們?cè)谑褂?mysql 命令行工具連接 MySQL 實(shí)例時(shí),可能會(huì)遇到一個(gè)令人疑惑的問題:
mysql -u root -p -P 3307
本以為連接的是監(jiān)聽在 3307 端口的 MySQL 實(shí)例,但登錄進(jìn)去后執(zhí)行:
SELECT @@hostname, @@port;
卻發(fā)現(xiàn):
+----------------+--------+ | @@hostname | @@port | +----------------+--------+ | your-hostname | 3306 | +----------------+--------+
也就是說,實(shí)際連接的是 3306 端口,而不是我們指定的 3307。這是為什么?本文將為你詳細(xì)解答。
問題現(xiàn)象復(fù)現(xiàn)
命令:
mysql -u root -p -P 3307
登錄成功后執(zhí)行:
SELECT @@port;
輸出結(jié)果卻是:
3306
這說明當(dāng)前連接的 MySQL 實(shí)例監(jiān)聽端口為 3306,而不是我們指定的 3307。
原因分析
沒有指定 -h,默認(rèn)走的是本地 Unix Socket
MySQL 客戶端有兩種連接方式:
- Unix Socket(本地文件方式),路徑一般是
/tmp/mysql.sock - TCP/IP(網(wǎng)絡(luò)方式)
當(dāng)你沒有指定 -h 參數(shù)時(shí),例如:
mysql -u root -p -P 3307
MySQL 客戶端會(huì)默認(rèn)使用 Unix Socket 方式連接本地 MySQL 實(shí)例,而不是 TCP 連接。
而本地默認(rèn)的 Socket 通常連接的是 MySQL 默認(rèn)端口 3306 的實(shí)例。這就解釋了為什么你看到的是 @@port = 3306。
提示:-P 端口號(hào)只在 TCP 連接中才會(huì)生效,Socket 連接時(shí)會(huì)被忽略。
多實(shí)例環(huán)境中未顯式指定目標(biāo)地址
如果你在本機(jī)運(yùn)行了多個(gè) MySQL 實(shí)例(例如一個(gè)監(jiān)聽 3306,另一個(gè)監(jiān)聽 3307),但沒有明確指定連接主機(jī)地址,則默認(rèn)連接的是 3306 監(jiān)聽的實(shí)例。
正確的連接方法
為了確保連接到指定端口上的實(shí)例,你需要強(qiáng)制使用 TCP 連接方式。
方法一:添加 -h 127.0.0.1
mysql -u root -p -P 3307 -h 127.0.0.1
指定主機(jī)地址為 127.0.0.1,客戶端就會(huì)使用 TCP 協(xié)議連接指定端口。
方法二:添加 --protocol=TCP
mysql -u root -p -P 3307 --protocol=TCP
這個(gè)參數(shù)顯式告訴 MySQL 客戶端使用 TCP 協(xié)議,而不是默認(rèn)的 Socket。
驗(yàn)證是否連接成功
進(jìn)入 MySQL 后執(zhí)行以下命令驗(yàn)證:
SELECT @@hostname, @@port, @@socket;
如果你看到的是:
+-------------+--------+----------------------+ | @@hostname | @@port | @@socket | +-------------+--------+----------------------+ | localhost | 3307 | NULL | +-------------+--------+----------------------+
說明你成功通過 TCP 連接到了監(jiān)聽 3307 的實(shí)例。
附加說明
如果你使用 socket 配置了多個(gè)實(shí)例,可能存在多個(gè) 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
此時(shí)命令行客戶端也可以用 --socket 顯式連接對(duì)應(yīng)實(shí)例:
mysql -u root -p --socket=/var/lib/mysql3307/mysql.sock
總結(jié)
| 問題原因 | 解決方法 |
|---|---|
| 未指定 -h,默認(rèn)走本地 Socket,連接到了 3306 實(shí)例 | 使用 -h 127.0.0.1 或 --protocol=TCP 強(qiáng)制使用 TCP 連接 |
| 本機(jī)有多個(gè) MySQL 實(shí)例,未顯式指定主機(jī)或 socket 文件 | 使用 --socket=路徑 或 TCP 方式連接指定端口 |
建議
以后如果你需要連接指定端口的 MySQL 實(shí)例,務(wù)必顯式指定 -h 參數(shù)或使用 --protocol=TCP,否則 -P 參數(shù)可能不會(huì)生效。
以上就是MySQL連接指定端口后實(shí)際仍是3306的原因分析及解決方法的詳細(xì)內(nèi)容,更多關(guān)于MySQL連接指定端口實(shí)際是3306的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MySQL億級(jí)數(shù)據(jù)平滑遷移雙寫方案實(shí)戰(zhàn)
預(yù)約業(yè)務(wù)與其他業(yè)務(wù)數(shù)據(jù)表存儲(chǔ)在同一個(gè)數(shù)據(jù)庫,當(dāng)其他業(yè)務(wù)出現(xiàn)慢SQL等異常時(shí),會(huì)影響到預(yù)約業(yè)務(wù),為了提高系統(tǒng)穩(wěn)定性和數(shù)據(jù)隔離性,需要將預(yù)約數(shù)據(jù)表從原來的數(shù)據(jù)庫中遷移出來,單獨(dú)建立數(shù)據(jù)庫,涉及到的讀寫場景多,改造成本大,采用 Mybatis插件實(shí)現(xiàn)遷移所需的雙寫等功能2024-08-08
MySQL數(shù)據(jù)庫觸發(fā)器從小白到精通
觸發(fā)器是SQLserver提供給程序員和數(shù)據(jù)分析員來保證數(shù)據(jù)完整性的一種方法,它是與表事件相關(guān)的特殊的存儲(chǔ)過程,它的執(zhí)行不是由程序調(diào)用,也不是手工啟動(dòng),而是由事件來觸發(fā),比如當(dāng)對(duì)一個(gè)表進(jìn)行操作時(shí)就會(huì)激活它執(zhí)行。觸發(fā)器經(jīng)常用于加強(qiáng)數(shù)據(jù)的完整性約束和業(yè)務(wù)規(guī)則等2022-03-03
mysql8.0.19基礎(chǔ)數(shù)據(jù)類型詳解
這篇文章主要介紹了mysql8.0.19基礎(chǔ)數(shù)據(jù)類型的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2020-03-03
linux環(huán)境下安裝mysql數(shù)據(jù)庫的詳細(xì)教程
這篇文章主要介紹了linux環(huán)境下安裝mysql數(shù)據(jù)庫的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06

