mysql 5.7 root权限全无时,需用--skip-grant-tables --skip-networking启动,登录后执行update mysql.user批量设所有_priv='y'并flush privileges,同时确保authentication_string有效、plugin='mysql_native_password'且重启彻底生效。

MySQL 5.7 root用户权限全无,SELECT都报错怎么办
能登录但执行任何操作都提示 ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database 'mysql',说明 mysql.user 表里对应用户的权限字段(如 Select_priv、Grant_priv)全为 'N',不是密码问题,是授权表损坏或误清空。此时不能靠 GRANT 恢复,必须直改系统表。
用 --skip-grant-tables 启动并手动修复权限字段
这不是“跳过登录”,而是跳过权限校验——启动后可直接 mysql -u root 进入,无需密码,且拥有对所有库的读写权(包括 mysql 库)。关键点:
- 必须加
--skip-networking,否则远程连接可能并发修改,导致数据不一致 - 启动命令要带完整配置路径,例如:
sudo mysqld --defaults-file=/etc/my.cnf --skip-grant-tables --skip-networking & - 进入后先确认用户存在:
SELECT User, Host, Select_priv, Grant_priv FROM mysql.user WHERE User = 'root'; - 批量设权限时,别漏掉
Grant_priv='Y'和Super_priv='Y',否则后续GRANT仍失败
执行以下语句(适配 MySQL 5.7+):
USE mysql;
UPDATE user SET
Select_priv='Y', Insert_priv='Y', Update_priv='Y', Delete_priv='Y',
Create_priv='Y', Drop_priv='Y', Reload_priv='Y', Shutdown_priv='Y',
Process_priv='Y', File_priv='Y', Grant_priv='Y', References_priv='Y',
Index_priv='Y', Alter_priv='Y', Show_db_priv='Y', Super_priv='Y',
Create_tmp_table_priv='Y', Lock_tables_priv='Y', Execute_priv='Y',
Repl_slave_priv='Y', Repl_client_priv='Y', Create_view_priv='Y',
Show_view_priv='Y', Create_routine_priv='Y', Alter_routine_priv='Y',
Create_user_priv='Y', Event_priv='Y', Trigger_priv='Y',
Create_tablespace_priv='Y'
WHERE User='root' AND Host IN ('localhost', '%');
FLUSH PRIVILEGES;
authentication_string 字段为空或格式错误导致登录失败
MySQL 5.7 把密码存在 authentication_string,不是 password 字段。如果该字段为空、为 NULL 或内容不是加密哈希(比如是明文或旧版 password() 结果),即使权限全开,mysql -uroot -p 仍会拒绝登录。
- 检查:
SELECT User, Host, authentication_string FROM mysql.user WHERE User='root'; - 若为空或非法,用
ALTER USER重置(推荐):ALTER USER 'root'@'localhost' IDENTIFIED BY 'your_new_pass'; - 若
ALTER USER报错(如 “Your password does not satisfy the current policy requirements”),先临时调低策略:SET GLOBAL validate_password_policy=LOW; - 不要用
UPDATE user SET authentication_string=PASSWORD('xxx')——PASSWORD()在 8.0 已废弃,5.7 虽支持但不保证兼容性
重启后仍连不上?重点检查 Host 匹配和插件类型
MySQL 认证是 User + Host 组合匹配,'root'@'localhost' 和 'root'@'%' 是两个独立账户。常见坑:
- 你用
mysql -uroot -h127.0.0.1 -p连,实际匹配的是'root'@'127.0.0.1',不是'localhost';本地 socket 连接才走localhost -
plugin字段如果是auth_socket(常见于 Ubuntu 包安装),即使密码正确也会被拒绝;应确保为mysql_native_password:UPDATE user SET plugin='mysql_native_password' WHERE User='root' AND Host='localhost'; - 改完务必执行
FLUSH PRIVILEGES;,否则内存缓存未更新
最易忽略的一点:修复完成后,必须用 killall mysqld 彻底终止旧进程,再用正常方式(systemctl start mysqld)重启,不能让 --skip-grant-tables 进程继续跑着——否则权限始终不生效。











