Mysql python - 随机(每次其他尝试)都被拒绝访问

时间:2017-10-27 16:13:30

标签: mysql python-2.7

我无法弄清楚这一点,我不知道如何为它编码。

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错误日志中。

失去理智!

2 个答案:

答案 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解析问题引起的。它失败的方式仍然让我大吃一惊。