python + pymysql連接數據庫報“(2003, "Can't connect to MySQL server on 'XXX數據庫地址' (timed out)")”
前言:
由於項目最近更換了數據庫,導致執行python代碼連接數據庫的時候,出現“超時”或“由於連接方在一段時間后沒有正確答復或連接的主機沒有反應,連接嘗試失敗。”,代碼執行失敗了。目前使用的是polardb數據庫(類似mysql)
錯誤信息如下:
1、 數據庫連接失敗:(2003, "Can't connect to MySQL server on 'XXX數據庫的地址' (timed out)") 2、 (2003, "Can't connect to MySQL server on 'XXX數據庫的地址' ([WinError 10060] 由於連接方在一段時間后沒有正確答復或連接的主機沒有反應,連接嘗試失敗。)")
解決方案:
1、排查了本地端口沖突的問題,連接的遠程的服務器
2、和對應的服務器端工作人員排查,機器網絡正常(可能網絡時好時壞)
3、最后通過加上數據庫重連的機制解決
由於是首次遇到這種連接數據庫超時的問題,以前連接數據庫很少會有這種情況,所以原始代碼是不需要重連的,98%概率是成功連接上的
def connect_dbserver(self): """ 連接數據庫 """ try: self.db = pymysql.connect(**self.sql_config) self.cursor = self.db.cursor() except pymysql.Error as e: mylog.error("數據庫連接失敗:{0}".format(e))
加上重連機制的代碼,失敗了繼續重試,一般都可以連接上數據庫了
def connect_dbserver(self): """ 連接數據庫 """ retry_count = 10 init_connect_count = 0 connect_res = True while connect_res and init_connect_count < retry_count: try: self.db = pymysql.connect(**self.sql_config) self.cursor = self.db.cursor() # 連接上退出循環,連接不上繼續重連 connect_res = False except pymysql.Error as e: mylog.info("數據庫連接失敗,嘗試重連...,錯誤信息:{0}".format(e)) init_connect_count += 1