我无法弄清楚这一点,我不知道如何为它编码。
def get_connection():
cnx = MySQLdb.connect(**DB_CONFIG)
print("Connected")
cnx.close()
print("Closed")
12:08 $ python test_mysql.py && python test_mysql.py
Connected
Closed
Traceback (most recent call last):
File "test_mysql.py", line 4, in <module>
get_connection()
File "XX"/mysql/tbred_mysql.py", line 7, in get_connection
cnx = MySQLdb.connect(**DB_CONFIG)
File "XX/lib/python2.7/site-packages/MySQLdb/__init__.py", line 81, in Connect
return Connection(*args, **kwargs)
File "XX/lib/python2.7/site-packages/MySQLdb/connections.py", line 193, in __init__
super(Connection, self).__init__(*args, **kwargs2)
_mysql_exceptions.OperationalError: (1045, "Access denied for user 'XXXX'@'10.0.8.5' (using password: YES)")
我在彼此之后运行它们因为它更容易演示但你可以等待10或15秒但它仍然会发生。我工作,但事实并非如此。
当它失败时,没有任何内容写入mysql错误日志。如果我将用户更改为不存在的强制此错误的内容,则会将记录写入mysql错误日志。
编辑: 我可以在没有python的情况下重现问题。如果我尝试通过linux中的mysql命令行客户端远程连接,我得到相同的结果。此外,我发现它不是随机的其他所有连接,无论尝试之间的时间。第1次工作,第2次错误,第3次工作,第4次错误再次与它们之间的时间无关紧要。此外,对于这些故障,它们不会像正常访问被拒绝消息一样记录到mysql错误日志中。
失去理智!
答案 0 :(得分:1)
从我上面的评论中重复这一点。
设置选项skip_name_resolve
可以解决您的问题。
默认情况下,MySQL Server尝试对客户端IP地址执行反向DNS查找,以确保您的用户从授权主机名登录。如果您的本地DNS服务器速度缓慢或间歇性,则会出现此问题。它可能会减慢甚至导致MySQL连接错误,并且不清楚原因。
使用skip_name_resolve
告诉服务器跳过此验证。这应该可以消除错误并降低DNS的性能。
这意味着您无法在GRANT
语句中使用主机名。您必须通过IP地址或通配符(如%
)识别用户的授权客户端主机。
https://dev.mysql.com/doc/refman/5.7/en/host-cache.html说:
要禁用DNS主机名查找,请使用--skip-name-resolve选项启动服务器。在这种情况下,服务器仅使用IP地址而不使用主机名来匹配连接主机与MySQL授权表中的行。只能使用使用IP地址在这些表中指定的帐户。 (确保存在指定IP地址的帐户,否则您可能无法连接。)
通配符也可以。例如,您可以GRANT ALL PRIVILEGES ON *.* TO 'username'@'192.168.%'
。
答案 1 :(得分:0)
必须使用服务器的ip而不是主机名。问题是由服务器上的DNS解析问题引起的。它失败的方式仍然让我大吃一惊。