DigitalOcean Ubuntu 20.04下Python用SQLAlchemy连接MySQL被拒绝如何解决?
问题原因分析
- 环境变量取值异常:报错日志显示尝试登录的数据库用户为
or,与你预期使用的root用户不符,说明代码读取的DB_USER环境变量配置错误,可能是未配置、配置后未生效,或者运行代码的用户与配置环境变量的用户不一致。 - MySQL root用户默认认证策略限制:Ubuntu 20.04 系统默认安装的MySQL服务,root用户默认采用
auth_socket插件认证,仅允许操作系统root用户通过socket方式免密登录,这也是你执行sudo mysql -u root -p可以正常登录,但代码用密码连接会被拒绝的核心原因。 - 数据库权限配置缺失:即使用户名和密码配置正确,如果对应的MySQL用户没有
renko数据库的访问权限,或者允许登录的主机地址不匹配,也会触发该报错。
解决方案
- 验证环境变量配置
在代码初始化Database类前添加打印逻辑,确认环境变量取值是否符合预期:
print("DB_USER:", os.getenv('DB_USER')) print("DB_PASSWORD:", os.getenv('DB_PASSWORD')) print("DB_HOST:", os.getenv('DB_HOST')) print("DB_NAME:", os.getenv('DB_NAME'))
也可以直接在运行代码的终端执行echo $DB_USER查看取值,若不符合预期重新配置环境变量后再运行代码。
- 修改root用户认证方式(仅适用于使用root用户连接数据库的场景)
登录MySQL后执行以下命令,将root用户的认证方式改为密码认证:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你设置的root用户密码'; FLUSH PRIVILEGES;
修改完成后退出,执行mysql -u root -p(不加sudo)输入密码测试是否可以正常登录。
- 配置数据库访问权限
先确认renko数据库已创建,再给对应用户分配数据库权限:
CREATE DATABASE IF NOT EXISTS renko; GRANT ALL PRIVILEGES ON renko.* TO '你的应用数据库用户名'@'localhost'; FLUSH PRIVILEGES;
注意:生产环境不建议直接使用root用户连接应用,建议单独创建专属的MySQL用户分配给应用使用,降低安全风险。
内容的提问来源于stack exchange,提问作者orie
相关产品推荐
相关产品推荐

