【MySQL】用户管理

【MySQL】用户管理完整实战指南
(基于 MySQL 8.x 最新规范,2026 年视角)

MySQL 用户管理是数据库安全的核心,直接决定了谁能访问什么数据、能执行什么操作。
MySQL 8.0+ 相比 5.7 做了重大调整:创建用户和授权必须分离(不再允许 CREATE USER ... IDENTIFIED BY 同时授权),这大大提升了安全性。

一、核心原则(生产环境必须遵守)

  1. 最小权限原则:只给用户完成工作所需的最小权限(绝不给普通用户 ALL PRIVILEGES 或 SUPER)
  2. 限制登录来源:优先用具体 IP 或内网段(如 ‘192.168.1.%’),尽量避免 ‘%’ 通配符
  3. 强密码 + 过期策略:密码复杂度高,定期强制修改
  4. 使用角色(Role):MySQL 8.0+ 强烈推荐,用角色统一管理一组权限
  5. 定期审计:查看谁拥有哪些权限,及时回收不再需要的账户
  6. root 账户保护:密码复杂,仅本地登录或跳板机使用,禁用远程 root

二、MySQL 用户权限体系快速回顾

权限级别对应系统表典型命令示例说明
全局权限mysql.userGRANT ALL ON . TO …影响整个实例(如 CREATE USER、RELOAD)
数据库级别mysql.dbGRANT SELECT ON test_db.* TO …影响指定数据库所有表
表级别mysql.tables_privGRANT INSERT ON test_db.orders TO …针对单表
列级别mysql.columns_privGRANT UPDATE (price) ON test_db.orders TO …只允许更新 price 列
存储过程mysql.procs_privGRANT EXECUTE ON PROCEDURE proc_name TO …

三、核心操作命令合集(MySQL 8.x 推荐写法)

1. 创建用户(必须单独执行)

-- 方式1:最推荐(指定主机)
CREATE USER 'dev_user'@'192.168.1.%' IDENTIFIED BY 'StrongPass#2026';

-- 方式2:允许任意主机(生产慎用!)
CREATE USER 'app_user'@'%' IDENTIFIED BY 'AppPass123!';

-- 方式3:创建后立即修改密码(更安全)
CREATE USER 'readonly'@'localhost';
ALTER USER 'readonly'@'localhost' IDENTIFIED BY 'ReadOnly2026!';

密码策略建议(my.cnf 或命令设置):

validate_password.length = 12
validate_password.policy = MEDIUM   # 或 STRONG

2. 授予权限(GRANT)

-- 全局只读用户(适合监控、报表工具)
GRANT SELECT, SHOW DATABASES, PROCESS, REPLICATION CLIENT ON *.* TO 'monitor'@'192.168.1.100';

-- 开发用户:指定数据库读写
GRANT SELECT, INSERT, UPDATE, DELETE ON shop_db.* TO 'dev_user'@'192.168.1.%';

-- 仅允许查询 + 导出
GRANT SELECT, LOCK TABLES, RELOAD ON shop_db.* TO 'export_user'@'%';

-- 列级权限(只允许修改价格,不允许改其他字段)
GRANT UPDATE (price) ON shop_db.products TO 'price_editor'@'localhost';

-- 授予执行存储过程权限
GRANT EXECUTE ON PROCEDURE shop_db.calculate_order_total TO 'proc_user'@'%';

-- 授予角色(MySQL 8+ 推荐)
CREATE ROLE 'app_readwrite';
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_readwrite';

-- 把角色授予用户
GRANT 'app_readwrite' TO 'app_user'@'%';
SET DEFAULT ROLE 'app_readwrite' TO 'app_user'@'%';

立即生效(非常重要!):

FLUSH PRIVILEGES;

3. 查看权限(调试必备)

-- 查看某个用户的所有权限(最常用)
SHOW GRANTS FOR 'dev_user'@'192.168.1.%';

-- 查看所有用户列表
SELECT user, host, authentication_string FROM mysql.user ORDER BY user;

-- 查看用户拥有的角色
SELECT * FROM mysql.default_roles WHERE user = 'app_user' AND host = '%';

-- 查看全局权限
SELECT * FROM mysql.user WHERE user = 'dev_user'\G

4. 回收权限(REVOKE)

-- 回收指定权限
REVOKE INSERT, UPDATE, DELETE ON shop_db.* FROM 'dev_user'@'192.168.1.%';

-- 回收角色
REVOKE 'app_readwrite' FROM 'app_user'@'%';

-- 回收所有权限(但不删除用户)
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'old_user'@'%';

-- 回收全局权限
REVOKE ALL ON *.* FROM 'super_dev'@'%';

5. 删除用户

DROP USER 'old_user'@'%';
-- 或先回收权限再删除
DROP USER IF EXISTS 'temp_user'@'localhost';

注意:删除用户前务必确认没有正在使用的连接(KILL 进程)。

6. 修改密码 & 强制过期

-- 修改密码(推荐方式)
ALTER USER 'dev_user'@'192.168.1.%' IDENTIFIED BY 'NewPass#2026!';

-- 强制用户下次登录必须改密码
ALTER USER 'new_dev'@'%' PASSWORD EXPIRE;

四、生产环境最佳实践 Checklist(2026 年推荐)

  • [ ] 禁用 root 远程登录(只允许 localhost 或跳板机)
  • [ ] 所有应用用户使用专用账号,密码随机生成 + 密钥管理
  • [ ] 使用角色统一管理权限(便于批量回收/调整)
  • [ ] 避免 ‘%’ 通配符,优先使用具体 IP 或内网段(如 ‘10.66.%’)
  • [ ] 开启密码过期策略(PASSWORD EXPIRE INTERVAL 90 DAY)
  • [ ] 定期执行 SELECT user, host, authentication_string FROM mysql.user 审计
  • [ ] 开启慢查询日志 + general_log(临时开启审计)
  • [ ] 使用连接池(如 HikariCP) + 最小权限账号连接应用
  • [ ] 备份用户权限脚本(SHOW GRANTS FOR … INTO OUTFILE)
  • [ ] 生产环境关闭 skip-name-resolve(防止 DNS 劫持)

一句话总结面试最稳的回答:

MySQL 8.0+ 用户管理核心原则是“创建与授权分离、最小权限、主机限制、角色化管理”。
推荐流程:先 CREATE USER → 再 GRANT → 最后 FLUSH PRIVILEGES。

重阳,你现在是想在项目里给应用创建专用账号,还是在排查某个用户的权限问题?
或者你想看某个具体场景的完整脚本(比如电商读写分离用户、只读从库用户、运维监控用户等)?可以直接告诉我,我们继续细化~

文章已创建 4206

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部