SQLSTATE[HY000] [1698] Access denied for user 'root'@'localhost' 用户 'root'@'localhost' 访问被拒绝。

80
我刚刚安装了 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,包括Web服务器、数据库等等...现在我需要的唯一一件事就是通过phpmyadmin或PHP使用用户名root和密码root登录... - lamka02sk
请在此处发布您的新用户创建和授予权限相关代码。 - Dipanwita Kundu
2
创建用户:CREATE USER 'username'@'localhost' IDENTIFIED BY 'pass'; 并添加权限:GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost'; 然后 FLUSH PRIVILEGES;...当我这样做时,我可以登录但无法创建数据库.... - lamka02sk
授权应该像这样,因为您的用户名是 usernameGRANT ALL PRIVILEGES ON * . * TO 'username'@'localhost'; - Dipanwita Kundu
默认密码为空,如下所示:$pass = ''; - JYoThI
显示剩余4条评论
16个回答

140

原来在5.7版本中不能再使用root用户,除非变成sudo用户。这意味着你不能再像以前一样直接运行mysql -u root,而是需要运行sudo mysql -u root

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

更多细节请参见此答案


2
所以现在各种开发环境都必须在编码开始之前多做几个额外的步骤 :( - user3791372
哦,天啊!我已经花了大约3个小时调试每一行代码...这很奇怪,因为我在多台服务器上都有相同的环境,并且从来没有遇到过这个错误。 - М.Б.
我遇到了与这个特定版本的MySQL相同的问题 >> mysql Ver 15.1 Distrib 10.3.22-MariaDB,for debian-linux-gnu(x86_64)using readline 5.2。我有一个旧版本,可以使用root用户连接,但这肯定不是最佳实践。 - devasia2112
有没有办法通过 PHP 脚本创建用户,而不是通过 CLI 手动创建? - bilogic

125

这些步骤在多个系统上验证可行,包括使用Ubuntu 16.04(Xenial Xerus)、Apache 2.4、MariaDB和PDO:

  1. 以root身份登录MYSQL

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

  •  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;
    
  • 绑定到所有地址:

    最简单的方法是注释掉您系统中 /etc/mysql/mariadb.conf.d/50-server.cnf/etc/mysql/mysql.conf.d/mysqld.cnf 文件中的这一行,具体取决于您正在运行的系统:

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

      exit
      service mysql restart
    
  • 默认情况下,它只绑定到本地主机,但是如果你注释掉这行,它会绑定到它找到的所有接口。注释掉该行相当于 bind-address=*。

    要检查 MySQL 服务的绑定,请以 root 用户身份执行以下命令:

    netstat -tupan | grep mysql
    

    我刚在一个用户名以“i”开头的MariaDB 10*上执行了这个操作。结果出现了一个奇怪的语法错误,指向“'i”...它将其解释为带有重音符号的 i,即 Í...并返回语法错误。很奇怪。我想在这里提一下。 - Marco Schoolenberg
    1
    可能需要添加 WITH GRANT OPTION ... https://dev59.com/X1UL5IYBdhLWcg3wjIlQ - CrandellWS
    1
    @CrandellWS 谢谢 - 已添加。 - leopold

    44

    使用:

    sudo mysql -u root
    

    现在在MySQL客户端中:

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

    现在您应该能够在phpMyAdmin中以root身份登录。

    (在这里发现 这里。)


    2
    在Debian Stretch上安装Nextcloud时,这个解决方案非常成功。 - ste
    5
    @Matematikisto你的指令给我带来了一个大问题,现在在你的推荐下,我甚至无法使用mysql命令访问mysql,出现错误:mysql ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)。 - Ariane Martins Gomes Do Rego
    3
    @Matematikisto 在你运行命令之前,我的 MySQL 功能良好,我只是试图以 phpmyadmin root 身份登录,但现在我甚至无法通过终端使用 MySQL 控制台,也无法使用论坛中教授的任何重新配置提示,每个命令都会出现不同的错误,在你的命令之前一切都很好! - Ariane Martins Gomes Do Rego
    1
    在我的Ubuntu 18.04上,搭配MariaDB 10.1可以正常工作。 - betasux
    1
    @ArianeMartinsGomesDoRego 对于“Access denied for user 'root'@'localhost' (using password: NO)”的问题,请尝试使用mysql -u root -p而不是mysql -u root。同时,@Matematikisto 的原始答案解决了我的问题。 - CocoaBob
    显示剩余5条评论

    12
    创建phpMyAdmin用户的步骤如下:
    sudo mysql -p -u root
    

    现在您可以使用自己选择的用户名添加一个新的MySQL用户。
    CREATE USER 'USERNAME'@'%' IDENTIFIED BY 'PASSWORD';
    

    最后,将超级用户权限授予您刚创建的用户。
    GRANT ALL PRIVILEGES ON *.* TO 'USERNAME'@'%' WITH GRANT OPTION;
    

    11

    使用ALTER USER更改用户或删除用户并重新创建都可以完美解决。

    DROP USER root@localhost;
    CREATE USER root@localhost IDENTIFIED BY 'root_password';
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost';
    FLUSH PRIVILEGES;
    

    天啊..这个问题困扰了我很久;有些应用程序可以使用root@localhost连接,而有些则不行。谢谢! - Reece
    这个很简单而且有效。 - Nuwan Thisara

    8

    简而言之,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;

    非常感谢!这一步对我很有用,我搜索了一个多小时。很抱歉我只能给你一个赞 :-) - Dushan Savich
    1. 为什么需要行号?这样可以完全复制/粘贴。
    2. 如果您需要在mysql命令中指定“root”,那么您可能会遇到问题——它会提示输入密码,但是对于auth-sockets而言,密码是错误的。如果使用auth-socket,则只需使用sudo su -然后输入mysql即可。它将使用当前用户登录访问mysql。请更正此内容。如果不是root,则sudo mysql -u root;应为sudo su -,然后简单地输入mysql。您不需要在shell命令行完成时使用分号——回车就足够了。这是多余的。
    - B. Shea
    此外,您的mysql UPDATE语句在较新版本上将无法工作。在以root身份登录mysql后:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root'; 然后 ALTER USER 'root'@'localhost' IDENTIFIED BY 'pass1234'; 然后刷新。 - B. Shea

    4
    MySQL区分“localhost”和“127.0.0.1”。
    可能是因为用户表中有一项限制了只允许从127.0.0.1登录的root用户,所以“root”@“localhost”不被允许。
    这也可以解释为什么您的服务器上某些应用程序可以连接到数据库,而有些则不能,因为连接到数据库的方式不同。而您当前没有通过“localhost”允许它。

    4

    不要使用root用户,为MySQL创建一个新用户。使用root用户存在安全问题:

    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;命令,然后享受即可。

    1
    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服务器后,请重新加载应用程序。


    1

    这个问题的回答中没有解决我的问题,但我很容易就解决了这个问题!

    只需打开文件 DEBIAN.CNF:

    /etc/mysql/debian.cnf

    您会找到默认的系统管理员用户名和密码!使用此帐户登录您的PhpMyAdmin,然后创建新用户等任何您想要的操作!

    # Automatically generated for Debian scripts. DO NOT TOUCH!
    [client]
    host     = localhost
    user     = debian-sys-maint
    password = 8pTMhYuRMW6jmMG1
    socket   = /var/run/mysqld/mysqld.sock
    [mysql_upgrade]
    host     = localhost
    user     = debian-sys-maint
    password = 8pTMhYuRMW6jmMG1
    socket   = /var/run/mysqld/mysqld.sock
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接