Connection refused 错误本质是TCP连接被拒,非认证失败;需先检查MySQL服务状态,再确认bind-address是否为127.0.0.1(导致仅本地监听),修改为0.0.0.0并重启服务,同时验证ss -tlnp | grep :3306显示*:3306。

Connection refused 错误说明和排查路径
出现 OperationalError: (2003, "Can't connect to MySQL server on 'xxx' (111)"),本质是 TCP 连接被拒,不是认证失败。先确认 MySQL 服务是否真在运行:systemctl status mysql(Linux)或检查 Windows 服务里 mysqld 是否启动。
常见漏点:MySQL 默认只监听 127.0.0.1,如果用 localhost 或容器 IP 连接,可能因 DNS 解析或绑定地址不匹配失败。查配置:bind-address 在 /etc/mysql/mysql.conf.d/mysqld.cnf 中是否为 127.0.0.1 或 0.0.0.0;若改了,记得 sudo systemctl restart mysql。
- 本地连接用
127.0.0.1而非localhost,避免 Unix socket 路径干扰 - Docker 场景下,Python 容器连 MySQL 容器时,别用
localhost,要用服务名(如mysql)或宿主机 IP(host.docker.internal) - 云数据库(如阿里云 RDS)需检查安全组是否放行 3306 端口,且白名单包含你的出口 IP
Access denied 错误的权限与认证方式问题
OperationalError: (1045, "Access denied for user 'xxx'@'yyy' (using password: YES)") 表明用户名/密码/主机匹配失败,或认证插件不兼容。
MySQL 8.0+ 默认用 caching_sha2_password 插件,而旧版 mysqlclient 或某些驱动不支持。解决方法分两路:
立即学习“Python免费学习笔记(深入)”;
调用 Cutout.Pro 视觉处理 API 进行背景移除、人像抠图和照片增强,支持文件上传与图片 URL 输入。
- 降级用户认证方式(临时方案):
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_pass'; FLUSH PRIVILEGES; - 升级驱动:用
pymysql(纯 Python,自带兼容)或新版mysqlclient>=2.1.0 - 检查授权语句是否精确匹配 host:比如创建用户时用了
'user'@'192.168.1.%',但连接时来源 IP 是192.168.2.100,就会拒绝
Lost connection during query 的超时与长查询处理
OperationalError: (2013, "Lost connection to MySQL server during query") 多见于执行耗时 SQL(如未加 LIMIT 的全表 JOIN)或网络不稳定。根本原因是 MySQL 主动断开空闲或超时连接。
关键参数要对齐:Python 驱动的 connect_timeout、read_timeout 必须 ≤ MySQL 的 wait_timeout 和 interactive_timeout(单位秒)。默认后者常为 28800(8 小时),但某些云服务会设成 60 秒。
- 连接时显式设置超时:
mysql.connect(..., connect_timeout=10, read_timeout=30) - 长查询拆解:避免单次 fetch 百万行,改用
cursor.fetchmany(size=1000)分批读取 - 连接池场景(如 SQLAlchemy)务必启用
pool_recycle=3600,防止复用过期连接
字符集不匹配导致的插入乱码或报错
插入中文时报 OperationalError: (1366, "Incorrect string value: '\xE4\xB8\xAD\xE5\x9B\xBD...'"),说明客户端、连接、表三处字符集不一致。
最简验证法:连上 MySQL 后执行 SHOW VARIABLES LIKE 'character_set%';,重点看 character_set_client、character_set_connection、character_set_database 是否都为 utf8mb4。Python 连接时必须指定:
-
charset='utf8mb4'(不是utf8,后者在 MySQL 中仅支持 3 字节 UTF-8) - 建表时显式声明:
CREATE TABLE ... DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci - 若用 SQLAlchemy,URL 后加
?charset=utf8mb4,且引擎创建时传connect_args={'charset': 'utf8mb4'}
字符集问题往往不会立刻报错,而是等插入特殊符号(emoji、生僻字)时才暴露,容易被忽略。

















