Carry の Blog Carry の Blog
首页
  • Nginx
  • Prometheus
  • Iptables
  • Systemd
  • Firewalld
  • Docker
  • Sshd
  • DBA工作笔记
  • MySQL
  • Redis
  • TiDB
  • Elasticsearch
  • Python
  • Shell
  • MySQL8-SOP手册
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Carry の Blog

好记性不如烂键盘
首页
  • Nginx
  • Prometheus
  • Iptables
  • Systemd
  • Firewalld
  • Docker
  • Sshd
  • DBA工作笔记
  • MySQL
  • Redis
  • TiDB
  • Elasticsearch
  • Python
  • Shell
  • MySQL8-SOP手册
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • MySQL8-SOP

  • MySQL实战45讲学习笔记

    • MySQL45讲学习笔记
    • MySQL基础架构
    • MySQL日志系统 (Redo Log 与 Binlog)
    • MySQL字符串字段索引优化
    • MySQL索引原理与优化
    • MySQL锁机制详解
    • MySQL事务与MVCC机制
    • MySQL普通索引与唯一索引的选择
    • MySQL优化器如何选择索引
    • MySQL抖动刷脏页
    • 表空间管理与回收
    • count函数详解
    • 日志索引
    • orderby工作原理
    • 随机排序实现
    • SQL性能差异函数与转换
    • 慢查询分析锁与版本
    • 幻读与间隙锁
    • 加锁规则分析
    • 应急性能优化方法
    • 数据持久化保证
    • 主备一致性原理
    • 高可用架构与切换
    • 备库延迟分析与优化
    • 主备切换GTID
    • 读写分离实践与问题
    • 数据库健康检查
    • 锁与死锁
    • 数据误删恢复
    • Kill命令详解
    • 查询与内存使用分析
    • Join原理与选择
    • 临时表原理与应用
    • 内部临时表详解
    • Memory引擎详解
    • 自增ID详解
    • Insert加锁分析
    • 表复制方法比较
    • Grant与权限管理
      • 1. 权限管理基础概念
        • 1.1 权限类型概述
        • 1.2 权限层次结构
      • 2. 常用权限详解
        • 2.1 数据库操作权限
        • 2.2 数据操作权限
        • 2.3 系统管理权限
      • 3. Grant语句详解
        • 3.1 基本Grant语法
        • 3.2 权限对象类型
        • 3.3 用户账户管理
      • 4. 权限继承与角色
        • 4.1 角色机制(MySQL 8.0+)
        • 4.2 权限继承机制
      • 5. 权限管理最佳实践
        • 5.1 最小权限原则
        • 5.2 权限验证与审计
        • 5.3 安全配置建议
      • 6. 权限管理高级技巧
        • 6.1 权限批量操作
        • 6.2 权限模板管理
        • 6.3 权限继承管理
      • 7. 权限管理故障排除
        • 7.1 权限问题诊断
        • 7.2 权限修复方法
      • 8. 权限管理工具和脚本
        • 8.1 权限管理脚本
        • 8.2 权限审计脚本
      • 9. 总结
    • 分区表详解
    • SQL语句中的Join问题
    • 自增ID用尽问题
  • 专题系列
  • MySQL实战45讲学习笔记
Carry の Blog
2024-07-27
目录

Grant与权限管理

# Grant与权限管理

权限管理是数据库安全的核心组成部分,合理的权限分配既能保障数据安全,又能提高运维效率。本文将深入探讨MySQL中的Grant语句和权限管理体系。

# 1. 权限管理基础概念

# 1.1 权限类型概述

MySQL中的权限可以分为多个层级和类型:

-- 1. 数据库级别权限
GRANT SELECT, INSERT ON database_name.* TO 'user'@'host';

-- 2. 表级别权限
GRANT SELECT, INSERT ON database_name.table_name TO 'user'@'host';

-- 3. 列级别权限
GRANT SELECT (column1, column2) ON database_name.table_name TO 'user'@'host';

-- 4. 函数/过程级别权限
GRANT EXECUTE ON PROCEDURE procedure_name TO 'user'@'host';

-- 5. 全局权限
GRANT ALL PRIVILEGES ON *.* TO 'user'@'host';
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 1.2 权限层次结构

-- 权限层次从高到低:
-- 1. 全局权限:影响所有数据库
-- 2. 数据库权限:影响特定数据库
-- 3. 表权限:影响特定表
-- 4. 列权限:影响特定列
-- 5. 过程权限:影响存储过程和函数

-- 查看当前用户权限
SHOW GRANTS FOR CURRENT_USER();
SHOW GRANTS FOR 'user'@'host';
1
2
3
4
5
6
7
8
9
10

# 2. 常用权限详解

# 2.1 数据库操作权限

-- 数据库操作权限
-- CREATE:创建数据库和表
GRANT CREATE ON database_name.* TO 'user'@'host';

-- ALTER:修改数据库和表结构
GRANT ALTER ON database_name.* TO 'user'@'host';

-- DROP:删除数据库和表
GRANT DROP ON database_name.* TO 'user'@'host';

-- INDEX:创建和删除索引
GRANT INDEX ON database_name.* TO 'user'@'host';

-- REFERENCES:创建外键约束
GRANT REFERENCES ON database_name.* TO 'user'@'host';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 2.2 数据操作权限

-- 数据操作权限
-- SELECT:查询数据
GRANT SELECT ON database_name.table_name TO 'user'@'host';

-- INSERT:插入数据
GRANT INSERT ON database_name.table_name TO 'user'@'host';

-- UPDATE:更新数据
GRANT UPDATE ON database_name.table_name TO 'user'@'host';

-- DELETE:删除数据
GRANT DELETE ON database_name.table_name TO 'user'@'host';

-- TRIGGER:触发器操作
GRANT TRIGGER ON database_name.* TO 'user'@'host';

-- EVENT:事件调度
GRANT EVENT ON database_name.* TO 'user'@'host';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 2.3 系统管理权限

-- 系统管理权限
-- CREATE USER:创建用户
GRANT CREATE USER ON *.* TO 'user'@'host';

-- SUPER:超级权限
GRANT SUPER ON *.* TO 'user'@'host';

-- RELOAD:重新加载配置
GRANT RELOAD ON *.* TO 'user'@'host';

-- SHUTDOWN:关闭服务器
GRANT SHUTDOWN ON *.* TO 'user'@'host';

-- PROCESS:查看进程
GRANT PROCESS ON *.* TO 'user'@'host';

-- FILE:文件操作
GRANT FILE ON *.* TO 'user'@'host';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 3. Grant语句详解

# 3.1 基本Grant语法

-- 基本Grant语法
GRANT privilege_list ON object_type TO user_specification;

-- 示例
GRANT SELECT, INSERT ON testdb.users TO 'john'@'localhost';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%';

-- 多个权限的Grant
GRANT SELECT, INSERT, UPDATE, DELETE ON testdb.* TO 'user'@'host';

-- 使用WITH选项
GRANT SELECT ON testdb.* TO 'user'@'host' WITH GRANT OPTION;
1
2
3
4
5
6
7
8
9
10
11
12

# 3.2 权限对象类型

-- 不同类型的权限对象
-- 1. 全局权限
GRANT ALL PRIVILEGES ON *.* TO 'user'@'host';

-- 2. 数据库权限
GRANT SELECT, INSERT ON testdb.* TO 'user'@'host';

-- 3. 表权限
GRANT SELECT, UPDATE ON testdb.users TO 'user'@'host';

-- 4. 列权限
GRANT SELECT (name, email) ON testdb.users TO 'user'@'host';

-- 5. 函数/过程权限
GRANT EXECUTE ON PROCEDURE testdb.my_procedure TO 'user'@'host';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 3.3 用户账户管理

-- 创建用户
CREATE USER 'user'@'host' IDENTIFIED BY 'password';
CREATE USER 'user'@'host' IDENTIFIED BY PASSWORD '*PASSWORD_HASH';

-- 创建用户并授予权限
CREATE USER 'user'@'host' IDENTIFIED BY 'password';
GRANT SELECT ON database_name.* TO 'user'@'host';

-- 修改用户密码
ALTER USER 'user'@'host' IDENTIFIED BY 'new_password';

-- 重命名用户
RENAME USER 'old_user'@'host' TO 'new_user'@'host';
1
2
3
4
5
6
7
8
9
10
11
12
13

# 4. 权限继承与角色

# 4.1 角色机制(MySQL 8.0+)

-- 创建角色
CREATE ROLE 'app_developer'@'%';
CREATE ROLE 'app_analyst'@'%';

-- 为角色授予权限
GRANT SELECT, INSERT, UPDATE ON appdb.* TO 'app_developer'@'%';
GRANT SELECT ON appdb.* TO 'app_analyst'@'%';

-- 将角色分配给用户
CREATE USER 'developer1'@'%' IDENTIFIED BY 'password';
GRANT 'app_developer'@'%' TO 'developer1'@'%';

-- 激活角色
SET DEFAULT ROLE 'app_developer'@'%' TO 'developer1'@'%';
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 4.2 权限继承机制

-- 权限继承示例
-- 1. 数据库级别权限继承
GRANT SELECT, INSERT ON companydb.* TO 'user'@'host';

-- 2. 表级别权限继承
GRANT SELECT, UPDATE ON companydb.employees TO 'user'@'host';

-- 3. 列级别权限继承
GRANT SELECT (name, email) ON companydb.employees TO 'user'@'host';
1
2
3
4
5
6
7
8
9

# 5. 权限管理最佳实践

# 5.1 最小权限原则

-- 遵循最小权限原则
-- 不要给用户过多权限
-- 为不同用途创建不同用户

-- 示例:为不同应用创建不同用户
-- Web应用用户
CREATE USER 'web_app'@'%' IDENTIFIED BY 'strong_password';
GRANT SELECT, INSERT, UPDATE ON ecommerce.* TO 'web_app'@'%';

-- 数据分析用户
CREATE USER 'analyst'@'%' IDENTIFIED BY 'strong_password';
GRANT SELECT ON ecommerce.* TO 'analyst'@'%';

-- 备份用户
CREATE USER 'backup_user'@'%' IDENTIFIED BY 'strong_password';
GRANT SELECT, LOCK TABLES ON ecommerce.* TO 'backup_user'@'%';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 5.2 权限验证与审计

-- 权限验证
SHOW GRANTS FOR 'user'@'host';

-- 查看权限层次结构
SELECT 
    User,
    Host,
    Select_priv,
    Insert_priv,
    Update_priv,
    Delete_priv
FROM mysql.user 
WHERE User = 'user';

-- 权限审计脚本
DELIMITER //
CREATE PROCEDURE audit_user_permissions()
BEGIN
    SELECT 
        User,
        Host,
        CONCAT('SELECT:', Select_priv, 
               ', INSERT:', Insert_priv,
               ', UPDATE:', Update_priv,
               ', DELETE:', Delete_priv) as permission_summary
    FROM mysql.user 
    WHERE User NOT IN ('root', 'mysql.sys', 'mysql.session');
END //
DELIMITER ;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

# 5.3 安全配置建议

-- 安全配置建议
-- 1. 限制用户连接数
GRANT USAGE ON *.* TO 'user'@'host' WITH MAX_USER_CONNECTIONS 10;

-- 2. 设置密码策略
-- 3. 定期更新密码
-- 4. 及时撤销不再需要的权限

-- 撤销权限示例
REVOKE INSERT, UPDATE ON testdb.* FROM 'user'@'host';
1
2
3
4
5
6
7
8
9
10

# 6. 权限管理高级技巧

# 6.1 权限批量操作

-- 批量授予权限
-- 为多个用户授予权限
GRANT SELECT, INSERT ON testdb.* TO 
    'user1'@'localhost',
    'user2'@'localhost',
    'user3'@'localhost';

-- 批量撤销权限
REVOKE SELECT ON testdb.* FROM 
    'user1'@'localhost',
    'user2'@'localhost';
1
2
3
4
5
6
7
8
9
10
11

# 6.2 权限模板管理

-- 创建权限模板
-- 1. 开发人员权限模板
CREATE ROLE 'developer_template'@'%';
GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'developer_template'@'%';

-- 2. 数据分析师权限模板
CREATE ROLE 'analyst_template'@'%';
GRANT SELECT ON appdb.* TO 'analyst_template'@'%';

-- 3. DBA权限模板
CREATE ROLE 'dba_template'@'%';
GRANT ALL PRIVILEGES ON *.* TO 'dba_template'@'%';
1
2
3
4
5
6
7
8
9
10
11
12

# 6.3 权限继承管理

-- 权限继承示例
-- 创建基础权限
CREATE ROLE 'base_user'@'%';
GRANT SELECT ON commondb.* TO 'base_user'@'%';

-- 创建高级权限
CREATE ROLE 'advanced_user'@'%';
GRANT 'base_user'@'%' TO 'advanced_user'@'%';
GRANT INSERT, UPDATE ON commondb.* TO 'advanced_user'@'%';
1
2
3
4
5
6
7
8
9

# 7. 权限管理故障排除

# 7.1 权限问题诊断

-- 权限问题诊断
-- 1. 检查当前用户权限
SHOW GRANTS FOR CURRENT_USER();

-- 2. 检查特定用户权限
SHOW GRANTS FOR 'user'@'host';

-- 3. 检查用户账户状态
SELECT User, Host, Password FROM mysql.user WHERE User = 'user';

-- 4. 检查权限表状态
SELECT * FROM mysql.db WHERE User = 'user';
SELECT * FROM mysql.tables_priv WHERE User = 'user';
1
2
3
4
5
6
7
8
9
10
11
12
13

# 7.2 权限修复方法

-- 权限修复示例
-- 1. 重新授予权限
GRANT SELECT, INSERT ON testdb.* TO 'user'@'host';

-- 2. 刷新权限
FLUSH PRIVILEGES;

-- 3. 重置用户权限
DROP USER 'user'@'host';
CREATE USER 'user'@'host' IDENTIFIED BY 'password';
GRANT SELECT, INSERT ON testdb.* TO 'user'@'host';
1
2
3
4
5
6
7
8
9
10
11

# 8. 权限管理工具和脚本

# 8.1 权限管理脚本

-- 创建权限管理存储过程
DELIMITER //
CREATE PROCEDURE manage_user_permissions(
    IN user_name VARCHAR(50),
    IN host_name VARCHAR(50),
    IN action VARCHAR(10),
    IN privileges TEXT,
    IN database_name VARCHAR(50),
    IN table_name VARCHAR(50)
)
BEGIN
    DECLARE grant_sql TEXT;
    
    IF action = 'GRANT' THEN
        SET grant_sql = CONCAT('GRANT ', privileges, ' ON ', database_name, '.', table_name, ' TO ''', user_name, '''@''', host_name, '''');
        SET @sql = grant_sql;
        PREPARE stmt FROM @sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    ELSEIF action = 'REVOKE' THEN
        SET grant_sql = CONCAT('REVOKE ', privileges, ' ON ', database_name, '.', table_name, ' FROM ''', user_name, '''@''', host_name, '''');
        SET @sql = grant_sql;
        PREPARE stmt FROM @sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END IF;
    
    FLUSH PRIVILEGES;
END //
DELIMITER ;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# 8.2 权限审计脚本

-- 权限审计脚本
DELIMITER //
CREATE PROCEDURE audit_permissions()
BEGIN
    -- 审计全局权限
    SELECT 
        User,
        Host,
        Select_priv,
        Insert_priv,
        Update_priv,
        Delete_priv,
        Create_priv,
        Drop_priv
    FROM mysql.user 
    WHERE User NOT IN ('root', 'mysql.sys', 'mysql.session')
    ORDER BY User;
    
    -- 审计数据库权限
    SELECT 
        User,
        Host,
        Db,
        Select_priv,
        Insert_priv,
        Update_priv,
        Delete_priv
    FROM mysql.db 
    WHERE User NOT IN ('root', 'mysql.sys', 'mysql.session')
    ORDER BY User, Db;
END //
DELIMITER ;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

# 9. 总结

权限管理是MySQL数据库安全的重要组成部分。通过合理使用Grant语句和权限管理体系,可以:

  1. 保障数据安全:通过最小权限原则限制用户访问
  2. 提高运维效率:通过角色和模板简化权限管理
  3. 便于审计追踪:清晰的权限分配便于安全管理
  4. 降低安全风险:避免权限过度分配导致的安全漏洞

在实际应用中,应该根据业务需求和安全要求,制定合适的权限管理策略,定期审查和优化权限分配,确保数据库系统的安全稳定运行。

#MySQL#权限管理#Grant#安全
上次更新: 3/4/2026

← 表复制方法比较 分区表详解→

最近更新
01
表空间管理与回收
03-04
02
MySQL抖动刷脏页
03-04
03
count函数详解
03-04
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式