MySQL 中的用户管理

MySQL 用户管理涉及创建用户、授予权限、修改密码、撤销权限 等操作,是数据库安全管理的重要组成部分。MySQL 的用户信息存储在 mysql.user 系统表中。

一、用户管理

概念 说明
用户名 登录 MySQL 时使用的账号名
主机名 允许用户从哪个主机登录(localhost、%、192.168.1.%)
密码 用户身份验证的凭证
权限 用户对数据库/表/列的操作权限
角色 一组权限的集合(MySQL 8.0+)

二、查看用户

查看所有用户

复制代码
-- 查看用户列表
SELECT User, Host, authentication_string FROM mysql.user;

-- 查看当前用户
SELECT CURRENT_USER();

-- 查看当前会话的用户
SELECT USER();

三、创建用户

1. 基本创建语法

复制代码
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';

2. 示例

复制代码
-- 创建本地用户
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'SecurePass123!';

-- 创建远程用户(允许任意主机)
CREATE USER 'app_user'@'%' IDENTIFIED BY 'SecurePass123!';

-- 创建指定网段的用户
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'SecurePass123!';

-- 创建无密码用户(不推荐)
CREATE USER 'guest'@'localhost';

-- 创建时指定加密插件(MySQL 8.0+)
CREATE USER 'app_user'@'localhost' 
IDENTIFIED WITH mysql_native_password BY 'SecurePass123!';

-- 创建多个用户
CREATE USER 
    'user1'@'localhost' IDENTIFIED BY 'pass1',
    'user2'@'%' IDENTIFIED BY 'pass2';

四、修改用户

1. 修改密码

复制代码
-- 方法1:使用 ALTER USER(推荐,MySQL 5.7.6+)
ALTER USER 'app_user'@'localhost' IDENTIFIED BY 'NewPass456!';

-- 方法2:使用 SET PASSWORD(旧方式)
SET PASSWORD FOR 'app_user'@'localhost' = 'NewPass456!';

-- 方法3:修改当前用户密码
ALTER USER USER() IDENTIFIED BY 'NewPass456!';

2. 修改用户名或主机

复制代码
-- 重命名用户
RENAME USER 'old_name'@'localhost' TO 'new_name'@'localhost';

-- 修改主机
RENAME USER 'app_user'@'%' TO 'app_user'@'192.168.1.%';

3. 锁定/解锁用户

复制代码
-- 锁定用户(禁止登录)
ALTER USER 'app_user'@'localhost' ACCOUNT LOCK;

-- 解锁用户
ALTER USER 'app_user'@'localhost' ACCOUNT UNLOCK;

4. 修改密码过期策略

复制代码
-- 设置密码永不过期
ALTER USER 'app_user'@'localhost' PASSWORD EXPIRE NEVER;

-- 设置密码立即过期
ALTER USER 'app_user'@'localhost' PASSWORD EXPIRE;

-- 设置密码90天后过期
ALTER USER 'app_user'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;

五、授予权限(GRANT)

1. 基本语法

复制代码
GRANT 权限列表 ON 对象 TO '用户'@'主机' [WITH GRANT OPTION];

2. 权限类型

常用权限
复制代码
-- 数据操作权限
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'app_user'@'localhost';

-- 所有权限
GRANT ALL PRIVILEGES ON mydb.* TO 'app_user'@'localhost';

-- 创建相关权限
GRANT CREATE, ALTER, DROP, INDEX ON mydb.* TO 'app_user'@'localhost';

-- 数据库管理权限
GRANT CREATE USER, RELOAD, PROCESS ON *.* TO 'admin'@'localhost';
权限对象
对象 语法 说明
全局 *.* 所有数据库的所有表
数据库级 mydb.* 指定数据库的所有表
表级 mydb.users 指定表
列级 mydb.users(name, email) 指定列

3. 示例

复制代码
-- 创建应用用户
CREATE USER 'app'@'localhost' IDENTIFIED BY 'AppPass123!';

-- 授予应用用户对 mydb 的完整操作权限
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON mydb.* TO 'app'@'localhost';

-- 授予只读用户
CREATE USER 'readonly'@'%' IDENTIFIED BY 'ReadOnly123!';
GRANT SELECT ON mydb.* TO 'readonly'@'%';

-- 授予管理员用户全部权限
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'AdminPass123!';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;

-- 授予列级权限
GRANT SELECT(name, email) ON mydb.users TO 'app'@'localhost';

-- 授予存储过程执行权限
GRANT EXECUTE ON PROCEDURE mydb.sp_cleanup TO 'app'@'localhost';

六、查看权限(SHOW GRANTS)

复制代码
-- 查看当前用户权限
SHOW GRANTS;

-- 查看指定用户权限
SHOW GRANTS FOR 'app_user'@'localhost';

-- 查看所有用户的权限(需查询系统表)
SELECT * FROM mysql.user\G;

七、撤销权限(REVOKE)

复制代码
-- 撤销指定权限
REVOKE INSERT, UPDATE ON mydb.* FROM 'app_user'@'localhost';

-- 撤销所有权限
REVOKE ALL PRIVILEGES ON mydb.* FROM 'app_user'@'localhost';

-- 撤销所有全局权限
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'app_user'@'localhost';

八、删除用户

复制代码
-- 删除用户
DROP USER 'app_user'@'localhost';

-- 删除多个用户
DROP USER 'user1'@'localhost', 'user2'@'%';

九、刷新权限

修改权限后,需要刷新权限才能生效:

复制代码
FLUSH PRIVILEGES;

十、主机名(Host)的写法

写法 含义
localhost 只允许本机连接
127.0.0.1 只允许本机连接(通过 IPv4)
% 允许任意主机连接
192.168.1.% 允许 192.168.1.x 网段
192.168.1.100 只允许指定 IP 连接
*.example.com 允许 example.com 域的主机

十一、角色管理(MySQL 8.0+)

角色是权限的集合,可以方便地管理多个用户的权限。

复制代码
-- 创建角色
CREATE ROLE 'app_role', 'readonly_role';

-- 授予角色权限
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'app_role';
GRANT SELECT ON mydb.* TO 'readonly_role';

-- 授予角色给用户
GRANT 'app_role' TO 'app_user'@'localhost';
GRANT 'readonly_role' TO 'readonly_user'@'%';

-- 查看用户拥有的角色
SELECT * FROM mysql.role_edges;
相关推荐
泡海椒2 小时前
JQuick-SQL 与关系型数据库集成:应用层读取后注册查询
数据库·sql
Carol06302 小时前
上肢及肩肘关节
java·服务器·数据库
程序员塔塔喵2 小时前
【MySQL篇|第二篇】慢SQL及其优化手段
sql·mysql·慢sql优化
鸽芷咕2 小时前
数据孤岛怎么拆?金仓KFS数据集成软件从原理到落地
数据库
一世繁华行2 小时前
CAPL浏览器(翻译自官方文档)
运维·服务器·数据库
得助智能-垂类大模型2 小时前
多Agent平台哪家做得好?2026年企业级多智能体平台选型指南
大数据·数据库
为思念酝酿的痛3 小时前
MySQL数据库基础
数据库·mysql
瀚高PG实验室3 小时前
数据库使用psql及jdbc进行远程连接,不定时自动断开的解决办法
数据库·postgresql·瀚高数据库
SelectDB技术团队4 小时前
从实时入库到实时可用:Apache Doris 5.0 增量计算场景与实践
数据库·人工智能·开源·agent·实时数仓·apache doris·增量计算
Wang's Blog4 小时前
Java 项目实战: 交友项目 - 发布圈子动态:数据库表和接口文档介绍
java·数据库·交友