是的。MySQL 5.7+ 默认仅创建 root@localhost 和 root@127.0.0.1,无 root@'%',远程连接会报 Access denied;需显式创建用户并授权,且必须执行 FLUSH PRIVILEGES 生效。

安装完 MySQL 后,root 用户默认只能本地登录?
是的。MySQL 5.7+ 安装向导默认只创建 root@localhost(或 root@127.0.0.1),这意味着你用 mysql -uroot -p 在本机能连上,但远程客户端(比如 Navicat、Python 脚本从另一台机器连)会直接报错 Access denied for user 'root'@'xxx.xxx.xxx.xxx' —— 因为 user 表里根本没这条记录。
别急着 GRANT ALL ON *.*,先确认当前有哪些 root 用户:
SELECT user, host FROM mysql.user WHERE user = 'root';
常见结果是两行:root@localhost 和 root@127.0.0.1,但没有 root@'%'。想开远程?不是改密码,而是加用户:
CREATE USER 'root'@'%' IDENTIFIED BY '你的强密码';GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;FLUSH PRIVILEGES;
⚠️ 注意:WITH GRANT OPTION 允许该用户再授予权限,生产环境慎用;如果只是开发测试,可以去掉它。
为什么刚建的用户连不上数据库,show databases 只看到 information_schema?
新建用户(比如 CREATE USER 'appuser'@'%' IDENTIFIED BY 'pwd';)默认没有任何库表权限,SHOW DATABASES 也只会列出系统库,因为普通用户看不到其他数据库名 —— 这是 MySQL 的默认安全策略,不是 bug。
要让 appuser 访问 myapp 库,必须显式授权:
CREATE DATABASE IF NOT EXISTS myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;GRANT SELECT, INSERT, UPDATE, DELETE ON myapp.* TO 'appuser'@'%';FLUSH PRIVILEGES;
别漏掉 FLUSH PRIVILEGES; —— 权限变更不会自动生效,必须刷新内存中的权限缓存。否则你会反复重试却始终没效果。
哪些高危权限必须禁用?非管理员账号绝不能有
MySQL 的 FILE、PROCESS、SUPER、SHUTDOWN、CREATE USER 这几类权限,等同于把服务器的「后门钥匙」交出去。黑客一旦拿下一个低权限账号,就能靠它们提权、读取任意文件(如 /etc/passwd)、杀掉服务、甚至创建新管理员。
宽维企业网站管理系统功能说明宽维系列网站管理系统全面免费,个人和商业应用均免费。宽维企业网站管理系统是基于Php+MySql技术开发的企业电子商务平台,全后台操作,无需学习网页制作等知识。前台智能生成页面,可以方便地在线管理、维护、更新您的企业网站。宽维企业网站管理系统安装简单快捷,5分钟就可以安装完成。1 栏目管理方便灵活:可以发布和管理您需要的任何内容的个性栏目。内置数十个功能发布模型,并可以
检查有没有越权账号:
SELECT user, host FROM mysql.user WHERE File_priv = 'Y' OR Process_priv = 'Y' OR Super_priv = 'Y' OR Shutdown_priv = 'Y' OR Create_user_priv = 'Y';
如果返回了非 root 账号,立刻回收:
REVOKE FILE ON *.* FROM 'appuser'@'%';REVOKE PROCESS, SUPER, SHUTDOWN, CREATE USER ON *.* FROM 'appuser'@'%';FLUSH PRIVILEGES;
特别注意:REVOKE 不会删除用户,只清权限;而 DROP USER 才是彻底删账号。别混淆。
配置完权限,远程还是连不上?别忘了防火墙和 bind-address
即使 MySQL 内部已授权 'user'@'%',外部仍连不上,大概率卡在两个地方:
- Windows 防火墙 / Linux
ufw或iptables拦截了3306端口 —— 开放端口或临时关防火墙验证 - MySQL 配置文件(
my.cnf或my.ini)里bind-address = 127.0.0.1(默认值),导致只监听本地回环,不接受外部连接。改成bind-address = 0.0.0.0或注释掉该行
改完配置必须重启 MySQL 服务:sudo systemctl restart mysql(Linux)或 Windows 服务管理器里重启 MySQL80 服务。改完不重启,等于白改。
最后提醒一句:权限最小化不是教条,而是成本核算——每个额外权限都意味着一次潜在的逃逸路径。宁可多跑几遍 GRANT,也不要图省事给 ALL PRIVILEGES。









