Mysql

ODBC 在沒有外部網路的情況下無法連接到內部 MySQL

  • March 6, 2018

執行 ODBC 5.2 (10.0.0.10) 和 MySQL 4.x (10.0.0.50)。是的,我知道 ODBC 5.x 並不正式支持 MySQL 4.x,但它工作正常大約 8 個月到現在,當我們在 ISP 上遇到小問題並且外部網路不是那麼穩定時。

問題是當外部網路正常工作時,ODBC 可以很好地與 MySQL 建立連接,但是當我們遇到外部網路問題時,10.0.0.10 (ODBC) 和 10.0.0.50 (MySQL) 之間的連接會停止。

OLE DB provider "MSDASQL" for linked server "xyz" returned message\
"[MySQL][ODBC 5.2(w) Driver]Lost connection to MySQL server at\
'waiting for initial communication packet', system error: 10060".

Cannot initialize the data source object of OLE DB "MSDASQL" for linked server "xyz".

…而且更有趣的是,我可以ping在 ODBC 和 MySQL 機器之間成功連接,甚至可以telnet在外部網路不工作且 ODBC 連接失敗時從 10.0.0.10 到 10.0.0.50 進行 3306。

這引出了我的問題……為什麼 ODBC 不能在沒有外部網路的情況下連接到 MySQL?我錯過了什麼還是應該降級到 ODBC 3.51?

對於每個新的客戶端連接,伺服器使用客戶端 IP 地址檢查客戶端主機名是否在主機記憶體中。如果沒有,伺服器會嘗試解析主機名。首先,它將 IP 地址解析為主機名,然後將該主機名解析回 IP 地址。然後它將結果與原始 IP 地址進行比較,以確保它們相同。

https://dev.mysql.com/doc/refman/5.7/en/host-cache.html

(此處的文件是 5.x,但此行為存在於 5.x 之前)。

假設外部網路的失去也意味著 MySQL 伺服器無法再訪問 DNS 伺服器,那麼缺乏及時的 DNS 響應將停止握手邏輯,直到他們得到某種超時錯誤……此時,ODBC 已經放棄並拋出此錯誤。

解決方案是通過使用啟動伺服器來禁用每個客戶端連接的反向 DNS 查找--skip-name-resolve。除非您在 mysql.user 表中有使用者在Host列中具有實際主機名,否則預設行為沒有實際價值。

引用自:https://dba.stackexchange.com/questions/162437