mysql登录失败 ERROR1698

发布于:2025-08-13 ⋅ 阅读:(11) ⋅ 点赞:(0)

根据你提供的查询结果,问题的根源在于 root 用户的认证方式被设置为 auth_socket,而非传统的密码认证。以下是详细解释和解决方案:


一、问题原因分析

  1. auth_socket 插件的作用

    • 这是 MySQL 5.6 引入的认证插件,允许用户通过 操作系统权限 登录,而无需密码。
    • 当使用 sudo mysql 登录时,系统认为你是操作系统 root 用户,因此可以直接通过 auth_socket 认证。
    • 但当你尝试通过 mysql -u root -p 登录时,MySQL 会要求密码认证,而 auth_socket 插件不支持密码,导致认证失败(ERROR 1698)。
  2. 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

输入你设置的 新密码,即可成功登录。


三、关键说明

  1. auth_socket 的用途

    • 适用于需要 系统级权限控制 的场景(如 root 用户通过操作系统直接管理 MySQL)。
    • 如果你希望保留 auth_socket 的方式,可以通过以下命令登录(无需密码):
      sudo mysql  # 以操作系统 root 身份登录
      
  2. 其他用户条目

    • 如果你希望允许远程登录(如 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+ 默认启用密码策略,新密码需符合要求(如长度、复杂度)。

如果仍有问题,请提供更多操作细节或错误日志!


网站公告

今日签到

点亮在社区的每一天
去签到