普通用户无法操作mysql.user表或执行grant语句,因需super/system_user等高权限;mysql启动后所有操作均受权限校验约束,8.0+版本字段约束更严格,仅--skip-grant-tables可绕过。

普通用户根本没权限操作mysql.user表
MySQL的用户信息全存在mysql.user表里,而这张表默认只允许root或拥有CREATE USER、INSERT、UPDATE等高权限的账户修改。普通用户即使能连上数据库,执行INSERT INTO mysql.user或UPDATE mysql.user也会直接报错:ERROR 1044 (42000): Access denied for user ... to database 'mysql'。
GRANT语句需要SUPER或SYSTEM_USER权限
想用GRANT ALL ON *.* TO 'newuser'@'localhost'给用户赋权?这条语句本身就需要执行者具备SUPER(5.7)或SYSTEM_USER(8.0+)权限。普通用户没有这些权限,GRANT会失败,更别说去重建root这种超级账户了。
无法绕过权限校验链
- MySQL启动时加载权限表后,所有SQL操作都经过权限检查引擎验证
- 普通用户登录时,服务端已根据
mysql.user中该用户的记录确定其权限范围 - 哪怕你手动能查到
mysql.user结构,也无法在无权限前提下写入或覆盖关键字段(如authentication_string、plugin、account_locked)
MySQL 8.0+ 的插件和字段约束更严格
在8.0版本里,删掉root后光靠插入旧格式记录行根本不行:
-
password_last_changed字段非空,不设值会报Field 'password_last_changed' doesn't have a default value -
plugin字段必须显式指定,比如mysql_native_password,否则默认用caching_sha2_password,而老客户端可能不兼容 - 直接
INSERT整行容易漏掉password_expired、account_locked等字段,导致后续登录失败
这些细节普通用户既看不到错误上下文,也没权限调整系统行为——只有跳过整个权限校验流程(--skip-grant-tables)才能触达底层数据。











