MySQL用户:连接MySQL服务器的账户,存储在mysql.user表中。
东巴文理解:
用户 = 门禁卡
不同门禁卡有不同权限
有的卡只能进大门
有的卡能进所有房间
用户权限决定能做什么操作
用户标识:用户名@主机名
示例:
语法格式:
CREATE USER [IF NOT EXISTS] '用户名'@'主机名'
IDENTIFIED BY '密码'
[PASSWORD EXPIRE {DEFAULT|NEVER|INTERVAL 数字 DAY|AT TIMESTAMP}]
[ACCOUNT {LOCK|UNLOCK}];
参数说明:
示例:
-- 创建本地用户
CREATE USER 'user1'@'localhost' IDENTIFIED BY 'password123';
-- 创建远程用户
CREATE USER 'user2'@'%' IDENTIFIED BY 'password123';
-- 创建特定网段用户
CREATE USER 'user3'@'192.168.1.%' IDENTIFIED BY 'password123';
-- 创建带密码过期策略的用户
CREATE USER 'user4'@'localhost'
IDENTIFIED BY 'password123'
PASSWORD EXPIRE INTERVAL 90 DAY;
-- 创建锁定用户
CREATE USER 'user5'@'localhost'
IDENTIFIED BY 'password123'
ACCOUNT LOCK;
语法格式:
ALTER USER '用户名'@'主机名' IDENTIFIED BY '新密码';
示例:
-- 修改用户密码
ALTER USER 'user1'@'localhost' IDENTIFIED BY 'newpassword123';
-- 修改当前用户密码
ALTER USER USER() IDENTIFIED BY 'newpassword123';
示例:
-- 锁定用户
ALTER USER 'user1'@'localhost' ACCOUNT LOCK;
-- 解锁用户
ALTER USER 'user1'@'localhost' ACCOUNT UNLOCK;
-- 设置密码过期
ALTER USER 'user1'@'localhost' PASSWORD EXPIRE;
-- 设置密码永不过期
ALTER USER 'user1'@'localhost' PASSWORD EXPIRE NEVER;
语法格式:
RENAME USER '旧用户名'@'旧主机名' TO '新用户名'@'新主机名';
示例:
-- 重命名用户
RENAME USER 'user1'@'localhost' TO 'newuser1'@'localhost';
语法格式:
DROP USER [IF EXISTS] '用户名'@'主机名' [, '用户名2'@'主机名2', ...];
示例:
-- 删除单个用户
DROP USER IF EXISTS 'user1'@'localhost';
-- 删除多个用户
DROP USER IF EXISTS 'user2'@'%', 'user3'@'192.168.1.%';
-- 查看所有用户
SELECT User, Host FROM mysql.user;
-- 查看当前用户
SELECT USER(), CURRENT_USER();
-- 查看用户详细信息
SELECT * FROM mysql.user WHERE User = 'user1';
-- 查看用户权限
SHOW GRANTS FOR 'user1'@'localhost';
数据操作权限:
| 权限 | 说明 |
|---|---|
| SELECT | 查询数据 |
| INSERT | 插入数据 |
| UPDATE | 更新数据 |
| DELETE | 删除数据 |
| CREATE | 创建数据库/表 |
| DROP | 删除数据库/表 |
| ALTER | 修改表结构 |
| INDEX | 创建/删除索引 |
管理权限:
| 权限 | 说明 |
|---|---|
| ALL | 所有权限 |
| GRANT OPTION | 授权权限 |
| SUPER | 超级权限 |
| PROCESS | 查看进程 |
| RELOAD | 重载权限 |
| SHUTDOWN | 关闭服务器 |
| FILE | 文件读写 |
作用范围:整个MySQL服务器
语法格式:
GRANT 权限列表 ON *.* TO '用户名'@'主机名';
示例:
-- 授予全局查询权限
GRANT SELECT ON *.* TO 'user1'@'localhost';
-- 授予全局所有权限
GRANT ALL ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;
作用范围:指定数据库
语法格式:
GRANT 权限列表 ON 数据库名.* TO '用户名'@'主机名';
示例:
-- 授予数据库所有权限
GRANT ALL ON mydb.* TO 'user1'@'localhost';
-- 授予数据库查询和插入权限
GRANT SELECT, INSERT ON mydb.* TO 'user2'@'localhost';
作用范围:指定表
语法格式:
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
示例:
-- 授予表查询权限
GRANT SELECT ON mydb.users TO 'user1'@'localhost';
-- 授予表所有权限
GRANT ALL ON mydb.orders TO 'user2'@'localhost';
作用范围:指定列
语法格式:
GRANT 权限(列名列表) ON 数据库名.表名 TO '用户名'@'主机名';
示例:
-- 授予列查询权限
GRANT SELECT(id, name) ON mydb.users TO 'user1'@'localhost';
-- 授予列更新权限
GRANT UPDATE(salary) ON mydb.employees TO 'user2'@'localhost';
语法格式:
GRANT 权限列表
ON 权限级别
TO '用户名'@'主机名'
[WITH GRANT OPTION]
[WITH {MAX_QUERIES_PER_HOUR 数量|MAX_UPDATES_PER_HOUR 数量|...}];
参数说明:
示例:
-- 授予查询权限
GRANT SELECT ON mydb.* TO 'user1'@'localhost';
-- 授予多个权限
GRANT SELECT, INSERT, UPDATE ON mydb.* TO 'user2'@'localhost';
-- 授予所有权限
GRANT ALL ON mydb.* TO 'admin'@'localhost' WITH GRANT OPTION;
-- 授予权限并限制资源
GRANT SELECT ON mydb.* TO 'user3'@'localhost'
WITH MAX_QUERIES_PER_HOUR 1000
MAX_UPDATES_PER_HOUR 500
MAX_CONNECTIONS_PER_HOUR 100;
语法格式:
REVOKE 权限列表 ON 权限级别 FROM '用户名'@'主机名';
REVOKE ALL ON 权限级别 FROM '用户名'@'主机名';
REVOKE ALL PRIVILEGES, GRANT OPTION FROM '用户名'@'主机名';
示例:
-- 撤销查询权限
REVOKE SELECT ON mydb.* FROM 'user1'@'localhost';
-- 撤销多个权限
REVOKE SELECT, INSERT ON mydb.* FROM 'user2'@'localhost';
-- 撤销所有权限
REVOKE ALL ON mydb.* FROM 'admin'@'localhost';
-- 撤销所有权限和授权权限
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'admin'@'localhost';
-- 查看用户权限
SHOW GRANTS FOR 'user1'@'localhost';
-- 查看当前用户权限
SHOW GRANTS;
-- 查看当前用户详细权限
SHOW GRANTS FOR CURRENT_USER();
-- 查看全局权限
SELECT * FROM mysql.user WHERE User = 'user1';
-- 查看数据库权限
SELECT * FROM mysql.db WHERE User = 'user1';
-- 查看表权限
SELECT * FROM mysql.tables_priv WHERE User = 'user1';
-- 查看列权限
SELECT * FROM mysql.columns_priv WHERE User = 'user1';
角色:权限的集合,可以授予用户。
东巴文理解:
角色 = 职位
职位对应一系列权限
给员工分配职位
就自动拥有职位的权限
角色简化权限管理
语法格式:
CREATE ROLE [IF NOT EXISTS] '角色名'@'主机名' [, '角色名2'@'主机名2', ...];
示例:
-- 创建角色
CREATE ROLE 'app_read'@'localhost';
CREATE ROLE 'app_write'@'localhost';
CREATE ROLE 'app_admin'@'localhost';
-- 创建多个角色
CREATE ROLE 'role1'@'localhost', 'role2'@'localhost';
示例:
-- 给角色授予数据库查询权限
GRANT SELECT ON mydb.* TO 'app_read'@'localhost';
-- 给角色授予数据库写入权限
GRANT INSERT, UPDATE, DELETE ON mydb.* TO 'app_write'@'localhost';
-- 给角色授予所有权限
GRANT ALL ON mydb.* TO 'app_admin'@'localhost';
语法格式:
GRANT '角色名'@'主机名' TO '用户名'@'主机名';
示例:
-- 给用户授予角色
GRANT 'app_read'@'localhost' TO 'user1'@'localhost';
GRANT 'app_write'@'localhost' TO 'user2'@'localhost';
GRANT 'app_admin'@'localhost' TO 'admin'@'localhost';
语法格式:
SET ROLE '角色名'@'主机名';
SET ROLE ALL;
SET ROLE NONE;
示例:
-- 激活指定角色
SET ROLE 'app_read'@'localhost';
-- 激活所有角色
SET ROLE ALL;
-- 取消所有角色
SET ROLE NONE;
设置自动激活:
-- 设置登录时自动激活所有角色
SET GLOBAL activate_all_roles_on_login = ON;
-- 查看所有角色
SELECT User, Host FROM mysql.user WHERE Account_locked = 'Y';
-- 查看角色权限
SHOW GRANTS FOR 'app_read'@'localhost';
-- 查看当前激活的角色
SELECT CURRENT_ROLE();
语法格式:
REVOKE '角色名'@'主机名' FROM '用户名'@'主机名';
示例:
-- 撤销用户角色
REVOKE 'app_read'@'localhost' FROM 'user1'@'localhost';
示例:
-- 撤销角色权限
REVOKE SELECT ON mydb.* FROM 'app_read'@'localhost';
语法格式:
DROP ROLE [IF EXISTS] '角色名'@'主机名' [, '角色名2'@'主机名2', ...];
示例:
-- 删除角色
DROP ROLE IF EXISTS 'app_read'@'localhost';
-- 删除多个角色
DROP ROLE IF EXISTS 'app_write'@'localhost', 'app_admin'@'localhost';
-- 查看密码策略变量
SHOW VARIABLES LIKE 'validate_password%';
| 变量名 | 说明 |
|---|---|
| validate_password_length | 密码最小长度 |
| validate_password_mixed_case_count | 大小写字母数量 |
| validate_password_number_count | 数字数量 |
| validate_password_special_char_count | 特殊字符数量 |
| validate_password_policy | 密码策略级别 |
示例:
-- 设置密码最小长度
SET GLOBAL validate_password_length = 8;
-- 设置密码策略级别
SET GLOBAL validate_password_policy = MEDIUM;
示例:
-- 设置密码立即过期
ALTER USER 'user1'@'localhost' PASSWORD EXPIRE;
-- 设置密码90天后过期
ALTER USER 'user1'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
-- 设置密码永不过期
ALTER USER 'user1'@'localhost' PASSWORD EXPIRE NEVER;
-- 查看用户密码过期状态
SELECT User, Host, password_expired, password_last_changed, password_lifetime
FROM mysql.user
WHERE User = 'user1';
示例:
-- 重置用户密码
ALTER USER 'user1'@'localhost' IDENTIFIED BY 'newpassword123';
-- 重置密码并设置过期
ALTER USER 'user1'@'localhost'
IDENTIFIED BY 'newpassword123'
PASSWORD EXPIRE;
示例:
-- 用户修改自己的密码
ALTER USER USER() IDENTIFIED BY 'newpassword123';
-- 使用SET PASSWORD
SET PASSWORD = PASSWORD('newpassword123');
不推荐:
-- 授予所有权限
GRANT ALL ON *.* TO 'app_user'@'localhost';
推荐:
-- 只授予必要权限
GRANT SELECT, INSERT, UPDATE ON mydb.* TO 'app_user'@'localhost';
不推荐:
-- 允许任意主机访问
CREATE USER 'app_user'@'%' IDENTIFIED BY 'password';
推荐:
-- 只允许特定主机访问
CREATE USER 'app_user'@'192.168.1.100' IDENTIFIED BY 'password';
示例:
-- 设置强密码策略
SET GLOBAL validate_password_length = 12;
SET GLOBAL validate_password_mixed_case_count = 2;
SET GLOBAL validate_password_number_count = 2;
SET GLOBAL validate_password_special_char_count = 2;
SET GLOBAL validate_password_policy = STRONG;
示例:
-- 设置密码90天过期
CREATE USER 'user1'@'localhost'
IDENTIFIED BY 'password123'
PASSWORD EXPIRE INTERVAL 90 DAY;
示例:
-- 锁定账户
ALTER USER 'inactive_user'@'localhost' ACCOUNT LOCK;
-- 解锁账户
ALTER USER 'inactive_user'@'localhost' ACCOUNT UNLOCK;
MySQL 8.0+支持失败登录锁定:
-- 创建用户时设置失败登录锁定
CREATE USER 'user1'@'localhost'
IDENTIFIED BY 'password123'
FAILED_LOGIN_ATTEMPTS 3
PASSWORD_LOCK_TIME 1;
配置文件:
[mysqld]
plugin-load = audit_log.so
audit_log_format = JSON
audit_log_policy = ALL
-- 查看审计日志状态
SHOW VARIABLES LIKE 'audit_log%';
-- 查看审计日志文件
SHOW VARIABLES LIKE 'audit_log_file';
-- 创建应用数据库
CREATE DATABASE app_db;
-- 创建只读用户
CREATE USER 'app_read'@'192.168.1.%' IDENTIFIED BY 'Read@123456';
GRANT SELECT ON app_db.* TO 'app_read'@'192.168.1.%';
-- 创建读写用户
CREATE USER 'app_write'@'192.168.1.%' IDENTIFIED BY 'Write@123456';
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_write'@'192.168.1.%';
-- 创建管理员用户
CREATE USER 'app_admin'@'192.168.1.%' IDENTIFIED BY 'Admin@123456';
GRANT ALL ON app_db.* TO 'app_admin'@'192.168.1.%';
-- 刷新权限
FLUSH PRIVILEGES;
-- 创建开发角色
CREATE ROLE 'dev_read'@'localhost', 'dev_write'@'localhost', 'dev_admin'@'localhost';
-- 给角色授权
GRANT SELECT ON dev_db.* TO 'dev_read'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON dev_db.* TO 'dev_write'@'localhost';
GRANT ALL ON dev_db.* TO 'dev_admin'@'localhost';
-- 创建开发用户
CREATE USER 'dev1'@'localhost' IDENTIFIED BY 'Dev@123456';
CREATE USER 'dev2'@'localhost' IDENTIFIED BY 'Dev@123456';
-- 给用户授予角色
GRANT 'dev_read'@'localhost' TO 'dev1'@'localhost';
GRANT 'dev_write'@'localhost' TO 'dev2'@'localhost';
-- 设置自动激活角色
SET GLOBAL activate_all_roles_on_login = ON;
-- 创建报表用户
CREATE USER 'report_user'@'%' IDENTIFIED BY 'Report@123456';
-- 授予查询权限
GRANT SELECT ON production_db.* TO 'report_user'@'%';
-- 限制查询次数
GRANT SELECT ON production_db.* TO 'report_user'@'%'
WITH MAX_QUERIES_PER_HOUR 1000
MAX_CONNECTIONS_PER_HOUR 50;
-- 设置密码过期
ALTER USER 'report_user'@'%' PASSWORD EXPIRE INTERVAL 180 DAY;
-- 刷新权限
FLUSH PRIVILEGES;
✅ 用户管理包括创建、修改、删除用户 ✅ 权限系统支持全局、数据库、表、列级别 ✅ GRANT授权,REVOKE撤销权限 ✅ 角色简化权限管理 ✅ 密码策略确保安全 ✅ 遵循最小权限原则
完成本章学习后,请确认您能够: