Ubuntu16服务器Python连接本地MySQL报111连接拒绝故障求助
故障排查与解决方案
一、获取Python侧更详细的MySQL连接报错方法
- 捕获完整异常栈信息,可输出连接器所有内置错误字段及系统层错误原因,参考测试代码:
import mysql.connector import errno import os try: conn = mysql.connector.connect( host="127.0.0.1", user="你的数据库用户名", password="你的数据库密码", database="目标库名", port=3306, connection_timeout=10 ) except mysql.connector.Error as e: print(f"错误码: {e.errno}") print(f"错误描述: {e.msg}") print(f"完整异常参数: {e.args}") # 打印系统级连接错误原因 if e.errno == 2003: print(f"系统层拒绝原因: {os.strerror(errno.ECONNREFUSED)}") except Exception as e: print(f"非MySQL连接器异常: {str(e)}")
- 开启连接器调试日志,可输出完整的握手、地址解析、权限校验过程日志,在连接代码前添加:
import logging logging.basicConfig(level=logging.DEBUG)
二、问题根因排查说明
MySQL本身没有专门限制Python进程连接的独立配置,你遇到的报错100%是环境差异或配置错位导致,高概率命中以下场景:
- 首先排查解释器版本错位问题:你提到业务依赖Python3脚本,但系统默认Python版本为2.7.12,大概率是跑脚本时用错了解释器,或者对应版本的mysql-connector未安装/版本不兼容。可分别执行
python 测试脚本路径和python3 测试脚本路径验证结果差异。 - 优先排查最常见的连接方式差异坑:CLI执行
mysql命令默认走Unix套接字(路径一般为/var/run/mysqld/mysqld.sock),而Python连接器填写127.0.0.1时默认走TCP连接,若MySQL未开启TCP监听,哪怕CLI能正常登录也会报TCP连接拒绝。
验证方法:执行mysql -h 127.0.0.1 -u 你的用户名 -p测试TCP方式能否登录,若登录失败则说明MySQL未开启TCP监听,可在Python连接参数中添加unix_socket='/var/run/mysqld/mysqld.sock'强制走套接字连接,完全避开TCP层问题。 - 检查AppArmor拦截:Ubuntu 16默认启用AppArmor,可能存在规则限制Python进程访问3306端口,执行
dmesg | grep -i apparmor | grep -i python可查看是否有拦截日志,临时关闭验证可执行systemctl stop apparmor。 - 检查连接器版本兼容性:高于8.0版本的mysql-connector默认使用
caching_sha2_password认证插件,而MySQL 5.7默认认证插件为mysql_native_password,握手失败也会抛出连接错误,可在连接参数中添加auth_plugin='mysql_native_password'强制指定认证插件。
临时应急方案(快速推进迁移)
如果需要优先恢复脚本运行跳过排查,直接使用Unix套接字连接即可,参考代码:
conn = mysql.connector.connect( unix_socket='/var/run/mysqld/mysqld.sock', user="你的数据库用户名", password="你的数据库密码", database="目标库名", auth_plugin='mysql_native_password' )
内容的提问来源于stack exchange,提问作者MOLEDesign
相关产品推荐
相关产品推荐

