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;
相关推荐
辻弋2012 小时前
一键优化电源计划、游戏模式、独显强制、禁用后台录制——DeltaForceBooster专治三角洲行动卡顿掉帧,所有改动可一键还原
服务器·数据库·windows·游戏·电脑·php
Wang's Blog2 小时前
PostgreSQL笔记51: 基于 pgvector 构建企业级智能问答系统
数据库·笔记·postgresql
我星期八休息3 小时前
Linux—五种IO模型与非阻塞IO
linux·运维·服务器·网络·数据库·网络协议
SQL-First布道者3 小时前
全面解构传统持久层框架,拥抱真正的 SQL-First
java·数据库·spring boot·sql·spring·mybatis·spring jdbc
AIMath~3 小时前
MVCC 与乐观锁,RR的本质
mysql
翼龙云_cloud3 小时前
阿里云国际版代理商:OSS自定义域名绑定与HTTPS配置排障教程
数据库·阿里云·https·云计算
日常筹谋记3 小时前
ATS选不对运维两行泪:数据中心市电与柴发切换场景的双电源自动转换开关选型笔记
运维·数据库·笔记
程序员夏洛3 小时前
MySQL 中的 MVCC 是什么?
数据库·mysql
小蒜学长3 小时前
vue旅游攻略网站(代码+数据库+LW)
java·数据库·vue.js·spring boot·后端·旅游
山甫aa4 小时前
JavaWeb后端开发学习手册
java·开发语言·数据库·学习·mysql·springboot·web