基本语法
GRANT 命令的基本结构如下:

GRANT priv_type [(column_list)] ON [object_type] priv_level
TO user_specification [,...]
[WITH GRANT OPTION]
[REQUIRE NONE | [SSL|X509] [CIPHER cipher [AS cipher_name]] [ISSUER issuer_name] [SUBJECT subject_name]]
[RESOURCE_LIMIT_options]
[WITH MANAGER OPTION]
[MAX_QUERIES_PER_HOUR #]
[MAX_UPDATES_PER_HOUR #]
[MAX_CONNECTIONS_PER_HOUR #]
[MAX_USER_CONNECTIONS #]
看起来很复杂,我们通常只使用最核心的部分,下面是一个简化的、更常用的语法:
-- 最核心的语法 GRANT privileges ON database_name.table_name TO 'username'@'host' [IDENTIFIED BY 'password'] [WITH GRANT OPTION]; -- 授予所有权限的常用语法 GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'host' [IDENTIFIED BY 'password'] [WITH GRANT OPTION];
语法参数详解
| 参数 | 描述 | 示例 |
|---|---|---|
| privileges | 权限列表,用逗号隔开,常用权限包括: - SELECT: 查询 - INSERT: 插入 - UPDATE: 更新 - DELETE: 删除 - CREATE: 创建数据库/表 - DROP: 删除数据库/表 - ALTER: 修改表结构 - INDEX: 创建/删除索引 - GRANT OPTION: 允许将自己获得的权限授权给其他用户 - ALL PRIVILEGES 或 ALL: 所有权限 |
SELECT, INSERT, UPDATE ALL PRIVILEGES |
| database_name.table_name | 授权的对象。 - : 所有数据库的所有表(超级管理员权限) - db_name.*: 特定数据库的所有表 - db_name.tbl_name: 特定数据库的特定表 - db_name.proc_name: 特定数据库的特定存储过程 |
mydb.* mydb.users
|
| 'username'@'host' | 用户名和主机的组合,这是唯一标识一个用户的关键。 - 'username': 用户名 - 'host': 允许登录的主机地址 - 'localhost': 仅限本机登录 - : 允许从任何主机登录(不推荐在生产环境使用) - '192.168.1.%': 允许从 168.1. 网段的任何主机登录 |
'webuser'@'%' 'app'@'192.168.1.10' 'report'@'localhost' |
| IDENTIFIED BY 'password' | 可选,为新用户设置密码,或者为已存在用户修改密码。 | IDENTIFIED BY 'MyP@ssw0rd' |
| WITH GRANT OPTION | 可选,拥有此权限的用户可以将自己所拥有的权限,再次授予给其他用户,这是一个非常危险的权限,请谨慎授予。 | WITH GRANT OPTION |
常用授权场景示例
场景1:创建一个只读用户,允许从任何主机连接
这个用户只能查询 mydb 数据库中的所有数据,不能做任何修改。
-- 授予 mydb 数据库所有表的 SELECT 权限 GRANT SELECT ON mydb.* TO 'readonly_user'@'%' IDENTIFIED BY 'a_strong_password'; -- 刷新权限,使更改生效 FLUSH PRIVILEGES;
场景2:创建一个应用用户,允许对特定表的增删改查
这个用户可以对 mydb 数据库的 users 表进行完整的 CRUD 操作。
-- 授予 mydb.users 表的 SELECT, INSERT, UPDATE, DELETE 权限 GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.users TO 'app_user'@'192.168.1.%' IDENTIFIED BY 'app_password_123'; -- 刷新权限 FLUSH PRIVILEGES;
场景3:创建一个数据库管理员,管理特定数据库
这个用户可以管理 mydb 数据库,包括创建表、删除表等,但不能影响其他数据库。

-- 授予 mydb 数据库的所有权限 GRANT ALL PRIVILEGES ON mydb.* TO 'dba_user'@'localhost' IDENTIFIED BY 'dba_secure_pass'; -- 刷新权限 FLUSH PRIVILEGES;
场景4:创建一个超级管理员(谨慎使用)
这个用户拥有所有数据库的所有权限,相当于 root 用户,通常只在需要时创建,用完后应立即撤销。
-- 授予所有数据库的所有权限 GRANT ALL PRIVILEGES ON *.* TO 'super_admin'@'localhost' IDENTIFIED BY 'super_secret_password' WITH GRANT OPTION; -- 刷新权限 FLUSH PRIVILEGES;
重要相关命令
授权之后,通常需要配合以下命令使用:
FLUSH PRIVILEGES
当你执行 GRANT、REVOKE 或直接修改 mysql 数据库下的权限表后,需要执行此命令来让服务器重新加载权限表,使更改立即生效。
FLUSH PRIVILEGES;
注意:从 MySQL 5.7.6 开始,如果你使用 GRANT 语句直接创建用户或修改密码,FLUSH PRIVILEGES 会自动执行,但为了清晰和兼容性,手动加上它仍然是一个好习惯。

REVOKE (撤销权限)
撤销用户权限的命令,与 GRANT 相对。
语法:
REVOKE priv_type [(column_list)] ON database.table FROM 'username'@'host';
示例:
撤销 readonly_user 的 SELECT 权限。
REVOKE SELECT ON mydb.* FROM 'readonly_user'@'%'; FLUSH PRIVILEGES;
注意:REVOKE 只会移除特定的权限,而不会删除用户,如果需要删除用户,请使用 DROP USER。
SHOW GRANTS (查看用户权限)
查看某个用户拥有哪些权限。
语法:
SHOW GRANTS FOR 'username'@'host';
示例:
查看 app_user 的权限。
SHOW GRANTS FOR 'app_user'@'192.168.1.%';
输出结果可能如下:
+------------------------------------------------+
| Grants for app_user@192.168.1.% |
+------------------------------------------------+
| GRANT USAGE ON *.* TO 'app_user'@'192.168.1.%' |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `mydb`.* TO 'app_user'@'192.168.1.%' |
+------------------------------------------------+
DROP USER (删除用户)
彻底删除一个用户及其所有权限。
语法:
DROP USER 'username'@'host';
示例:
删除 readonly_user。
DROP USER 'readonly_user'@'%'; FLUSH PRIVILEGES;
最佳实践和安全建议
- 遵循最小权限原则:只授予用户完成其任务所必需的最小权限,不要轻易使用
ALL PRIVILEGES或GRANT OPTION。 - 主机限制:永远不要为生产环境用户设置
host为 ,根据应用服务器的 IP,将其限制为具体的 IP 或 IP 段,如'app_server'@'10.0.0.10'或'app_server'@'10.0.0.%'。 - 使用强密码:为所有用户设置复杂且唯一的密码。
- 定期审查权限:使用
SHOW GRANTS定期检查用户权限,撤销不再需要的权限。 - 避免直接操作
mysql数据库:虽然可以直接修改mysql.user,mysql.db等表来管理权限,但强烈推荐使用GRANT和REVOKE语句,因为它们可以处理更复杂的权限检查和依赖关系,避免出错。 - 撤销
GRANT OPTION:除非绝对必要,否则不要授予用户GRANT OPTION权限,这可能导致权限失控。
希望这份详细的指南能帮助你熟练掌握 MySQL 的授权命令!
