MySQL的权限管理设置方法
作者:阿坤带你走近大数据
本文介绍了MySQL中的权限管理,包括查看、设置和撤销权限,普通用户只能查看自己的权限,设置权限需要管理员操作,管理员可以通过GRANT语句授予权限,并通过REVOKE语句撤销权限,建议遵循最小权限原则,限制主机范围,并定期审计权限,感兴趣的朋友跟随小编一起看看吧
在 MySQL 中,用户查看自己的权限和设置(修改)权限是两个不同的操作:
- 查看权限:普通用户可自行操作
- 设置/修改权限:必须由管理员(如 root)执行,普通用户不能给自己授权(除非被授予
GRANT OPTION)
下面分两部分详细说明:
一、✅ 用户如何查看自己的权限?
方法 1:使用SHOW GRANTS(最推荐)
-- 查看当前用户的全部权限 SHOW GRANTS;
✅ 输出示例:
+------------------------------------------------------------------+ | Grants for 'app_user'@'%' | +------------------------------------------------------------------+ | GRANT USAGE ON *.* TO `app_user`@`%` | | GRANT SELECT, INSERT, UPDATE ON `shop_db`.* TO `app_user`@`%` | +------------------------------------------------------------------+
USAGE表示“能连接”,无实际数据权限- 第二行表示:对
shop_db库的所有表有 查询、插入、更新 权限
方法 2:确认当前身份(避免混淆)
-- 查看当前会话使用的账号 SELECT USER(); -- 你登录时用的账号(如 'app_user'@'192.168.1.50') SELECT CURRENT_USER(); -- MySQL 实际用于权限校验的账号(如 'app_user'@'%')
💡 通常
CURRENT_USER()才是权限匹配的依据。
方法 3:检查是否有某项具体权限(高级)
-- 检查是否对某个库有 SELECT 权限
SELECT
TABLE_SCHEMA AS database_name,
PRIVILEGE_TYPE
FROM INFORMATION_SCHEMA.SCHEMA_PRIVILEGES
WHERE GRANTEE = CONCAT('''', REPLACE(CURRENT_USER(), '@', '''@'''), '''')
AND PRIVILEGE_TYPE = 'SELECT';
⚠️ 普通用户一般用不到,
SHOW GRANTS已足够。
二、🛠️ 如何设置(授予)权限?(需管理员操作)
🔒 重要前提:
普通用户无法给自己授权!必须由具有GRANT OPTION权限的管理员(如 root)执行。
步骤 1:管理员登录 MySQL
mysql -u root -p
步骤 2:使用GRANT语句授予权限
🌰 场景 1:授予数据库级权限(最常用)
-- 授予 app_user 对 shop_db 库的 增删改查 权限 GRANT SELECT, INSERT, UPDATE, DELETE ON shop_db.* TO 'app_user'@'%'; -- 刷新权限(MySQL 8.0+ 通常不需要,但安全起见可加) FLUSH PRIVILEGES;
🌰 场景 2:授予只读权限
GRANT SELECT ON shop_db.* TO 'readonly_user'@'192.168.1.%';
🌰 场景 3:授予所有权限(慎用!)
GRANT ALL PRIVILEGES ON shop_db.* TO 'admin_user'@'localhost';
🌰 场景 4:允许该用户再授权给他人(危险!)
GRANT SELECT ON shop_db.* TO 'user'@'%' WITH GRANT OPTION;
常用权限类型速查表
| 权限 | 作用 |
|---|---|
SELECT | 查询数据 |
INSERT | 插入数据 |
UPDATE | 修改数据 |
DELETE | 删除数据 |
CREATE | 创建表/库 |
DROP | 删除表/库 |
ALTER | 修改表结构 |
INDEX | 创建/删除索引 |
EXECUTE | 执行存储过程 |
ALL PRIVILEGES | 所有权限(不含 GRANT OPTION) |
📌 语法格式:
GRANT 权限列表 ON 数据库.表 TO '用户名'@'主机';
步骤 3:验证权限是否生效
管理员可查看刚授予的权限:
SHOW GRANTS FOR 'app_user'@'%';
用户重新连接后即可使用新权限。
三、❌ 撤销权限(Revoke)
管理员也可随时收回权限:
-- 撤销 app_user 的 DELETE 权限 REVOKE DELETE ON shop_db.* FROM 'app_user'@'%'; -- 撤销所有权限 REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'app_user'@'%';
四、💡 最佳实践建议
对普通用户:
- 使用
SHOW GRANTS;快速了解自己能做什么 - 不要尝试直接修改
mysql.user表(会导致权限不一致)
对管理员:
- 最小权限原则:只给业务必需的权限(如 Web 应用通常不需要
DROP) - 限制主机范围:如
'app_user'@'10.0.0.%'而非'app_user'@'%' - 避免使用 root 跑应用!创建专用账号
五、常见问题解答
Q:为什么我执行GRANT报错 “Access denied”?
A:你当前用户没有 GRANT OPTION 权限。请联系 DBA 或用 root 操作。
Q:授予权限后,应用仍报 “Permission denied”?
A:检查:
- 是否连接的是正确的数据库?
- 用户 host 是否匹配?(
'user'@'localhost'≠'user'@'%') - 是否需要重启应用?(某些连接池会缓存权限)
Q:能否授权到列级别?
A:可以,但极少用:
GRANT SELECT (name, email) ON shop_db.users TO 'user'@'%';
✅ 总结
| 操作 | 谁执行 | 命令 |
|---|---|---|
| 查看自己权限 | 任意用户 | SHOW GRANTS; |
| 授予/修改权限 | 管理员 | GRANT ... TO 'user'@'host'; |
| 撤销权限 | 管理员 | REVOKE ... FROM 'user'@'host'; |
🔐 核心原则:
权限管理 = 安全基石,务必遵循最小权限、明确范围、定期审计。
到此这篇关于MySQL的权限管理的简单介绍的文章就介绍到这了,更多相关mysql权限管理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
