安装完 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)、杀掉服务、甚至创建新管理员。
检查有没有越权账号:
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。
