5 用户管理
本节介绍 MySQL/MariaDB 中用户与权限的基本概念,包含创建用户、授予 权限、回收权限以及常见安全建议。
5.1 MySQL 用户与连接身份
在 MySQL 中,一个用户由两部分组成:
'用户名'@'主机匹配规则'
示例:
'root'@'localhost':只允许从本机通过本地套接字或 127.0.0.1 登录;'appuser'@'10.0.0.%':允许从 10.0.0.0/24 网段任意主机登录;'readonly'@'%':允许从任意来源地址登录(生产环境需谨慎)。
小提示:
mysql.user表中存放了所有账户和权限信息,日常操作通过CREATE USER、GRANT等语句完成即可,无需直接修改系统表。
5.2 创建与删除用户
5.2.1 创建用户
-- 创建只能从本机登录的管理员
CREATE USER 'admin'@'localhost'
IDENTIFIED BY 'StrongPassw0rd!';
-- 创建应用账户,仅允许 10.0.0.* 网段访问
CREATE USER 'appuser'@'10.0.0.%'
IDENTIFIED BY 'AppPass123!';
5.2.2 修改密码
ALTER USER 'admin'@'localhost'
IDENTIFIED BY 'NewStrongPass!';
或使用 SET PASSWORD(不同版本语法略有区别)。
5.2.3 删除用户
DROP USER IF EXISTS 'appuser'@'10.0.0.%';
5.3 权限模型与 GRANT 语法
5.3.1 权限层级
MySQL 权限大致分为以下几个层级:
- 全局权限:对整个实例生效,例如
SUPER、RELOAD、REPLICATION SLAVE; - 数据库级权限:针对某个库,例如
SELECT、INSERT、UPDATE等; - 表级权限:针对某张表,例如
SELECT、INSERT、DELETE等; - 列级权限:更细粒度地控制到单列;
- 例程级权限:针对存储过程、函数等。
5.3.2 授予权限 (GRANT)
-- 授予单库读写权限
GRANT SELECT, INSERT, UPDATE, DELETE
ON app_db.*
TO 'appuser'@'10.0.0.%';
-- 授予只读权限
GRANT SELECT
ON reporting_db.*
TO 'readonly'@'%';
-- 授予对某张表的特殊权限
GRANT INSERT, UPDATE
ON app_db.orders
TO 'appuser'@'10.0.0.%';
变更权限后,可使用
FLUSH PRIVILEGES;强制刷新权限缓存 (MySQL 8 以后一般会自动生效,通常无需手动执行)。
5.3.3 回收权限 (REVOKE)
REVOKE INSERT, UPDATE
ON app_db.orders
FROM 'appuser'@'10.0.0.%';
5.4 角色 (ROLE) 的使用(支持该特性的版本)
角色是权限的集合,可以一次性授予多个用户,便于管理。
-- 创建角色
CREATE ROLE 'app_readonly';
-- 赋予角色一些权限
GRANT SELECT ON app_db.* TO 'app_readonly';
-- 将角色授予具体用户
GRANT 'app_readonly' TO 'report_user'@'10.0.0.%';
-- 启用默认角色
SET DEFAULT ROLE 'app_readonly' TO 'report_user'@'10.0.0.%';
5.5 常见安全建议
- 避免直接使用 root 连接业务系统,为每个应用创建专用账号;
- 权限遵循“最小授权原则”,只授予真正需要的权限;
- 对外网开放的账号务必限制来源 IP(不要使用
'%'); - 密码需符合复杂度要求并定期轮换;
- 重要环境启用审计日志,记录敏感操作;
- 定期检查
mysql.user和information_schema.user_privileges, 清理长期未使用的账号与多余权限。
通过合理设计账户与权限,可以在保证安全性的同时,为应用提供足够灵活 的数据访问能力。