必须先 CREATE USER,再 GRANT;MySQL 5.7+ 不支持 GRANT 隐式创建用户,否则报错 ERROR 1133,因用户元数据须显式写入 mysql.user 表,且 CREATE USER 才校验密码强度、支持 host 精确控制访问源。
直接给结论:必须先,再,不能靠一条语句“顺手创建并授权”——MySQL 5.7+ 不支持在中隐式建用户(除非启用旧兼容模式,但不推荐)。
为什么不能只用
创建用户
早期 MySQL(如 5.1)允许
自动建用户,但该行为在 5.7+ 默认禁用。如果直接执行这类语句,会报错:
。
这不是权限问题,是语义变更:MySQL 要求用户元数据必须显式写入
表,
只负责权限赋值。
显式建用户更安全、可审计,避免权限和账户生命周期混淆
会校验密码强度(若启用 validate_password 插件),
不做这事
同一用户名 + 不同 host(如
和
)算两个独立账户,必须分别创建
的 host 写法决定连接来源
host 部分不是可有可无的修饰,它直接控制谁能连进来:
:仅本机 socket 或 127.0.0.1 TCP 连接可用
:匹配整个 C 段内任意 IP
:允许任意远程 IP 连接(生产慎用,需配合防火墙)
别写
—— 这是无效语法,
才是通配符
常见错误:应用部署在 Docker 容器或云主机上,误以为
能连宿主机 MySQL,实际容器网络里
指自己,必须用宿主机真实 IP 或
(并开 3306 端口)。
时数据库名要加反引号(尤其含短横线或数字开头)
如果数据库名是
、
这类非法标识符(含特殊字符或以数字开头),不加反引号会报错:
。
MySQL(Linux)
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
下载
正确写法:
即使数据库名合法(如
),也建议统一加反引号,避免未来重命名引入风险。
权限粒度可精确到表:
不要滥用
,这等价于把 root 权限交出去
授完权必须执行
,否则新权限不会生效(缓存未刷新)
远程连接失败?先检查这三处
用户创建和授权都成功,但应用仍连不上,大概率卡在这几个地方:
MySQL 配置文件(
或
)里
是
,得改成
或具体监听 IP
Linux 防火墙(
或
)没放行 3306 端口
云服务商(阿里云/腾讯云)安全组规则没开放 3306 入方向,且源 IP 设置为
或对应段
特别注意:MySQL 用户权限中的 host 和网络层的可达性是两回事。就算你建了
,网络不通照样连不上。
CREATE USERGRANTGRANTGRANTGRANT ... TO 'user'@'host' IDENTIFIED BY 'pass'ERROR 1133 (42000): Can't find any matching row in the user tablemysql.userGRANTCREATE USERGRANT'app'@'localhost''app'@'%'CREATE USER'app'@'localhost''app'@'192.168.1.%''app'@'%''app'@'*'%localhostlocalhost%GRANTmy-app2024_logsERROR 1064 (42000): You have an error in your SQL syntaxGRANT SELECT, INSERT ON `my-app`.* TO 'app'@'localhost';
GRANT ALL PRIVILEGES ON `2024_logs`.* TO 'logger'@'%';testdbGRANT UPDATE ON `mydb`.`users` TO 'admin'@'localhost';ALL PRIVILEGES ON *.*FLUSH PRIVILEGES;/etc/mysql/my.cnf/etc/my.cnfbind-address127.0.0.10.0.0.0ufwfirewalld0.0.0.0/0'user'@'%'