一、问题现象

当使用python向mysql插入大数据时,可能会出现这样的错误:

(2013, 'Lost connection to MySQL server during query ([WinError 10053] 你的主机中的软件中止了一个已建立的连接。)')

或者

2006, \"MySQL server has gone away (ConnectionAbortedError(10053, '你的主机中的软件中止了一个已建立的连接。', None, 1005...

二、解决方案

这是因为传输的数据太大导致MySQL连接中断,从以下三处进行修改:

1、在python代码中增加连接超时设置和最大传输配置

def get_db_connection() -> Connection:
    """获取数据库连接"""
    return pymysql.connect(
        host=DB_CONFIG['host'],
        port=DB_CONFIG['port'],
        user=DB_CONFIG['user'],
        password=DB_CONFIG['password'],
        database=DB_CONFIG['database'],
        charset=DB_CONFIG['charset'],
        cursorclass=pymysql.cursors.DictCursor,
        connect_timeout=60,  # 连接超时时间  --新增这个配置
        read_timeout=60,     # 读取超时时间  --新增这个配置
        write_timeout=60,    # 写入超时时间  --新增这个配置
        max_allowed_packet=128*1024*1024  # 增加最大允许的数据包大小到128MB  --新增这个配置
    )

2、调整mysql本身的超时时间

show global variables like "%timeout%"; --交互式连接的超时时间  
set global interactive_timeout=86400;  

3、调整mysql的最大允许数据包大小

修改MySQL配置文件(my.cnf或my.ini)中的max_allowed_packet参数来实现:

[mysqld]
max_allowed_packet = 128M

该文件路径一般是:/etc/my.cnf/etc/mysql/my.cnf
修改完之后重启mysql服务。

如果不能重启服务,就使用SQL命令临时设置 max_allowed_packet 大小:

SHOW VARIABLES LIKE 'max_allowed_packet';  
SET GLOBAL max_allowed_packet = 134217728;  -- 128MB in bytes
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐