【MySQL】用户管理详解
在数据库管理中,如果所有操作都使用 root 用户,不仅存在 安全隐患,也不符合最小权限原则。
因此,掌握 MySQL 用户管理与权限控制 是每个数据库管理员必须熟悉的内容。
本文将从用户创建、密码修改、权限授权与回收等方面进行详细讲解。
一、为什么要进行用户管理?
root 用户拥有最高权限,一旦泄露可能造成严重后果。
通过创建不同权限级别的用户,可以:
- 提高系统安全性;
- 控制不同用户对数据库资源的访问;
- 方便运维与团队协作。
二、MySQL 用户基础
2.1 用户信息存储位置
MySQL 中的用户信息存储在系统数据库 mysql 的 user 表 中。
常见字段说明:
| 字段 | 说明 |
|---|---|
host | 用户可登录的主机,例如 localhost 表示只能从本机登录 |
user | 用户名 |
authentication_string | 密码(经过加密存储) |
*_priv | 用户拥有的权限,如 Select_priv、Insert_priv 等 |
查看用户表:
USE mysql;
SELECT host, user, authentication_string FROM user;
2.2 创建用户
语法如下:
CREATE USER '用户名'@'主机名/IP' IDENTIFIED BY '密码';
示例:
CREATE USER 'whb'@'localhost' IDENTIFIED BY '12345678';
执行后,即可在 user 表中看到新用户:
SELECT user, host, authentication_string FROM user;
⚠️ 注意:
-
MySQL 默认启用了密码安全策略,过于简单的密码可能会被拒绝。
可通过以下语句查看密码策略:SHOW VARIABLES LIKE 'validate_password%'; -
不建议创建可以从任意 IP 登录的用户(即
'用户名'@'%')。
2.3 删除用户
删除用户的语法:
DROP USER '用户名'@'主机名';
示例:
DROP USER 'whb'@'localhost';
⚠️ 注意:
如果只写DROP USER 'whb';,系统默认认为'whb'@'%',会导致删除失败。
2.4 修改用户密码
✅ 自己修改自己的密码
SET PASSWORD = PASSWORD('新密码');
✅ 管理员修改其他用户密码
SET PASSWORD FOR '用户名'@'主机名' = PASSWORD('新密码');
示例:
SET PASSWORD FOR 'whb'@'localhost' = PASSWORD('87654321');
修改完成后可验证:
SELECT user, host, authentication_string FROM user;
三、数据库权限管理
MySQL 权限控制非常灵活,可以控制到 数据库级、表级、甚至 字段级。
3.1 权限类型
常见权限包括:
| 权限 | 说明 |
|---|---|
SELECT | 查询数据 |
INSERT | 插入数据 |
UPDATE | 更新数据 |
DELETE | 删除数据 |
CREATE | 创建表或数据库 |
DROP | 删除表或数据库 |
ALL PRIVILEGES | 拥有所有权限 |
3.2 授权给用户
语法:
GRANT 权限列表 ON 库.对象名 TO '用户名'@'主机名' [IDENTIFIED BY '密码'];
说明:
*.*表示所有数据库的所有对象;库.*表示某个数据库下的所有表;identified by可选,用于同时创建或更新用户。
示例:授予 whb 对 test 数据库的查询权限
GRANT SELECT ON test.* TO 'whb'@'localhost';
授权后,用 whb 登录即可查询 test 数据库中的表:
SHOW DATABASES;
USE test;
SHOW TABLES;
SELECT * FROM account;
但尝试删除数据时会提示无权限:
DELETE FROM account;
-- ERROR 1142 (42000): DELETE command denied to user 'whb'@'localhost' for table 'account'
查看当前用户权限
SHOW GRANTS FOR 'whb'@'localhost';
结果示例:
GRANT USAGE ON *.* TO 'whb'@'localhost';
GRANT SELECT ON `test`.* TO 'whb'@'localhost';
3.3 回收权限
语法:
REVOKE 权限列表 ON 库.对象名 FROM '用户名'@'主机名';
示例:回收 whb 在 test 数据库的所有权限:
REVOKE ALL ON test.* FROM 'whb'@'localhost';
刷新权限立即生效:
FLUSH PRIVILEGES;
四、综合示例:完整用户权限流程
| 操作 | SQL 示例 |
|---|---|
| 创建用户 | CREATE USER 'whb'@'localhost' IDENTIFIED BY '12345678'; |
| 授权 | GRANT SELECT ON test.* TO 'whb'@'localhost'; |
| 查看权限 | SHOW GRANTS FOR 'whb'@'localhost'; |
| 修改密码 | SET PASSWORD FOR 'whb'@'localhost' = PASSWORD('87654321'); |
| 回收权限 | REVOKE ALL ON test.* FROM 'whb'@'localhost'; |
| 删除用户 | DROP USER 'whb'@'localhost'; |
五、总结与建议
| 要点 | 建议 |
|---|---|
| 安全性 | 避免使用 root 执行日常操作 |
| 最小权限原则 | 每个用户只授予必要权限 |
| 密码复杂度 | 符合 MySQL 的安全策略要求 |
| 权限管理 | 定期检查并清理无用用户或权限 |
| 备份 | 修改前建议备份用户与权限表 |
