mysql如何使用grant命令授权_mysql权限分配教程

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

MySQL 的

GRANT
命令不是“授权开关”,而是权限叠加操作——重复执行不会报错,但也不会自动覆盖旧权限,更不会清除未显式声明的权限。

grant 语句必须指定明确的作用域和权限类型

权限不是全局生效的,

GRANT
必须写清「对哪个库/表」「由哪个用户」「从哪个主机连接」。漏掉任意一环,权限就加不到目标账户上。

作用域格式是
database.table
,用
*
表示全部数据库,
*.*
才表示所有库所有表
用户格式是
'username'@'host'
,比如
'appuser'@'10.20.30.%'
'appuser'@'localhost'
是两个完全独立的账号
不加
WITH GRANT OPTION
,该用户就无法把权限再授给其他人

常见错误:执行 grant 后权限不生效

最常被忽略的是忘记

FLUSH PRIVILEGES
—— 但其实它通常不需要手动执行。MySQL 5.7+ 在多数情况下会自动重载权限表;只有当你直接修改了
mysql.user
等系统表后才需要它。

真正导致权限不生效的高频原因:用户连接时用的 host 不匹配(比如你授的是
'user'@'192.168.1.%'
,但客户端连的是
localhost
,而 MySQL 把
localhost
当作 socket 连接,走的是
'user'@'localhost'
这条记录)
检查当前登录用户实际匹配哪条权限记录:执行
SELECT USER(), CURRENT_USER();
,前者是“你声称是谁”,后者是“MySQL 认为你是谁”
权限变更后,已存在的连接不会立即失效,新连接才会应用新权限

只授必要权限,避免用 ALL PRIVILEGES

ALL PRIVILEGES
包含
FILE
SHUTDOWN
GRANT OPTION
等高危权限,生产环境应严格限制。

应用账号通常只需
SELECT, INSERT, UPDATE, DELETE
,读写分离场景下甚至只给
SELECT
管理类账号如需建库建表,加上
CREATE, DROP, INDEX, ALTER
即可,不必开
CREATE USER
RELOAD
如果误授了
GRANT OPTION
,该用户就能给自己或他人加权限,相当于绕过 DBA 控制

权限粒度越细,后期排查越容易。别图省事用

GRANT ALL ON *.* TO ...
,一旦出问题,连是哪个库被删的都得翻日志查。

相关推荐