python + pymysql连接数据库报“(2003, "Can't connect to MySQL server on 'XXX数据库地址' (timed out)")”
阅读原文时间:2023年07月09日阅读:1

前言:

由于项目最近更换了数据库,导致执行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

参考:https://www.cnblogs.com/fanjp666888/p/8608406.html