根据你提供的查询结果,问题的根源在于 root 用户的认证方式被设置为 auth_socket,而非传统的密码认证。以下是详细解释和解决方案:
一、问题原因分析
-
auth_socket插件的作用:- 这是 MySQL 5.6 引入的认证插件,允许用户通过 操作系统权限 登录,而无需密码。
- 当使用
sudo mysql登录时,系统认为你是操作系统 root 用户,因此可以直接通过auth_socket认证。 - 但当你尝试通过
mysql -u root -p登录时,MySQL 会要求密码认证,而auth_socket插件不支持密码,导致认证失败(ERROR 1698)。
-
authentication_string为空:auth_socket插件不需要密码,因此该字段为空是正常的。
二、解决方案
目标 :将 root 用户的认证方式切换为 密码认证 (mysql_native_password)。
步骤 1:停止 MySQL 服务
bash
sudo systemctl stop mysql
步骤 2:跳过权限表启动 MySQL
bash
sudo mysqld_safe --skip-grant-tables &
步骤 3:直接登录 MySQL(无需密码)
bash
sudo mysql
步骤 4:修改 root 用户的认证方式和密码
在 MySQL 命令行中执行以下操作:
sql
USE mysql;
-- 切换认证插件为 mysql_native_password
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';
-- 刷新权限
FLUSH PRIVILEGES;
步骤 5:退出并重启 MySQL
sql
QUIT;
bash
sudo systemctl start mysql
步骤 6:使用新密码登录
bash
mysql -u root -p
输入你设置的 新密码,即可成功登录。
三、关键说明
-
auth_socket的用途:-
适用于需要 系统级权限控制 的场景(如 root 用户通过操作系统直接管理 MySQL)。
-
如果你希望保留
auth_socket的方式,可以通过以下命令登录(无需密码):bashsudo mysql # 以操作系统 root 身份登录
-
-
其他用户条目:
-
如果你希望允许远程登录(如
root@'%'),需单独创建并配置:sqlCREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '新密码'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
-
四、验证配置
执行以下查询确认修改:
sql
SELECT user, host, plugin, authentication_string FROM mysql.user WHERE user = 'root';
预期输出应为:
sql
+------+-----------+-----------------------+-----------------------+
| user | host | plugin | authentication_string |
+------+-----------+-----------------------+-----------------------+
| root | localhost | mysql_native_password | *hashed_password |
+------+-----------+-----------------------+-----------------------+
五、注意事项
- 安全性建议 :
- 避免直接使用
root用户远程登录,建议创建专用管理用户。 - 如果需要
auth_socket方式,仅限本地登录且确保操作系统权限安全。
- 避免直接使用
- 密码策略 :
- MySQL 8.0+ 默认启用密码策略,新密码需符合要求(如长度、复杂度)。
如果仍有问题,请提供更多操作细节或错误日志!