mysql (mariadb) ERROR 1698 (28000): 用户“root”@“localhost”的访问被拒绝

d72*_*17c 24 linux passwords mysql mariadb

我正在开发 Xubuntu 15.04。我已经在各种系统上安装了 MariaDB-Server,并且在安装过程中总是被要求输入 root 密码。然而,这一次,我不记得被要求输入密码。当我尝试在没有密码(或空白密码)的情况下登录时,Access denied for user 'root'@'localhost'出现错误。我尝试通过以下方式完全卸载软件包

sudo apt-get remove mariadb-server
sudo apt-get purge mariadb-server
Run Code Online (Sandbox Code Playgroud)

当我重新安装时,我仍然没有被要求输入 root 密码。

我试图mysqld --skip-grant-tables从方法 mysql如何解决访问被拒绝的用户“根” @“localhost”的。我可以在 mysql 数据库中修改 root 用户的密码 - 至少哈希值会发生变化 - 但是在重新启动 mysql-server 后我仍然无法使用新密码登录。我仍然遇到同样的错误。

用户 debian-sys-maint 不存在。所以,我不能用它来修复任何东西。

任何想法我还能尝试什么?

小智 37

您需要重置密码。所以为此

sudo mysql -u root
use mysql;
update user set plugin='' where User='root';
flush privileges;
exit;
Run Code Online (Sandbox Code Playgroud)

  • 这种方法的一个不明显的“魔法”是 root 操作系统用户无需指定密码即可登录数据库,因为默认情况下启用了 `plugin: auth_socket`。换句话说,不需要像过去的 MySQL 版本那样使用 `--skip-grant-tables`。(此外,从技术上讲,此措施不是“重置密码”;而是禁用插件。) (10认同)
  • 这种方法以后会出现问题。如果您禁用该插件,每日 cron 作业将中断,因为它假设它可以使用该插件登录。详情请看我的回答。 (5认同)

col*_*lan 11

新设置的想法是您根本不应该使用密码。有关详细信息,请参阅UNIX_SOCKET 身份验证插件

特别相关的是Ubuntu 16.04上/usr/share/doc/mariadb-server-10.0/README.Debian.gz的内容:

在新安装时不会设置 root 密码,也不会再创建 debian-sys-maint 用户。相反,MariaDB 根帐户设置为使用 unix 套接字进行身份验证,例如任何由根或通过 sudo 调用的 mysqld 都会让用户看到 mysqld 提示。

您可能永远不会删除 mysql 用户“root”。尽管没有设置密码,但 unix_auth 插件确保它只能以 root 用户身份在本地运行。

/etc/mysql/debian.cnf 中的凭据指定了 init 脚本用来停止服务器和执行日志轮换的用户。这个曾经是 debian-sys-maint 用户,不再作为 root 可以直接运行。

因此,如果您为 root 禁用该插件并设置密码,则日常 cron 作业将中断,因为它假设它将在没有密码的情况下以 root 身份登录,但使用插件。

后来它说:

脚本应该在用户拥有所需授权并通过 unix_socket 识别时运行。

因此看起来应用程序不应再使用密码。


d72*_*17c 2

我按照这篇文章的答案解决了问题:

无法重置 MySQL (MariaDB) root 密码

必须将所有根目录的 mysql.user 的插件字段更改为空白字符串。

  • 这种方法稍后会引起问题。如果禁用该插件,每日 cron 作业将会中断,因为它假设可以使用该插件登录。详情请参阅我的回答。 (3认同)