--skip-grant-tables仅用于已安装MySQL的密码重置补救,非安装选项;必须先彻底停止服务、杀净残留进程,再以完整路径启动带--skip-networking的新实例,登录后用ALTER USER修改密码并执行FLUSH PRIVILEGES,注意匹配root@host记录及认证插件。

不能直接“安装时”跳过权限表检查——跳过权限是重置密码的补救手段,不是安装选项。 安装过程本身不涉及 --skip-grant-tables,这个参数只在 MySQL 服务已安装、但无法登录(比如 root 密码丢失)时才用得上。
为什么 mysqld --skip-grant-tables 没反应?
常见现象:执行命令后终端卡住、进程秒退、或者 mysql -u root 仍报 Access denied。
- 根本原因是 MySQL 实例已在运行,
--skip-grant-tables只对**全新启动的mysqld进程**生效,不能附加到已有服务上 - 必须先彻底停掉服务:
sudo systemctl stop mysql - 再确认无残留进程:
ps aux | grep mysqld,看到非 root 的mysqld进程就kill -9掉 - 启动时用完整路径,避免 shell 环境变量干扰:
/usr/sbin/mysqld --skip-grant-tables --skip-networking & -
--skip-networking很关键——防止远程未授权连接,本地 socket 还能连
UPDATE user SET password=... 在 MySQL 5.7+ 报错怎么办?
MySQL 5.7 起 user 表里没有 password 字段,8.0 更彻底废弃了 PASSWORD() 函数。硬写会报 Field 'password' doesn't exist 或 FUNCTION does not exist。
- 5.7 正确写法(先切插件,再设哈希):
UPDATE mysql.user SET plugin='mysql_native_password', authentication_string=PASSWORD('新密码') WHERE User='root' AND Host='localhost'; - 8.0+ 必须用
ALTER USER:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码'; - 无论哪个版本,改完都必须执行:
FLUSH PRIVILEGES; - 注意
'root'@'localhost'和'root'@'127.0.0.1'是两个独立账户,改错 Host 就白忙
改完密码还是 Access denied?检查这三点
能进 MySQL 但查不了库、建不了表,大概率不是密码问题,而是权限没生效或 Host 不匹配。
- 执行
SELECT User, Host FROM mysql.user WHERE User='root';,确认你改的是实际登录所用的那条记录(比如你用mysql -u root -h 127.0.0.1登,就得改'root'@'127.0.0.1') - 确认没漏掉
FLUSH PRIVILEGES;—— 这步不执行,修改只存在内存里,重启后还原 - 如果之前用配置文件加了
skip-grant-tables,改完必须删掉、再sudo systemctl restart mysql,否则权限校验始终被跳过
真正容易被忽略的点:Ubuntu 上 MySQL 默认用 auth_socket 插件认证 root 用户(尤其 24.04+),此时即使密码正确也登不上。这不是跳过权限能解决的——得先 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxx'; 切换认证方式,再重置密码。


















