【问题标题】:SQLSTATE[HY000] [1698] Access denied for user 'root'@'localhost'SQLSTATE[HY000] [1698] 用户 'root'@'localhost' 的访问被拒绝
【发布时间】:2021-07-06 06:12:25
【问题描述】:

我刚刚安装了Ubuntu 16.04 (Xenial Xerus) 并在上面安装了 Web 服务器。一切正常,但我无法访问数据库。 即使我创建新用户并授予所有权限,我也无法创建数据库

在 PHP 中我收到此错误:

SQLSTATE[HY000] [1698] Access denied for user 'root'@'localhost'

当我尝试登录终端时,它可以工作,但在 PHP 和 phpMyAdmin 中却不行。

PHP 代码:

protected $host = '127.0.0.1';
protected $db = 'dbname';
protected $name = 'root';
protected $pass = 'root';
protected $conn;
private static $settings = array(
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
);

public function __construct() {
    try {
        $this->conn = new PDO("mysql:host=$this->host;dbname=$this->db", $this->name, $this->pass, self::$settings);
    } catch (PDOException $e) {
        echo $e->getMessage();
    }
}

【问题讨论】:

  • 没有代码...我只是用网络服务器、数据库等重新安装了整个 Ubuntu...现在我需要做的一件事是通过 phpmyadmin 或 PHP 在用户名 root 下使用密码登录根...
  • 在此处发布您的新用户创建和授予 priv 相关代码。
  • 创建用户:CREATE USER 'username'@'localhost' IDENTIFIED BY 'pass';并添加权限: GRANT ALL PRIVILEGES ON * 。 * TO 'newuser'@'localhost';然后 FLUSH PRIVILEGES;...当我这样做时,我可以登录但不能创建数据库....
  • Grant priv 应该像这样,因为您的用户名是 username : GRANT ALL PRIVILEGES ON * . * TO 'username'@'localhost';
  • 我在写评论时犯了一个错误...正如我所说:除了终端,我无法以 root 身份登录,但作为新用户,即使拥有所有权限,我也无法创建数据库

标签: php mysql authentication root


【解决方案1】:

MySQL 用户和服务器用户是两个不同的东西。查看如何将用户添加到数据库并使用这些凭据登录。

【讨论】:

  • 好的,这是我尝试过的,但即使我创建了具有所有权限的第二个帐户,我也无法创建数据库。我也重新安装了几次服务器......
【解决方案2】:

MySQL 区分“localhost”和“127.0.0.1”。

可能不允许 'root'@'localhost' 因为用户表中有一个条目只允许从 127.0.0.1 进行 root 登录。

这也可以解释为什么您的服务器上的某些应用程序可以连接到数据库,而有些则不能,因为连接到数据库的方式不同。而且你目前不允许通过“localhost”。

【讨论】:

    【解决方案3】:

    事实证明你不能在 5.7 中使用root 用户而不成为sudo'er。这意味着您不能只运行mysql -u root 而必须改为运行sudo mysql -u root

    这也意味着如果您在 GUI(或任何非命令行应用程序)中使用 root 用户,它将不再工作。要使其正常工作,您必须创建一个具有所需权限的新用户并使用它。

    更多详情请见this answer

    【讨论】:

    • 天哪,这到底是为什么。我花了几个小时才发现这一点。谢谢。
    • 非常感谢您提供这些信息。你是救世主。花了很长时间才碰到这里。
    • 你救了我的命!非常感谢
    • 所以现在各地的开发设置都必须在开始编码之前完成额外的几个步骤:(
    • 天哪!我花了大约 3 小时调试每一行代码...这很奇怪,因为我在多台服务器上拥有相同的环境,并且从未收到此错误。
    【解决方案4】:

    这些步骤在使用 Ubuntu 16.04 (Xenial Xerus)、Apache 2.4、MariaDB 和 PDO 的多个系统上对我有用:

    1. 以 root 身份登录 MYSQL

       mysql -u root
      
    2. 授予权限。对于新用户,执行:

       CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
       GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'localhost';
       FLUSH PRIVILEGES;
      

      Google Cloud 实例更新

      Google Cloud 上的 MySQL 似乎需要备用命令(注意反引号)。

       GRANT ALL PRIVILEGES ON `%`.* TO 'newuser'@'localhost';
      

      注意: 根据您的新用户是否应该能够向其他用户授予所有权限,您可以通过 GRANT WITH 选项扩展命令。请注意,这会将您的用户暴露为 sudoer,从而成为更高的安全风险。

       GRANT ALL PRIVILEGES ON `%`.* TO 'newuser'@'localhost' GRANT WITH OPTION;
      
    3. 绑定到所有地址:

      最简单的方法是注释掉你的行 /etc/mysql/mariadb.conf.d/50-server.cnf /etc/mysql/mysql.conf.d/mysqld.cnf 文件,取决于你运行的是什么系统: p>

        #bind-address = 127.0.0.1
      
    4. 退出 MySQL 并重新启动 MySQL

        exit
        service mysql restart
      

    默认情况下它只绑定到 localhost,但是如果你注释它绑定到它找到的所有接口的行。注释掉该行相当于 bind-address=*。

    要检查 MySQL 服务的绑定,请以 root 身份执行:

    netstat -tupan | grep mysql
    

    【讨论】:

    • 我刚刚在 MariaDB 10* 上执行此操作,用户以“i”开头。这会导致“'i”上出现奇怪的语法错误...它将其解释为 i 重音 aigu Í...并重新调整语法错误。奇怪的。我以为我把它放在这里了。
    • 可能要添加WITH GRANT OPTION ... stackoverflow.com/q/50177216/1815624
    • @CrandellWS 谢谢 - 添加
    【解决方案5】:

    用途:

    sudo mysql -u root
    

    现在在 MySQL 客户端中:

    use mysql;
    update user set plugin='' where User='root';
    flush privileges;
    \q
    

    现在您应该可以在 phpMyAdmin 中以 root 身份登录了。

    (发现here。)

    【讨论】:

    • 这个解决方案在Debian Stretch上安装Nextcloud时成功
    • @Matematikisto 这个你的命令给我带来了很大的问题,现在经过你的表扬,我什至不能用 mysql 命令访问 mysql,错误:mysql ERROR 1045 (28000): Access denied for user 'root'@'localhost'(使用密码:NO)
    • @Matematikisto 我的 mysql 在您的命令之前运行良好,我只是想以 phpmyadmin root 身份登录,现在我什至无法通过终端使用 mysql 控制台,甚至无法使用任何教过的重新配置提示在论坛中,每个命令都有一个不同的错误,在您的命令之前一切都很好!
    • 在 Ubuntu 18.04 和 MariaDB 10.1 上为我工作
    • @ArianeMartinsGomesDoRego 对于Access denied for user 'root'@'localhost' (using password: NO) 的问题,请尝试mysql -u root -p 而不是mysql -u root。 @Matematikisto 的原始答案解决了我的问题。
    【解决方案6】:

    对于 MySQL 客户端版本 14.14 和 Distrib 5.7.22,更新语句现在是:

    update user set authentication_string=password('1111') where user='root';
    

    【讨论】:

      【解决方案7】:

      为 phpMyAdmin 创建用户:

      sudo mysql -p -u root
      

      现在您可以使用您选择的用户名添加新的 MySQL 用户。

      CREATE USER 'USERNAME'@'%' IDENTIFIED BY 'PASSWORD';
      

      最后将超级用户权限授予刚刚创建的用户。

      GRANT ALL PRIVILEGES ON *.* TO 'USERNAME'@'%' WITH GRANT OPTION;
      

      【讨论】:

        【解决方案8】:

        只需为 MySQL 创建一个新用户;不要使用根。它的安全问题存在问题:

        sudo mysql -p -u root
        

        以 root 权限登录 MySQL 或 MariaDB

        CREATE USER 'troy121'@'%' IDENTIFIED BY 'mypassword123';
        

        登录并创建一个新用户:

        GRANT ALL PRIVILEGES ON *.* TO 'magento121121'@'%' WITH GRANT OPTION;
        

        并授予访问“.”的权限和 "@" "%" 任何位置,而不仅仅是 'localhost'。

        exit;
        

        如果你想查看你的权限表,SHOW GRANTS;enjoy

        【讨论】:

          【解决方案9】:

          如果您在创建新用户并为其分配数据库权限后仍收到该错误,那么最后要查看的一件事是检查是否已为用户分配了数据库中的权限。

          为此,请登录您的 MySQL 客户端(这可能是限制访问数据库的应用程序,但您作为 root 可以通过 mysql -u user -p 访问您的数据库表)。

          要应用的命令

          mysql -u root -p
          

          密码:(提供您的数据库凭据)

          登录成功后,输入

          use mysql;
          

          从这里开始,检查每个用户的权限是否从数据库表中启用,如下所示:

          select User,Grant_priv,Host from db;
          

          如果已创建用户的 Grant_priv col 的值为 N,则使用以下命令将该值更新为 Y:

          UPDATE db SET Grant_priv = "Y" WHERE User= "your user";
          

          有了这个,现在尝试访问应用程序并与数据库进行事务。

          【讨论】:

            【解决方案10】:

            简而言之,在 MariaDB 中:

            1. sudo mysql -u root;
            2. use mysql;
            3. UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('pass1234') WHERE User = 'root';
            4. FLUSH PRIVILEGES;
            5. exit;

            【讨论】:

            • 非常感谢!这一步对我有用,我搜索了一个多小时。很抱歉,我只有一票可以给你:-)
            • 1) 为什么是行号?使其完全复制/粘贴。 2)如果你需要用mysql命令指定'root',你已经遇到了问题——它会提示输入密码——这对于auth-sockets来说是错误的。 sudo su - 然后mysql 是您所需要的,如果使用auth-socket。它将使用当前用户登录访问权限进行 mysql 访问。请改正。 sudo mysql -u root; 应该是 sudo su -(如果不是 root)然后简单地是 mysql。您不需要分号来完成 shell 命令行 - 输入就足够了。这是多余的。
            • 另外,您的 mysql UPDATE 语句不适用于较新的版本。以 root 身份登录 mysql 后:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root'; THEN ALTER USER 'root'@'localhost' IDENTIFIED BY 'pass1234'; THEN FLUSH..
            【解决方案11】:

            我在Ubuntu 20.04(Focal Fossa)和 MySQL 8.0 中遇到了同样的问题,我执行以下步骤:

            1. 登录 MySQL

              sudo mysql -p -u root
              
            2. 显示添加到 MySQL 的用户

              SELECT user,plugin,host FROM mysql.user
              
            3. 将 root 用户插件从 auth_socket 更改为 mysql_native_password

              ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
              
            4. 刷新权限

              FLUSH PRIVILEGES;
              
            5. Ctrl + z 退出 MySQL

            6. 重启你的 MySQL 服务

              sudo service MySQL restart
              
            7. 检查您的 phpMyAdmin 页面并尝试登录。

            【讨论】:

              【解决方案12】:

              用途:

              sudo mysql -u root
              mysql> CREATE USER 'sample'@'localhost' IDENTIFIED BY 'Secure1pass!';
              mysql> CREATE DATABASE testdb;
              mysql> GRANT ALL PRIVILEGES ON testdb . * TO 'sample'@'localhost';
              

              如果您只想在本地使用 Ubuntu 上的 MySQL 服务器并希望将您的应用程序连接到数据库。

              【讨论】:

              • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
              【解决方案13】:
              sudo mysql -u root
              mysql> USE mysql;
              mysql> UPDATE user SET plugin='mysql_native_password' WHERE User='root';
              mysql> FLUSH PRIVILEGES;
              mysql> exit;
              service mysql restart
              

              重启mysql服务器后请重新加载应用。

              【讨论】:

                猜你喜欢
                • 2017-02-02
                • 1970-01-01
                • 2018-07-22
                • 2019-12-01
                • 2020-01-16
                • 2020-08-20
                • 2018-10-08
                相关资源
                最近更新 更多