SQLSTATE[HY000] [1698] 用户“root”@“localhost” 的访问被拒绝

2022-08-30 08:42:39

我刚刚安装了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();
    }
}

答案 1

事实证明,如果不成为sudo'er,您就无法再在5.7中使用该用户。这意味着您不能再只是跑步,而必须这样做。rootmysql -u rootsudo mysql -u root

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

有关更多详细信息,请参阅此答案


答案 2

这些步骤适用于使用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上的MySQL似乎需要备用命令(请注意反引号)。

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

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

     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 文件中的行,具体取决于您运行的系统:

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

      exit
      service mysql restart
    

默认情况下,它仅绑定到 localhost,但如果您注释该行,它将绑定到它找到的所有接口。注释掉该行等效于 bind-address=*。

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

netstat -tupan | grep mysql

推荐