我使用 mysql 的 mysql-connector-python 庫,嘗試連接區域網路內其他設備的 MariaDB 資料庫,但是失敗了,而且是直接退出,沒有輸出任何錯誤訊息。

問題描述

軟體版本:

  • MariaDB server 10.11.6

  • mysql-connector-python 9.2.0

  • MariaDB server, IP 為 192.168.1.60

  • 客戶端,IP 為 192.168.1.35

Python 代碼如下:

import mysql.connector  
import logging  
  
# 配置日誌記錄  
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')  
  
try:  
    logging.info("Connecting to the database...")  
    connection = mysql.connector.connect(  
        host="192.168.1.60",  
        port=3306,  
        user="mysql",  
        password="xxx")  
    logging.info("Connection established.")  
  
    # 創建一個游標物件,用於執行 SQL 查詢  
    cursor = connection.cursor()  
  
    # 獲取所有資料庫  
    logging.info("Executing SHOW DATABASES query...")  
    cursor.execute("SHOW DATABASES")  
  
    # 打印所有資料庫及每個資料庫中的表名  
    for (database,) in cursor.fetchall():  
        logging.info(f"Database: {database}")  
  
        # 切換到當前資料庫  
        cursor.execute(f"USE {database}")  
  
        # 獲取並打印當前資料庫中的所有表  
        cursor.execute("SHOW TABLES")  
  
        for (table,) in cursor.fetchall():  
            logging.info(f"  Table: {table}")  
  
    # 關閉游標和連接  
    cursor.close()  
    connection.close()  
    logging.info("Connection closed.")  
  
except mysql.connector.Error as err:  
    logging.error(f"Error: {err}")  
except Exception as e:  
    logging.error(f"Unexpected error: {e}")

運行這段代碼之後,直接退出,沒有輸出任何錯誤訊息。

我查看 MariaDB 伺服器端的服務記錄,發現有如下錯誤訊息。

mariadbd: [Warning] Aborted connection 48 to db: 'unconnected' user: 'unauthenticated' host: '192.168.1.35' (This connection closed normally without authentication)

嘗試解決問題

因為 MariaDB 伺服器端可以收到連接的請求,所以說兩個設備的防火牆的配置都是正常的。

我檢查了登錄用戶的權限,發現也是正常的。

我查找了很多資料,嘗試了各種方法。但是無論如何,一直無法解決這個問題。

最後,嘗試使用另外一個 python 庫 pymysql (版本: 1.1.1) 連接 MariaDB 伺服器端,代碼如下:

import pymysql  
  
# 連接到 MariaDB 伺服器  
conn = pymysql.connect(  
    host="192.168.1.60",  
    port=3306,  
    user="mysql",  
    password="xxx"  
)  
  
cursor = conn.cursor()  
cursor.execute("SELECT VERSION()")  
print("MariaDB version:", cursor.fetchone()[0])  
  
cursor.close()  
conn.close()

沒有任何報錯,成功連接並打印 MariaDB 的版本。

但是還是不知道之前無法連接的原因。

本網頁的其他版本

本文章有多種語言的版本。

如果您想發表評論,請訪問以下網頁:

ZH EN ZH-TW JA

這些網頁僅支持瀏覽,無法發表評論或留言,但提供了更多語言選項,並且加載時間更短:

ZH EN ZH-TW JA RU KO CS ES AR FR PT DE TR IT NL SV DA FI PL UK HE RO HU EL HR TH HI BN ID SW VI NO