如何阻止pymysql或mysql.connector将localhost解析为IPv6?
解决Python连接MySQL时
Access denied for user 'user_name'@'::1'的问题 一、阻止localhost解析为IPv6的方法
修改服务器的/etc/hosts文件,调整localhost的解析优先级:
- 用sudo权限打开
/etc/hosts - 将
127.0.0.1 localhost放在::1 localhost之前,或者直接注释掉IPv6的映射行:# ::1 localhost ip6-localhost ip6-loopback 127.0.0.1 localhost - 保存后立即生效,系统会优先用IPv4解析localhost
二、无需修改解析的替代方案
1. 使用Unix套接字连接(推荐)
PHP连接localhost默认走Unix套接字而非TCP/IP,这是它能正常连接的核心原因。Python的MySQL库也支持指定套接字路径,绕过TCP/IP解析环节:
- 先向服务商确认MySQL的套接字路径(常见路径如
/var/run/mysqld/mysqld.sock或/tmp/mysql.sock) - 修改连接代码:
针对mysql.connector:
针对conn = mysql.connector.connect( host='localhost', user='user_name', password='password', database='db_name', unix_socket='/var/run/mysqld/mysqld.sock' # 替换为实际路径 )pymysql:conn = pymysql.connect( host='localhost', user='user_name', passwd='password', db='db_name', unix_socket='/var/run/mysqld/mysqld.sock' # 替换为实际路径 )
2. 强制客户端使用IPv4
部分MySQL客户端库支持强制IPv4连接,避免解析到IPv6:
- 对于
mysql.connector,添加force_ipv4=True参数(需确认库版本支持):conn = mysql.connector.connect( host='localhost', user='user_name', password='password', database='db_name', force_ipv4=True )
三、向服务商询问的关键点
- 提供MySQL服务的Unix套接字具体路径
- 是否可以为
user_name账号添加user_name@'::1'或user_name@'127.0.0.1'的访问权限 - 明确要求使用
localhost连接的具体原因,是否涉及特定配置限制
内容的提问来源于stack exchange,提问作者mgolunski
相关产品推荐
相关产品推荐

