mysql授权核心是GRANT语句,需明确用户账号、访问主机(host)及具体权限范围;推荐先CREATE USER再GRANT赋权,确保逻辑清晰、权限可控;ALL PRIVILEGES不含GRANT OPTION,需显式添加WITH GRANT OPTION。

MySQL 中为用户授权,核心是 GRANT 语句。它不是一次性配好就完事,而是要明确「谁」「在哪儿」「能做什么」——即用户账号、访问来源(host)、具体权限和作用范围(库/表/函数等)。用错 host 或漏掉关键权限,常导致连不上、查不了、执行不了存储过程等问题。
创建用户后再授权(推荐方式)
先用 CREATE USER 显式建号,再用 GRANT 赋权,逻辑清晰、权限可控:
- 创建用户(仅登录能力):
CREATE USER 'appuser'@'192.168.1.%' IDENTIFIED BY 'SecurePass123'; - 授予对 testdb 库的读写权限:
GRANT select, INSERT, UPDATE, delete ON testdb.* TO 'appuser'@'192.168.1.%'; - 如需调用存储过程或函数,必须额外授权 EXECUTE:
GRANT EXECUTE ON testdb.* TO 'appuser'@'192.168.1.%';
⚠️ 注意:MySQL 不支持单独给某个函数授 EXECUTE 权限,只能到库级(testdb.*)或全局(*.*) - 生效权限:
FLUSH PRIVILEGES;(非必需,但建议执行以确保立即生效)
直接建号+授权(一步到位)
适用于快速测试,语法紧凑,但隐含风险(比如密码策略、host 匹配不严谨):
-
GRANT ALL PRIVILEGES ON myapp.* TO 'admin'@'%' IDENTIFIED BY 'P@ssw0rd!';
这条命令会自动创建用户(若不存在),并赋予myapp库全部权限,允许从任意 IP 登录。 - ⚠️ 注意:
ALL PRIVILEGES不包含GRANT OPTION,如需让用户也能转授权限,得显式加上:GRANT ALL ON myapp.* TO 'delegator'@'localhost' WITH GRANT OPTION;
常见权限类型与对应场景
权限粒度决定安全边界,按需分配比“全给”更稳妥:
- 数据操作类:SELECT / INSERT / UPDATE / DELETE —— 普通应用账号必备
- 结构管理类:CREATE / ALTER / DROP / INDEX / CREATE VIEW / SHOW VIEW —— 开发或 dba 使用
- 程序对象类:CREATE ROUTINE / ALTER ROUTINE / EXECUTE —— 存储过程、函数必需
- 特殊补充:如果用户需要
SHOW PROCEDURE STATUS或查看函数定义,还需额外授权:GRANT SELECT ON mysql.proc TO 'devuser'@'%';
验证与调试小技巧
授完权别急着切应用,先本地验证是否生效: