MySQL 8.0 之后,跳过root 用户默认走 auth_socket 插件,密码本地登录直接
sudo mysql就进去了,验证压根不需要密码。进入很多人不知道这件事,跳过还在那翻 my.cnf 找临时密码。密码如果你用的验证是 5.7 或者更早的版本,装完之后会在日志里打一串临时密码,进入那个才是跳过真正要的东西。但不管哪个版本,密码跳过密码验证这件事,验证本质上就三条路:改配置、进入改认证插件、跳过或者直接改系统表。密码先说最粗暴的验证——
--skip-grant-tables。停掉 MySQL 服务,在启动参数里加上这个选项,服务起来之后任何用户、任何密码都能登,权限校验整个被绕过。操作大概是这样:sudo systemctl stop mysql sudo mysqld_safe --skip-grant-tables & mysql -u root进去之后你干的第一件事应该是
FLUSH PRIVILEGES;,否则改密码的语句会被拒绝。然后ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';。完事重启服务,恢复正常模式。这个方法我用过不下十次,尤其是帮人救那种忘了密码的老服务器。但有个坑:--skip-grant-tables模式下,远程连接也是不校验的,如果服务器暴露在公网,这几分钟就是裸奔。所以操作完立刻重启,别拖。另一条路是改认证插件。MySQL 8 默认给 root 配了
caching_sha2_password或者auth_socket。你可以在/etc/mysql/mysql.conf.d/mysqld.cnf里加一行skip-grant-tables然后重启,但更优雅的做法是直接改插件:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';这行命令在你能正常登录的时候才有用。如果已经进不去了,那就得回到上一条路。我见过有人把
mysql_native_password当成万能钥匙,其实它只是换了一种密码哈希方式,安全性比caching_sha2_password低,但兼容性更好。老版本的 Navicat 连不上 MySQL 8,多半就是插件不匹配。还有一种情况:你根本不需要密码,因为用的是
auth_socket。Ubuntu 上apt install mysql-server之后,root 默认就是这个插件。它检查的是操作系统用户是不是 root,是的话直接放行。所以你sudo mysql能进,mysql -u root -p反而进不去。这不是 bug,是设计。想改成密码登录,执行:ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '新密码';然后
FLUSH PRIVILEGES;。注意,改完之后sudo mysql就不好使了,得用密码。最后提一个真实案例。去年帮一个朋友处理一台被入侵的服务器,MySQL 的
user表里多了一个'test'@'%'的空密码账户。攻击者就是通过这个账户拿到的数据库权限。所以跳过密码验证这件事,自己用是救急,被别人用就是灾难。检查一下SELECT user, host, plugin FROM mysql.user;,看看有没有不该存在的账户和空密码。有的话,DROP USER掉,别犹豫。操作完记得
顶: 2621踩: 334FLUSH PRIVILEGES;,这个命令我写了三遍,因为它真的容易被忘。忘了的话,你改的东西只在当前会话生效,重启就还原。别问我是怎么知道的。






评论专区