【问题标题】:Accessing MySQL from Python 3: Access denied for user从 Python 3 访问 MySQL:用户拒绝访问
【发布时间】:2020-06-21 16:30:02
【问题描述】:

我尝试使用以下方法从 Python 3.3 访问 MySQL:

import mysql.connector

config = {
  'user': '###',
  'password': '******',
  'host': '##.##.#.##',
  'database': '########',
  'port': '####',
  'raise_on_warnings': True,
}

cnx = mysql.connector.connect(**config)

cnx.close()

但是当我运行上面的代码时,我得到了这个错误:

 mysql.connector.errors.ProgrammingError: 1045 (28000): Access denied for user '###'@'##.##.#.###' (using password: YES);

为什么会出现此错误,我该如何解决?

【问题讨论】:

    标签: python mysql


    【解决方案1】:

    我想再添加一个原因:您的 MySQL 和 mysql-connector-python 之间的版本不匹配。当我使用 MySQL 5.6.24-72.2-logmysql-connector-python==8.0.13 时,这个问题发生在我身上。降级到mysql-connector-python==8.0.5 解决了这个问题。虽然我使用的是 Python 2,但希望这能为调试提供更多线索。

    【讨论】:

    • 太棒了!说得好。这正是我想要的。
    【解决方案2】:

    正如您的异常消息所述,您需要从 MySQL 向您的 root 用户授予权限。首先,您从命令行或您最喜欢的 MySQL 客户端(例如 MySQL 工作台)登录到您的 MySQL。然后您向您的用户(在本例中为 root)授予权限。这个link描述了如何从控制台登录MySQL,例如,

    mysql -h localhost -u root -p

    那么你需要授予root用户权限,例如,

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password';
    

    使用密码为从任何主机 (%) 到 root 的所有数据库提供完全权限。如果在授予权限时可以从 Internet 访问此服务器,则需要小心。

    【讨论】:

      【解决方案3】:

      这意味着 MySQL 由于以下原因之一拒绝了连接:

      1. 用户名错误。
      2. 密码错误。
      3. 您连接的 IP 地址/主机名不是 MySQL 已配置为允许该用户使用的 IP 地址/主机名。
      4. 用户无权访问指定的数据库。

      MySQL 的用户实际上是用户和连接模式的组合。例如'user'@'10.0.23.99' 或 'test'@'%' 或 'fred'@'196.168.123.%' 或 'mary'@'%.example.com'

      使用 MySQL 客户端,检查“mysql”数据库中的“user”表,了解 MySQL 知道哪些用户以及可以连接的主机。

      例如

      mysql> SELECT user, host FROM mysql.user WHERE user = 'youruser';
      

      查看 MySQL 文档以了解如何添加用户。另请参阅如何授予对不同表等的访问权限。

      http://dev.mysql.com/doc/refman/5.5/en/adding-users.html

      http://dev.mysql.com/doc/refman/5.5/en/grant.html

      鉴于您的匿名 IP 地址看起来相同,我想您可能在运行 MySQL 的同一台机器上运行 Python 代码。如果是这样,您可能会发现您正在使用服务器的外部 IP 地址,而 MySQL 可能配置为仅接受来自 localhost/127.0.0.1 的连接。如果是这样,请尝试更改您要连接的 IP 地址。此外,通常如果您在数据库服务器上运行,您可以通过 Unix 域套接字而不是通过 TCP/IP 进行连接。为此,只需省略主机和端口参数即可。

      【讨论】:

        【解决方案4】:

        我收到此错误是因为我的配置文件中有引号。

        [mysql]
        username: 'uuuu'
        password: 'pppp'
        host: 'localhost'
        database: 'dddd'
        

        给了我错误。但是,删除引号有效:

        [mysql]
        username: uuuu
        password: pppp
        host: localhost
        database: dddd
        

        【讨论】:

        • .my.cnf 文件中使用引号在命令行运行mysql 时可以正常工作,但在使用python mysql.connector 时则不行。 @paperduck 的这个答案对我来说是正确的。
        • 谢谢这是我的问题,使用 .env 文件和 docker-compose.yml
        【解决方案5】:

        我在完成同样的任务时遇到了很多麻烦。这对我有用:

        我必须使用旧密码加密选项(与 MySQL 5.x 兼容)初始化一个新数据库:

        Database initialization options screenshot

        一旦我这样做了,一切都很好。我从这篇文章中得到了这个建议:

        https://tableplus.com/blog/2018/07/failed-to-load-caching-sha2-password-authentication-plugin-solved.html

        以下是一些规格:

        • 我使用的是 Python 3.7
        • 我安装了 MySQL 8.0.17 和 mysql-connector-python 2.0.4

        【讨论】:

          【解决方案6】:

          我在尝试将数据从 python 脚本传输到 Raspberry Pi 上的 MySQL 数据库时遇到了这个问题。

          当您最初安装 MySQL 时,它会使用您输入的任何密码将您设置为用户“root”。如果您后来更改了安全设置以使用强密码(就像我一样),您的密码必须包含大写、小写、数字和特殊字符。

          这可能是您尝试连接到数据库时引发错误的原因。

          解决这个问题:

          登录 MySQL: sudo mysql --user=root

          删除根用户: DROP USER 'root'@'localhost'; 创建一个新用户: CREATE USER 'root'@'localhost' IDENTIFIED BY 'password'; 授予用户所有权限: GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;

          【讨论】:

            【解决方案7】:

            对我来说,它修复了正确的端口(安装时更改了默认端口,因为它已经被使用了)。

            【讨论】:

              【解决方案8】:

              用 mysql 命令行客户端试试同样的方法:

              mysql -h ##.##.#.## -P #### -u ### -p ########
              

              【讨论】:

                猜你喜欢
                • 2018-11-28
                • 2016-06-12
                • 2017-02-02
                • 2017-07-19
                • 2019-01-24
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多