【发布时间】: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”,在您的代码中是“密码”。
标签: python mysql amazon-web-services rds pymysql