用户与权限管理
约 1038 字大约 3 分钟
布欧-Lewyon
2026-05-15
首页 › MySQL › 运维与部署(在新窗口打开) › 用户与权限管理
MySQL 通过用户和权限系统控制谁可以做什么。遵循最小权限原则——只授予应用所需的最小权限集合——是安全运维的基础。
用户管理
查看用户
SELECT user, host, plugin, account_locked
FROM mysql.user;host 字段决定用户可以从哪些主机连接:
| Host 值 | 含义 |
|---|---|
'localhost' | 仅本机 Unix Socket 连接 |
'127.0.0.1' | 仅本机 TCP 连接 |
'%' | 任意主机(注意安全风险) |
'192.168.1.%' | 特定网段 |
创建用户
-- 创建用户(MySQL 8.0)
CREATE USER 'app'@'192.168.1.%' IDENTIFIED BY 'strong_password';
-- MySQL 8.0 指定认证插件
CREATE USER 'legacy_app'@'%'
IDENTIFIED WITH mysql_native_password BY 'password';修改密码
-- 修改当前用户密码
ALTER USER USER() IDENTIFIED BY 'new_password';
-- 修改指定用户密码
ALTER USER 'app'@'192.168.1.%' IDENTIFIED BY 'new_password';
-- MySQL 5.7 旧语法
SET PASSWORD FOR 'app'@'%' = 'password';删除/锁定用户
DROP USER 'temp_account'@'localhost';
-- 临时禁用而不删除
ALTER USER 'app'@'%' ACCOUNT LOCK;
ALTER USER 'app'@'%' ACCOUNT UNLOCK;权限管理
权限层级
MySQL 权限分四个层级:
GRANT 授权
-- 全局权限(不建议给普通应用)
GRANT ALL PRIVILEGES ON *.* TO 'dba'@'localhost';
-- 数据库级权限(推荐给应用使用)
GRANT SELECT, INSERT, UPDATE, DELETE ON demo.* TO 'app'@'192.168.1.%';
-- 表级权限
GRANT SELECT ON demo.employee TO 'readonly'@'%';
-- 列级权限
GRANT SELECT (name, email) ON demo.user TO 'reporter'@'%';
-- 存储过程权限
GRANT EXECUTE ON PROCEDURE demo.get_employee_by_dept TO 'app'@'%';常用权限列表
| 权限 | 说明 | 适用场景 |
|---|---|---|
SELECT / INSERT / UPDATE / DELETE | CRUD | 应用账号 |
CREATE / ALTER / DROP | DDL | DBA/管理账号 |
INDEX | 管理索引 | DBA |
CREATE VIEW / CREATE ROUTINE | 视图/存储过程 | 开发账号 |
PROCESS | 查看所有进程 | 监控系统 |
REPLICATION SLAVE | 从库连接主库 | 主从复制 |
REPLICATION CLIENT | 查看复制状态 | 监控系统 |
SHOW DATABASES | 列出所有数据库 | 管理账号 |
SUPER | 超级权限(kill 连接、修改全局变量等) | DBA |
REVOKE 回收权限
-- 回收 INSERT 权限
REVOKE INSERT ON demo.* FROM 'app'@'192.168.1.%';
-- 回收所有权限
REVOKE ALL PRIVILEGES ON demo.* FROM 'app'@'%';
-- 注意:REVOKE 只回收显式授权的权限,不回收隐含权限查看权限
-- 查看当前用户的权限
SHOW GRANTS;
-- 查看指定用户的权限
SHOW GRANTS FOR 'app'@'192.168.1.%';刷新权限
-- 直接操作 mysql.user 表后,需要显式刷新
FLUSH PRIVILEGES;
-- 使用 GRANT / REVOKE / CREATE USER 等命令后
-- MySQL 会自动刷新,无需手动执行 FLUSH最小权限实践
-- 应用账号:只给需要的权限,限定主机
CREATE USER 'blog_app'@'10.0.0.%' IDENTIFIED BY 'secure_pass';
GRANT SELECT, INSERT, UPDATE, DELETE ON blog.* TO 'blog_app'@'10.0.0.%';
-- 只读账号:给报表/分析使用
CREATE USER 'readonly'@'%' IDENTIFIED BY 'readonly_pass';
GRANT SELECT ON blog.* TO 'readonly'@'%';
-- DBA 账号
CREATE USER 'dba'@'localhost' IDENTIFIED BY 'admin_pass';
GRANT ALL PRIVILEGES ON *.* TO 'dba'@'localhost' WITH GRANT OPTION;权限授予原则
| 原则 | 说明 |
|---|---|
| 最小权限 | 只给应用需要的权限,不用 ALL |
| 限定主机 | 应用账号限制为应用服务器网段 |
| 区分账号 | 读写分离:写账号、只读账号分开 |
| 定期审计 | 定期 SHOW GRANTS 审查权限 |
| 及时回收 | 人员变动或应用下线时,及时回收权限 |
密码安全策略
-- 查看密码策略
SHOW VARIABLES LIKE 'validate_password%';
-- 设置密码复杂度
SET GLOBAL validate_password.length = 8; -- 最小长度
SET GLOBAL validate_password.mixed_case_count = 1; -- 大写+小写至少各1
SET GLOBAL validate_password.number_count = 1; -- 至少1个数字
SET GLOBAL validate_password.special_char_count = 1; -- 至少1个特殊字符如果
validate_password插件未安装,可以这样加载:INSTALL COMPONENT 'file://component_validate_password';
小结
- 用户由
user+host唯一标识,host控制连接来源。 - 权限分全局、数据库、表、列四个层级,只授予业务所需的最小集合。
GRANT/REVOKE管理权限,SHOW GRANTS查看。- 应用账号限制主机范围,区分读写账号。
- 密码策略(
validate_password)和定期轮换提升安全性。
