如何为用户授权_mysql grant用法说明

来源:这里教程网 时间:2026-02-28 20:44:01 作者:

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'@'%';

验证与调试小技巧

授完权别急着切应用,先本地验证是否生效:

查用户已拥有哪些权限:
SHOW GRANTS FOR 'appuser'@'192.168.1.%';
确认用户账号是否存在、host 是否匹配:
SELECT User, Host FROM mysql.user WHERE User = 'appuser';
若提示 “Access denied”,重点检查:
• 用户名@host 是否完全一致(注意 % 和 localhost 不互通)
• 是否执行了
FLUSH PRIVILEGES
(尤其在直接修改 mysql.user 表后)
• MySQL 8.0+ 默认启用密码强度策略,弱密码可能被拒绝

相关推荐