新安装的MariaDB(MySQL)无法登入root – ERROR 1698 (28000): Access denied for user ‘root’@’localhost’

新安装的的MariaDB(MySQL)死活登陆不进去,即便是完全卸载重装,更抽象的是,我都没设置密码,第一次安装,居然管我要密码,而且tm修改密码也不起作用。

之后的重新安装,问题似乎显现了出来,一直提示我 ERROR 1698 (28000): Access denied for user 'root'@'localhost'

这个问题在新安装的MariaDB(MySQL)算是比较常见了。大概是什么引起的呢。

本文针对 MariaDB / MySQL

前言

新安装的 MariaDB(MySQL) 一直报错:ERROR 1698 (28000): Access denied for user ‘root’@’localhost’

这个错误通常意味着 MariaDB 为 root@localhost 用户配置了 unix_socket (或 auth_socket) 身份验证插件。这种插件允许您在满足以下条件时无需密码即可登录:
1.您正在以操作系统中的 root 用户身份运行 mysql 客户端。(sudo)
2.或者,您正在以 MariaDB 服务运行时所使用的同一 Unix 用户身份通过 Unix 套接字文件连接。

为什么我完全卸载了 MariaDB(MySQL) 还是要求我输入root密码?

当您“完全卸载”并重新安装 MariaDB 时,Homebrew 会执行 MariaDB 的标准初始化过程。许多现代的数据库系统,包括 MariaDB,出于安全考虑,在新的、干净的安装中会为 root@localhost 用户默认启用类似 unix_socket 的身份验证。这样做是为了防止在初始设置完成前 root 账户没有密码而容易受到攻击。

所以,即使您清除了所有旧数据,新安装的 MariaDB 也会遵循其默认的安全设置,这就解释了为什么您会遇到这个错误。您之前的操作(完全卸载)是正确的,现在遇到的问题是新安装的默认行为。

解决方法

Newly installed MariaDB (MySQL) cannot log in as root

所以,普通用户下的 mysql -u root 就一直报错。

而我通过 brew services list 可以看到,User处是我的普通用户用户名 (如果是Linux: systemctl status mariadb或mysql )。而非 root。

使用下面命令登陆到 MySQL

sudo mysql -u root

使用下面命令,你大概能看到类似的东西:

USE mysql;

SELECT User, Host, plugin FROM mysql.user;
# unix_socket (在 MariaDB 中有时也称为 auth_socket) 
+-------------+--------------------------+-----------------------+
| User        | Host                     | plugin                |
+-------------+--------------------------+-----------------------+
| mariadb.sys | localhost                | mysql_native_password |
| root        | localhost                | auth_socket |
| xxxx       | localhost                | auth_socket |
.......
+-------------+--------------------------+-----------------------+
6 rows in set (0.001 sec)

(在Linux服务器,且没有什么问题的情况下,只需要保证 #(root用户) 登陆数据库就行,因为 问题一般出在用户终端机 )

可以看到 root 它们使用的都是 auth_socket 认证。

我们需要更改成 mysql_native_password ,之后顺便改个 root 密码

ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'; # 更改 root@localhost 用户的身份验证插件并设置密码

FLUSH PRIVILEGES; # 刷新权限

EXIT; # 退出

之后我们登陆看看:

mysql -u root -p

输入刚刚设置的密码 123456 后,成功登陆

我们可以再看看目前验证方式。

USE mysql;

SELECT User, Host, plugin FROM mysql.user;

+-------------+--------------------------+-----------------------+
| User        | Host                     | plugin                |
+-------------+--------------------------+-----------------------+
| mariadb.sys | localhost                | mysql_native_password |
| root        | localhost                | mysql_native_password |
| xxxx       | localhost                | mysql_native_password |
.......
+-------------+--------------------------+-----------------------+
6 rows in set (0.001 sec)

总算是正常了。

如果使用unix_socket,那么我的登陆密码是什么?

如果您的用户(例如 dinmi)在数据库中也存在一个同名用户 dinmi,并且该数据库用户配置了 unix_socket 认证,那么您以操作系统用户 dinmi 身份运行 mysql -u dinmi 时,不需要密码。
如果您尝试以数据库用户 root 登录,并且 root@localhost 配置了 unix_socket 认证,那么您不需要密码,但您必须以操作系统的 root 用户身份运行 mysql 客户端 (通常通过 sudo mysql -u root)。

所以,答案是:如果你的 MariaDB(MySQL) 用户使用 unix_socket 认证,那么对于该用户,登录时它不检查你输入的密码,而是检查你当前操作系统的用户身份。

这种认证方式的核心思想是:依赖于「操作系统用户」的身份来验证「数据库用户」。


如何完全卸载 MariaDB(MySQL)

一般不完全卸载的 MariaDB(MySQL) 很会膈应人,还会复用之前的文件配置(密码一般记录在数据库 mysql 里面,但是有时候会意料之外被使用到之前的密码)所以我们有时候需要完全卸载掉 MariaDB(MySQL)。

下面教你怎么完全卸载掉 MariaDB(MySQL) – 用 MariaDB 作演示

MariaDB 和 MySQL 完全(几乎)一样(本文配置几乎通用),既生瑜何生亮,因为 MariaDB 完全免费,开源驱动,是那帮搞 MySQL 的人开发的,而 MySQL 已经被商业公司「甲骨文」买断了。

MacOS / OS X 系统

# Apple Silicon CPU:
brew services stop mariadb
brew uninstall mariadb

## 移除数据目录
sudo rm -rf /opt/homebrew/var/mysql
## 移除配置文件
sudo rm -f /opt/homebrew/etc/my.cnf
sudo rm -rf /opt/homebrew/etc/my.cnf.d
sudo rm -f /opt/homebrew/etc/my.cnf.default
rm -f ~/.my.cnf
rm -rf ~/.mariadb

## 删除启动项和清理
rm -f ~/Library/LaunchAgents/homebrew.mxcl.mariadb.plist
brew cleanup

# ---------------------------------------- #

# Intel CPU Mac:
brew services stop mariadb
brew uninstall mariadb

# 移除数据目录
sudo rm -rf /usr/local/var/mysql
# 移除配置文件
sudo rm -f /usr/local/etc/my.cnf
sudo rm -rf /usr/local/etc/my.cnf.d
sudo rm -f /usr/local/etc/my.cnf.default
rm -f ~/.my.cnf
rm -rf ~/.mariadb

## 删除启动项和清理
rm -f ~/Library/LaunchAgents/homebrew.mxcl.mariadb.plist
brew cleanup

Debian/Ubuntu 系统:

# 记得先进入root用户下
systemctl stop mariadb
apt purge mariadb-server mariadb-client mariadb-common mariadb-backup libmariadb3 # 根据实际安装的包调整
rm -rf /var/lib/mysql/
rm -rf /etc/mysql/ # 检查是否已被 purge 删除
rm -rf /var/log/mysql/ /var/log/mariadb/
apt autoremove
apt autoclean
apt clean
rm -f ~/.my.cnf # 可选,用户特定配置

CentOS/RHEL 系统 (使用 dnf 示例):

sudo systemctl stop mariadb
sudo dnf remove mariadb-server mariadb mariadb-libs # 根据实际安装的包调整
sudo rm -rf /var/lib/mysql/
sudo rm -f /etc/my.cnf
sudo rm -rf /etc/my.cnf.d/
sudo rm -rf /var/log/mariadb/ /var/log/mysql/
sudo rm -f /var/log/mysqld.log
sudo dnf clean all
rm -f ~/.my.cnf # 可选,用户特定配置

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注