使用 PyMySQL,我无法连接到 RDS

Posted

技术标签:

【中文标题】使用 PyMySQL,我无法连接到 RDS【英文标题】:Using PyMySQL, I can't connect to RDS 【发布时间】:2018-03-18 12:46:02 【问题描述】:

使用Pymysql,我得到pymysql.err.OperationalError: (1045, u"Access denied for user 'my_user'@'<MY_IP_ADDRESS>' (using password: YES)"),但是,我可以在这台机器上使用相同的凭据从命令行或MySQL Workbench 登录。而且,我可以使用 PyMySQL 连接到localhost。这是我的示例测试代码:

import pymysql
prod_conn = pymysql.connect(
  host='correct-host-name.us-west-2.rds.amazonaws.com',
  user='my_user',
  password='correct_password',
  port=3306,
  database='my_db')

但是,在同一台机器上的命令行中使用mysql -hcorrect-host-name.us-west-2.rds.amazonaws.com -umy_user -pcorrect_password -P3306 -Dmy_db,我就可以正常使用了。

谷歌搜索后,我尝试检查用户的授权,并且我相信用户设置正确。 SHOW GRANTS FOR CURRENT_USER()返回

Grants for my_user@%
'GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO \'my_user\'@\'%\' WITH GRANT OPTION'

我尝试检查SELECT USER(), CURRENT_USER(); 并返回

USER()                      CURRENT_USER()
'my_user@<MY_IP_ADDRESS>'   'my_user@%'

所以,似乎用户设置正确,我怀疑这是因为我可以通过其他选项进行连接。我还尝试了https://forums.aws.amazon.com/thread.jspa?messageID=707103 的两个建议(具体来说,使用带有log_bin_trust_function_creators == 1 的不同参数组并使用不带标点符号的密码)无济于事。

我想在 lambda 函数中使用它,所以我真的很想使用 PyMySQL 来保持它是一个仅限 python 的解决方案,而不是尝试 MySQLDB 或其他库。

查看SELECT user,host FROM mysql.user;后我认为没有匿名用户

user        host
'my_user'   '%'
'mysql.sys' 'localhost'
'rdsadmin'  'localhost'

感谢这个社区可能对如何进行的任何其他想法...

【问题讨论】:

您可以尝试运行SHOW GRANTS FOR USER() 并报告吗? 是否有可能改为password='correct_password',你需要使用'passwd=correct_password'? @BrianDriscoll SHOW GRANTS FOR USER(); 是无效语句(根据 MySQL Workbench)。 SHOW GRANTS FOR my_user; 给出与SHOW GRANTS FOR CURRENT_USER(); 相同的响应 @olegsv 这是一个 kwarg,所以它应该在问题中输入。示例见github.com/PyMySQL/PyMySQL/blob/master/example.py#L6 @jcasner 在示例中是“passwd”,在您的代码中是“密码”。 【参考方案1】:

我通过创建一个新用户解决了这个问题。我只需要该用户的读取权限,因此与使用具有如此高权限的默认用户相比,这是一种更好的方法。我仍然不确定为什么原来的那个不起作用,但这是最终起作用的:

# Grants for my_new_user@%
'GRANT SELECT ON *.* TO \'my_new_user\'@\'%\''

【讨论】:

以上是关于使用 PyMySQL,我无法连接到 RDS的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 MySQL 工作台连接到 Amazon RDS

无法使用 MYSQL 工作台连接到亚马逊 RDS

无法使用 SQL Workbench 连接到 AWS RDS 数据库

无法连接到使用 Elastic Beanstalk 创建的 RDS 实例

无法通过 PDO 连接到 AWS RDS

无法从 MySQL Workbench 连接到 RDS MySQL 数据库