根据你提供的查询结果,问题的根源在于 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 服务
sudo systemctl stop mysql
步骤 2:跳过权限表启动 MySQL
sudo mysqld_safe --skip-grant-tables &
步骤 3:直接登录 MySQL(无需密码)
sudo mysql
步骤 4:修改 root 用户的认证方式和密码
在 MySQL 命令行中执行以下操作:
USE mysql;
-- 切换认证插件为 mysql_native_password
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';
-- 刷新权限
FLUSH PRIVILEGES;
步骤 5:退出并重启 MySQL
QUIT;
sudo systemctl start mysql
步骤 6:使用新密码登录
mysql -u root -p
输入你设置的 新密码
,即可成功登录。
三、关键说明
auth_socket
的用途:- 适用于需要 系统级权限控制 的场景(如 root 用户通过操作系统直接管理 MySQL)。
- 如果你希望保留
auth_socket
的方式,可以通过以下命令登录(无需密码):sudo mysql # 以操作系统 root 身份登录
其他用户条目:
- 如果你希望允许远程登录(如
root@'%'
),需单独创建并配置:CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '新密码'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
- 如果你希望允许远程登录(如
四、验证配置
执行以下查询确认修改:
SELECT user, host, plugin, authentication_string FROM mysql.user WHERE user = 'root';
预期输出应为:
+------+-----------+-----------------------+-----------------------+
| user | host | plugin | authentication_string |
+------+-----------+-----------------------+-----------------------+
| root | localhost | mysql_native_password | *hashed_password |
+------+-----------+-----------------------+-----------------------+
五、注意事项
- 安全性建议:
- 避免直接使用
root
用户远程登录,建议创建专用管理用户。 - 如果需要
auth_socket
方式,仅限本地登录且确保操作系统权限安全。
- 避免直接使用
- 密码策略:
- MySQL 8.0+ 默认启用密码策略,新密码需符合要求(如长度、复杂度)。
如果仍有问题,请提供更多操作细节或错误日志!