MySQL錯誤ERROR 2003 (HY000) Can't connect to MySQL server .' (111)

来源:https://www.cnblogs.com/kerrycode/archive/2023/03/24/17251451.html
-Advertisement-
Play Games

在MySQL中,如果訪問/連接MySQL資料庫時遇到“ERROR 2003 (HY000): Can't connect to MySQL server on 'xxx.xxx.xxx.xxx:xxx' (111)”這個錯誤,我們應該從哪些方面進行考慮和排查問題呢? 下圖是我總結整理的一個思維導圖, ...


在MySQL中,如果訪問/連接MySQL資料庫時遇到“ERROR 2003 (HY000): Can't connect to MySQL server on 'xxx.xxx.xxx.xxx:xxx' (111)”這個錯誤,我們應該從哪些方面進行考慮和排查問題呢? 下圖是我總結整理的一個思維導圖,在遇到這個錯誤時的排查方向和排查思路。

下麵來演示/介紹一個比較特殊的案例,在伺服器上訪問當前主機的MySQL時遇到了“ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1:7306' (111)”

$ mysql -h 127.0.0.1 -u test -p  --port=7306
Enter password: 
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1:7306' (111)
$ perror 111
OS error code 111:  Connection refused

其實訪問本地MySQL,根本不用檢查127.0.0.1這個IP是否能ping通,不過為了以防萬一,我們還是驗證一下

$ ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.046 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.073 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.071 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.072 ms
64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.071 ms
^C
--- 127.0.0.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4099ms
rtt min/avg/max/mdev = 0.046/0.066/0.073/0.013 ms

檢查MySQL實例狀態

然後我們檢查一下MySQL服務是否正常,MySQL實例是否Crash掉了。

方式1:

$ sudo systemctl status mysqld.service
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2023-03-13 15:01:43 CST; 1 weeks 2 days ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
 Main PID: 143115 (mysqld)
   Status: "Server is operational"
    Tasks: 47 (limit: 49256)
   Memory: 1.4G
   CGroup: /system.slice/mysqld.service
           └─143115 /opt/mysql/mysql8.0/bin/mysqld --defaults-file=/data/conf/my.cnf

Mar 13 15:01:40 yictmysqlu01 systemd[1]: Starting MySQL Server...
Mar 13 15:01:43 yictmysqlu01 systemd[1]: Started MySQL Server.

方式2:

ps -Af | grep mysqld | grep -v grep
mysql     143115       1  1 Mar13 ?        03:47:43 /opt/mysql/mysql8.0/bin/mysqld --defaults-file=/data/conf/my.cnf

如上所示,MySQL實例正常的,所以可以排除MySQL實例關閉或MySQL實例Crash的情況。

檢查MySQL的監聽埠

使用下麵命令檢查MySQL的監聽埠

$ netstat -lnp | grep mysql
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 192.168.9.203:7306      0.0.0.0:*               LISTEN      143115/mysqld       
tcp6       0      0 :::33060                :::*                    LISTEN      143115/mysqld       
unix  2      [ ACC ]     STREAM     LISTENING     3188552  143115/mysqld        /tmp/mysqlx.sock
unix  2      [ ACC ]     STREAM     LISTENING     3191315  143115/mysqld        /tmp/mysql.sock

如上所示,監聽埠為7306,訪問MySQL時指定的埠號也是7306,沒有什麼毛病。因此也可以排查這個因素。

檢查參數bind-address

檢查MySQL的配置文件中的bind-address參數

方式1:

$ grep bind_address my.cnf
bind_address=192.168.9.203

方式2:

mysql> SELECT VARIABLE_NAME, VARIABLE_VALUE
    -> FROM performance_schema.global_variables
    -> WHERE VARIABLE_NAME = 'bind_address';
+---------------+----------------+
| VARIABLE_NAME | VARIABLE_VALUE |
+---------------+----------------+
| bind_address  | 192.168.9.203   |
+---------------+----------------+
1 row in set (0.01 sec)

mysql>

bind-address的設置有以下三種情況:

bind-address=127.0.0.1  #只允許本機訪問。
bind-address=某個網卡的ip #例如bind-address=192.168.9.203,只能通過ip為192.168.9.203的網卡訪問。
bind-address=0.0.0.0    #此規則是系統預設配置,監聽所有網卡,即允許所有ip訪問。

這裡由於設定參數bind_address=192.168.9.203,所以當我們使用127.0.0.1訪問資料庫就會被拒絕,從而拋出上面的錯誤。

那麼這裡有一個問題,如果資料庫裡面創建了兩個賬號test@'127.0.0.1'和test@'localhost',那麼test@'localhost'是否也會遇到這個錯誤呢?你的答案是會還是不會呢? 正確答案是不會,因為localhost和127.0.0.1兩者是有所區別的(下麵部分內容來自參考資料[1]):

一、原理不同:

localhost的原理是不經網卡傳輸,不會受到網卡協議的限制。設置程式時本地服務用localhost,localhost不會解析成IP,也不會占用網卡、網路資源。 127.0.0.1的原理是經過網卡傳輸的,依賴網卡協議,並受到網卡相關協議的限制。使用IP訪問的時候,等於本機是通過網路再去訪問本機,會涉及到網路用戶的許可權。

二、概念不同

localhost:也可以叫是local,正確的解釋是:本地伺服器的意思。它可以被配置為任意的IP地址可以通過hosts這個文件進行更改,不過通常情況下都指向:127.0.0.1 127.0.0.1:在windows系統的正確解釋是:本機地址的意思。127.0.0.1是保留地址之一,用來檢驗本機TCP/IP協議棧,可以Ping回送地址。如果回送地址Ping不通,就說明IP堆棧出了故障。如果通的話,表明網路出了問題。

三、指向不同

localhost是一個保留功能變數名稱(RFC 2606) ,為了避免同狹義定義主機名混淆而單獨列出。它不僅指向 127.0.0.1 這個IP地址,它同時還可以指向ipv6 的地址 。 127.0.0.1 是回送地址,指本地機,測試使用。回送地址(127.x.x.x)是本機回送地址(Loopback Address),即主機IP堆棧內部的IP地址,主要用於網路軟體測試以及本地機進程間通信,無論什麼程式,一旦使用回送地址發送數據,協議軟體立即返回,不進行任何網路傳輸。

具體原因如下:

mysql -h 127.0.0.1 訪問MySQL的時候,使用 TCP/IP 連接

mysql -h localhost 訪問MySQL的時候,它不會使用 TCP/IP 連接的,而使用Unix socket;此時,MySQL Server則認為該 client 是來自 “localhost”

參考資料

[1]

參考資料: https://www.termilk.com/181.html

掃描上面二維碼關註我 如果你真心覺得文章寫得不錯,而且對你有所幫助,那就不妨幫忙“推薦"一下,您的“推薦”和”打賞“將是我最大的寫作動力! 本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接.
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 應用程式級別代碼壞味道 1.1. 布爾盲點 1.1.1. 由於函數使用布爾值而導致的信息缺失 1.1.2. 解決方案是將布爾替換為枚舉類型 1.2. 組合爆炸 1.2.1. 不同的代碼使用不同的參數組合來執行同一件事情的產物 1.2.2. 解決方案使用泛型 1.3. 人為複雜性 1.3.1.  ...
  • 1 降壓 電容有容抗,可以承擔分壓的作用。容抗計算如下 Xc=1/(2πfc) 其中 f 為電流頻率 ,c 為電容大小。 計算電容分壓時不要忘記電容電壓相位差與電阻等普通元件相差π/2。 例如下圖,若要電容分壓210v,則需要電容分擔電壓大小為Vc=(220^2-10^2)^0.5=219.77v, ...
  • 本系列旨在交流 ESP32-S3 硬體開發環境的搭建,通過一些基本的示例來展示怎麼用 ESP-IDF (Espressif IoT Development Framework) 來安裝、配置環境,並編譯、下載固件至 BPI-Leaf-S3 開發板等步驟。如果有什麼沒提到或者有問題的,歡迎各位留言交流... ...
  • 存儲過程 特定功能的的SQL指令 進行封裝 編譯之後存儲在資料庫伺服器中客戶端通過名字調用這個SQL指令集 優點: 防止SQL 在網路中惡意修改 無需客戶端編寫 通過網路傳送 存儲過程 SQL存在邏輯關係 支持流程式控制制 分支 迴圈 ##基本語法 創建存儲過程 輸入參數 a 輸入參數b 都是 int ...
  • windows安裝redis及配置教程,附網盤資源 鏈接:https://pan.baidu.com/s/1KvcyY27_q7aI2hQ7QRsEGA?pwd=iidx 一、windows系統安裝及配置 解壓文件,準備開始配置、安裝服務。 1.1、註冊redis的windows服務 在該文件夾中打 ...
  • windows安裝mysql8免安裝版教程,附網盤資源 鏈接:https://pan.baidu.com/s/1_qagfA-i7CbeWG3urIAlgw?pwd=iidx 提取碼:iidx 一、前言 本次使用的mysql版本為mysql8.0.32,安裝的系統為windows系統。使用免安裝的方 ...
  • 本文分享自華為雲社區《選擇KV資料庫最重要的是什麼?》,作者:GaussDB 資料庫 。 經常有客戶提到KV資料庫,但卻偏偏“不要Redis”。比如有個做安全威脅分析平臺的客戶,他們明確表示自己對可靠性要求非常高,需要的不是開源Redis這種記憶體緩存庫,而是KV資料庫。 雖然最後我也沒問清楚他們業務 ...
  • 一、工具介紹 YCSB 於 2010 年開源,YCSB是雅虎開源的NoSQL測試工具,通常用來對noSQL資料庫進行性能,註意此工具僅支持varchar和text類型,且列的長度可以增加,預設是10列,可以根據自己的需要增加列長。運行一個壓力測試需要 6 步: 配置需要測試的資料庫 選擇合適的資料庫 ...
一周排行
    -Advertisement-
    Play Games
  • 周末,寫點簡單的水一下。 新版本的vs創建項目的時候可以選擇自帶一個swagger。然而這隻是基本的swagger功能。 幾個介面無所謂啦,隨著介面越來越多,就這麼丟給你,一時間也會懵逼,所以這篇文章要做的有兩個功能。 給swagger文檔添加註釋 給swagger添加切換“版本”的功能(也可以理解 ...
  • 大家好,我是沙漠盡頭的狼。 本文首發於Dotnet9,介紹使用Lib.Harmony庫攔截第三方.NET庫方法,達到不修改其源碼並能實現修改方法邏輯、預期行為的效果,並且不限於只攔截public訪問修飾的類及方法,行文目錄: 什麼是方法攔截? 示常式序攔截 非public方法怎麼攔截? 總結 1. ...
  • 問題代碼: xmal:一個按鈕+一個顯示框 1 <Button Width="100" Height="50" Margin="10" Click="Button_Click">test</Button> 2 <TextBox x:Name="display" Width="300" Height= ...
  • 前置條件 ​ 阿裡雲伺服器一臺(可在購買伺服器時勾選安裝寶塔選項,免去後面的寶塔安裝) ​ 設置阿裡雲伺服器密碼並登陸伺服器 ​ 以下操作均在伺服器Linux中進行(使用遠程連接工具登錄) 寶塔登錄 登錄阿裡雲伺服器在Linux命令行中輸入bt,查看寶塔信息 ​ 根據寶塔信息提供的網站登陸寶塔服務( ...
  • GetTokenInformation 用於檢索進程或線程的令牌(Token)信息。Token是一個數據結構,其包含有關進程或線程的安全上下文,代表當前用戶或服務的安全標識符和許可權信息。GetTokenInformation函數也可以用來獲取這些安全信息,通常用於在運行時檢查某個進程或線程的許可權或安... ...
  • matplotlib 在1.0版本之前其實是不支持3D圖形繪製的。 後來的版本中,matplotlib加入了3D圖形的支持,不僅僅是為了使數據的展示更加生動和有趣。更重要的是,由於多了一個維度,擴展了其展示數據分佈和關係的能力,可以一次從三個維度來比較數據。 下麵介紹在matplotlib中繪製各類 ...
  • 編寫一個App就能編譯發佈到iOS、Android和Web等各大平臺的跨平臺技術,各大廠商一直都有研究和發佈對應技術產品,目前最熱門的莫過於Flutter框架了。而Dart作為其唯一的編程語言,今天我們開始來體驗一下…… ...
  • 實現基本的線程池 前提:我們要實現的線程池有如下功能: 基本的線程池模型 能提交和運行任務 能正常關閉線程池 線程的拒絕策略 線程池擴容 縮容線程池 代碼地址: 1、線程池的介紹? 線程池是什麼? 線程池是一種利用池化技術來管理線程的一種技術。 當沒有線程池的時候,我們如何創建線程? 繼承Threa ...
  • SDRAM基本信息 儲存能力計算 4X16X4=256(Mbit),註意不是MByte SDRAM控制 sdram包含兩個部分:sdram_ctrl、fifo_ctrl。 sdram_ctrl:其頂層為SDRAM的控制模塊內部實例化了5個模塊,有初始化、自刷新、寫和讀模塊,還有一個仲裁模塊對這四個不 ...
  • 歡迎訪問我的GitHub 這裡分類和彙總了欣宸的全部原創(含配套源碼):https://github.com/zq2599/blog_demos 本篇概覽 欣宸正在為接下新的Java雲原生實戰系列原創做準備,既然是實戰,少不了一套雲原生環境,以下內容是必不可少的: linux操作系統 kuberne ...