如何恢复丢失的Root管理员权限_跳过grant-tables与重启配置

0次阅读

MySQL 跳过权限验证后无法登录 root,因认证插件(如 auth_socket 或 caching_sha2_password)仍生效;需用 socket 直连、查并修改 plugin 字段、同步更新认证方式,且务必注释配置文件中的 skip-grant-tables。

如何恢复丢失的 Root 管理员权限_跳过 grant-tables 与重启配置

MySQL 5.7+ 跳过 grant-tables 后无法登录 root@localhost

跳过权限验证后,root 用户默认认证插件可能变成 auth_socketcaching_sha2_password,而你用密码登录时 MySQL 仍会尝试调用该插件——哪怕 skip-grant-tables 已生效。这不是权限问题,是认证流程绕过了权限表,但没绕过插件逻辑。

  • 启动时加 --skip-grant-tables 后,必须用 mysql -u root --socket=/var/run/mysqld/mysqld.sock(或对应 socket 路径)直连,不带 -p;带密码反而触发插件校验,报 Access denied for user 'root'@'localhost'
  • 进入后第一件事不是改密码,而是先确认当前 root 用户的 plugin 字段:
    SELECT User, Host, plugin FROM mysql.user WHERE User = 'root';
  • 如果 pluginauth_socket,直接 UPDATE mysql.user SET plugin='mysql_native_password', authentication_string=PASSWORD('newpass') WHERE User='root' AND Host='localhost';;MySQL 8.0+ 则用 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'newpass';

MySQL 8.0 修改 root 密码后仍连不上:认证插件不匹配

MySQL 8.0 默认用 caching_sha2_password,但很多客户端(尤其是旧版 PHP mysqli、某些 GUI 工具)不支持它,即使密码正确也会卡在连接阶段,报错类似 Client does not support authentication protocol requested by server

  • 不要只改 authentication_string,必须同步指定插件:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourpass';
  • 如果用 UPDATE 手动改表,记得再执行 FLUSH PRIVILEGES;;但 ALTER USER 不需要
  • 检查客户端是否强制指定了插件,例如 Python 的 mysql-connector-python 需显式加 auth_plugin='mysql_native_password'

重启 MySQL 失败:配置文件里 skip-grant-tables 没注释掉

这是最常被忽略的一步。跳过权限验证只是临时修复手段,一旦写死在 my.cnfmysqld.cnf[mysqld] 段落里,每次重启都会强制跳过权限检查——导致所有用户无条件可登录,且你刚设的密码根本不会被校验。

  • 编辑配置文件(常见路径:/etc/mysql/mysql.conf.d/mysqld.cnf/etc/my.cnf),找到含 skip-grant-tables 的行,前面加 # 注释掉
  • 确认没有其他配置文件重复加载(mysqld --help --verbose | grep "Default options" 可看加载顺序)
  • 重启前先用 mysqld --defaults-file=/etc/mysql/mysql.conf.d/mysqld.cnf --validate-config 检查语法

Windows 下服务无法启动:skip-grant-tables 放错了位置

Windows 的 MySQL 服务注册信息和配置文件是两套体系。直接改 my.iniskip-grant-tables,但服务启动时可能根本没读这个文件,或者读的是另一个路径下的配置(比如 C:ProgramDataMySQLMySQL Server 8.0my.ini)。

  • 先查服务实际加载的配置:sc qc "MySQL80"(服务名以实际为准),看 BINARY_PATH_NAME 末尾有没有 --defaults-file=……
  • 如果没有,服务默认按顺序找:%WINDIR%my.ini%WINDIR%my.cnfC:my.iniC:my.cnfBASEDIRmy.ini(即安装目录)
  • 稳妥做法:停止服务 → 用命令行手动启动 mysqld:mysqld --console --skip-grant-tables --shared-memory,确认能进再说
事情说清了就结束。真正卡住的,往往不是改哪条 SQL,而是哪个配置文件被读了、哪个 socket 路径对不上、哪个插件在后台悄悄干活。

星耀云
版权声明:本站原创文章,由 星耀云 2026-03-17发表,共计2045字。
转载说明:转载本网站任何内容,请按照转载方式正确书写本站原文地址。本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。
text=ZqhQzanResources