MySQL数据源的权限设置本质是对数据库用户可操作资源的精细化管控,通过合理分配权限可以既保障业务正常访问数据,又避免不必要的安全风险。不同业务场景对MySQL数据源的访问需求不同,比如只读报表场景只需要查询权限,业务写入场景需要增删改权限,运维管理场景需要全局管理权限,因此需要针对性配置。

MySQL权限体系基础认知
MySQL的权限分为多个层级,不同层级的权限作用范围不同:
- 全局权限:作用于MySQL实例下的所有数据库,比如创建用户、关闭数据库等权限
- 数据库级权限:作用于指定数据库下的所有表,比如操作某个库的所有表
- 表级权限:作用于指定数据库下的指定表,比如操作某张表的增删改查
- 列级权限:作用于指定表的指定列,比如只能修改某张表的特定字段
创建MySQL数据源专用用户
不建议直接使用root用户作为业务数据源的访问用户,应该为不同业务创建独立的普通用户。创建用户的基本语法如下:
-- 创建用户,设置密码,允许从指定IP访问,%代表允许所有IP访问 CREATE USER 'data_source_user'@'192.168.0.100' IDENTIFIED BY 'StrongPassword123'; -- 如果需要允许所有IP访问,使用如下语句 CREATE USER 'data_source_user'@'%' IDENTIFIED BY 'StrongPassword123';
需要注意密码强度要符合要求,避免使用弱密码带来安全风险。如果MySQL开启了密码复杂度校验,需要设置符合规则的密码。
授予数据源对应权限
使用GRANT语句为用户授予权限,权限授予要遵循最小权限原则,仅分配业务必需的最小权限集合。
只读数据源权限配置
如果数据源仅用于查询报表,只需要授予查询权限:
-- 授予指定数据库下所有表的查询权限 GRANT SELECT ON report_db.* TO 'data_source_user'@'192.168.0.100'; -- 刷新权限使配置生效 FLUSH PRIVILEGES;
读写数据源权限配置
如果数据源需要支持业务数据的增删改查,授予对应操作权限:
-- 授予指定数据库下所有表的增删改查权限 GRANT SELECT,INSERT,UPDATE,DELETE ON business_db.* TO 'data_source_user'@'192.168.0.100'; FLUSH PRIVILEGES;
全局管理权限配置
如果是运维管理类的数据源,需要授予全局权限,这类权限要严格控制使用范围:
-- 授予全局所有权限,仅用于管理场景 GRANT ALL PRIVILEGES ON *.* TO 'admin_user'@'127.0.0.1' WITH GRANT OPTION; FLUSH PRIVILEGES;
权限查看与回收
可以通过如下语句查看用户的权限配置:
-- 查看指定用户的所有权限 SHOW GRANTS FOR 'data_source_user'@'192.168.0.100';
如果业务需求变更,需要回收多余权限,使用REVOKE语句:
-- 回收用户的删除权限 REVOKE DELETE ON business_db.* FROM 'data_source_user'@'192.168.0.100'; FLUSH PRIVILEGES;
权限配置注意事项
- 权限授予后必须执行
FLUSH PRIVILEGES语句才能生效,除非是使用CREATE USER、GRANT等语句自动刷新权限的场景 - 用户host字段的设置要精准,尽量避免使用%允许所有IP访问,缩小可访问的IP范围降低风险
- 定期审计用户权限,及时回收不再使用的用户权限和过期权限
- 避免使用WITH GRANT OPTION选项,防止普通用户将权限授予其他用户,除非是明确的管理需求
完成权限配置后,可以在业务端使用配置的用户名密码连接MySQL数据源,验证权限是否符合预期,比如只读用户尝试执行插入语句会返回权限不足的错误,说明配置生效。