MySQL :5.7与8.0版创建用户与授权、密码认证插件、角色、密码过期策略

一、版本核心差异速览

在开始实战前,先了解两个版本的关键差异:

特性 MySQL 5.7 MySQL 8.0
创建用户与授权 可一条语句完成 必须分两步执行
密码认证插件 mysql_native_password caching_sha2_password(默认)
用户管理语法 较宽松 更严格规范
密码过期策略 支持但非强制 默认密码永不过期
角色功能 不支持 完整支持角色管理

二、环境准备与连接

bash 复制代码
# 连接到MySQL服务器(两种版本通用)
mysql -u root -p

# 查看MySQL版本
SELECT VERSION();

# 查看当前用户
SELECT USER();

# 查看所有用户
SELECT user, host FROM mysql.user;

三、创建用户:5.7 vs 8.0

MySQL 5.7 创建用户(传统方式)

sql 复制代码
-- 方式1:CREATE USER + GRANT(可合并)
CREATE USER 'dev_user'@'%' IDENTIFIED BY 'MyPass123!';
GRANT ALL PRIVILEGES ON dev_db.* TO 'dev_user'@'%';

-- 方式2:GRANT直接创建(5.7允许)
GRANT ALL PRIVILEGES ON dev_db.* TO 'web_user'@'localhost' 
IDENTIFIED BY 'Web@123456';

-- 创建只读用户
CREATE USER 'readonly_user'@'192.168.1.%' IDENTIFIED BY 'ReadOnly@123';
GRANT SELECT ON production.* TO 'readonly_user'@'192.168.1.%';

-- 创建带限制的用户
CREATE USER 'limited_user'@'localhost' 
IDENTIFIED BY 'Limit@123'
WITH MAX_QUERIES_PER_HOUR 100
MAX_CONNECTIONS_PER_HOUR 10;

MySQL 8.0 创建用户(必须分开执行)

sql 复制代码
-- 步骤1:创建用户(必须单独执行)
CREATE USER 'dev_user'@'%' 
IDENTIFIED BY 'MyPass123!';

-- 步骤2:授权(必须分开执行)
GRANT ALL PRIVILEGES ON dev_db.* TO 'dev_user'@'%';

-- 示例:创建应用用户
CREATE USER 'app_user'@'10.0.%.%' 
IDENTIFIED BY 'App@Secure789';

GRANT SELECT, INSERT, UPDATE, DELETE 
ON app_db.* 
TO 'app_user'@'10.0.%.%';

-- 创建带密码策略的用户
CREATE USER 'secure_user'@'localhost'
IDENTIFIED BY 'Secure!Pass2023'
PASSWORD EXPIRE INTERVAL 90 DAY
FAILED_LOGIN_ATTEMPTS 5
PASSWORD_LOCK_TIME 1;

四、密码设置与认证插件

MySQL 5.7 密码配置

sql 复制代码
-- 设置密码(创建时)
CREATE USER 'user1'@'%' 
IDENTIFIED BY 'Password123!';

-- 修改密码
SET PASSWORD FOR 'user1'@'%' = PASSWORD('NewPass456!');

-- 或使用ALTER USER(5.7.6+)
ALTER USER 'user1'@'%' 
IDENTIFIED BY 'NewPass456!';

-- 使用mysql_native_password插件
CREATE USER 'legacy_user'@'%'
IDENTIFIED WITH mysql_native_password 
BY 'Legacy@Pass123';

MySQL 8.0 密码与认证

sql 复制代码
-- 创建用户(默认使用caching_sha2_password)
CREATE USER 'modern_user'@'%'
IDENTIFIED BY 'Modern@Pass123';

-- 使用传统认证插件(兼容旧应用)
CREATE USER 'compat_user'@'%'
IDENTIFIED WITH mysql_native_password 
BY 'Compat@Pass456';

-- 修改密码(必须使用ALTER USER)
ALTER USER 'modern_user'@'%'
IDENTIFIED BY 'Updated@Pass789';

-- 设置复杂密码策略
CREATE USER 'strict_user'@'localhost'
IDENTIFIED BY 'A1b@C3d$E5f^G7h'
PASSWORD REQUIRE CURRENT;

-- 查看认证插件
SELECT user, host, plugin 
FROM mysql.user 
WHERE user = 'modern_user';

五、授权管理实战

基本权限授予

sql 复制代码
-- 授予数据库所有权限(5.7和8.0通用语法)
GRANT ALL PRIVILEGES ON database_name.* TO 'user'@'host';

-- 授予特定权限
GRANT SELECT, INSERT, UPDATE, DELETE 
ON database_name.table_name 
TO 'user'@'host';

-- 授予存储过程权限
GRANT EXECUTE ON PROCEDURE db_name.procedure_name 
TO 'user'@'host';

-- 授予创建临时表权限
GRANT CREATE TEMPORARY TABLES ON db_name.* 
TO 'user'@'host';

权限级别详解

sql 复制代码
-- 1. 全局权限(所有数据库)
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%';
GRANT CREATE USER, RELOAD, PROCESS ON *.* TO 'sysadmin'@'localhost';

-- 2. 数据库级别权限
GRANT ALL PRIVILEGES ON `production_db`.* TO 'dba'@'10.0.0.%';
GRANT SELECT, INSERT, UPDATE ON `sales_db`.* TO 'sales_user'@'%';

-- 3. 表级别权限
GRANT SELECT, INSERT ON `hr_db`.`employees` TO 'hr_user'@'localhost';
GRANT ALL ON `finance_db`.`transactions` TO 'auditor'@'192.168.1.100';

-- 4. 列级别权限
GRANT SELECT (id, name, email), UPDATE (email) 
ON `users_db`.`profiles` 
TO 'support_user'@'%';

-- 5. 存储过程权限
GRANT EXECUTE ON PROCEDURE `inventory_db`.`restock_product` 
TO 'warehouse_user'@'%';

特殊权限管理

sql 复制代码
-- 授予授予权限的权限(WITH GRANT OPTION)
GRANT ALL PRIVILEGES ON dev_db.* 
TO 'lead_dev'@'%' 
WITH GRANT OPTION;

-- 授予只读权限
GRANT SELECT ON analytics.* 
TO 'report_user'@'%';

-- 授予特定操作的权限
GRANT CREATE, ALTER, DROP, INDEX 
ON test_db.* 
TO 'dev_user'@'localhost';

-- 授予连接权限(最小权限)
GRANT USAGE ON *.* TO 'monitor_user'@'%';

六、MySQL 8.0 角色管理(新特性)

sql 复制代码
-- 创建角色
CREATE ROLE 'read_only_role', 'write_role', 'app_admin';

-- 为角色授权
GRANT SELECT ON company_db.* TO 'read_only_role';
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'write_role';
GRANT ALL PRIVILEGES ON app_db.* TO 'app_admin';

-- 将角色授予用户
GRANT 'read_only_role' TO 'reports_user'@'localhost';
GRANT 'write_role', 'read_only_role' TO 'developer'@'%';

-- 激活角色
SET DEFAULT ROLE ALL TO 'developer'@'%';

-- 或激活特定角色
SET ROLE 'write_role';

-- 查看角色权限
SHOW GRANTS FOR 'read_only_role';

-- 撤销角色
REVOKE 'write_role' FROM 'developer'@'%';

七、查看与撤销权限

查看权限信息

sql 复制代码
-- 查看自己的权限
SHOW GRANTS;

-- 查看其他用户的权限
SHOW GRANTS FOR 'user'@'host';

-- 查看详细权限信息(更详细)
SELECT * FROM mysql.user WHERE user = 'username'\G

-- 查看数据库级别权限
SELECT * FROM mysql.db WHERE user = 'username';

-- 查看表级别权限
SELECT * FROM mysql.tables_priv WHERE user = 'username';

-- 查看列级别权限
SELECT * FROM mysql.columns_priv WHERE user = 'username';

撤销权限

sql 复制代码
-- 撤销所有权限(但用户仍存在)
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user'@'host';

-- 撤销特定权限
REVOKE INSERT, UPDATE ON database.* FROM 'user'@'host';

-- 撤销存储过程权限
REVOKE EXECUTE ON PROCEDURE db.proc FROM 'user'@'host';

-- 撤销角色(8.0)
REVOKE 'role_name' FROM 'user'@'host';

-- 撤销WITH GRANT OPTION
REVOKE GRANT OPTION ON database.* FROM 'user'@'host';

八、用户管理维护

修改用户属性

sql 复制代码
-- 重命名用户(5.7和8.0)
RENAME USER 'old_user'@'host' TO 'new_user'@'host';

-- 修改主机限制
-- 先创建新用户,再删除旧用户
CREATE USER 'user'@'new_host' IDENTIFIED BY 'password';
GRANT /* 复制权限 */;
DROP USER 'user'@'old_host';

-- 锁定/解锁账户(8.0增强)
ALTER USER 'user'@'host' ACCOUNT LOCK;
ALTER USER 'user'@'host' ACCOUNT UNLOCK;

-- 设置密码过期策略
ALTER USER 'user'@'host' PASSWORD EXPIRE INTERVAL 90 DAY;
ALTER USER 'user'@'host' PASSWORD EXPIRE NEVER;

删除用户

sql 复制代码
-- 删除用户(删除前先撤销权限是良好实践)
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user'@'host';
DROP USER 'user'@'host';

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

-- 安全检查:删除前先查看
SELECT * FROM mysql.user WHERE user LIKE '%temp%';

九、安全最佳实践

密码策略配置

sql 复制代码
-- MySQL 8.0 密码策略设置
SET GLOBAL validate_password.policy = MEDIUM;
SET GLOBAL validate_password.length = 12;
SET GLOBAL validate_password.mixed_case_count = 1;
SET GLOBAL validate_password.number_count = 1;
SET GLOBAL validate_password.special_char_count = 1;

-- 创建符合策略的用户
CREATE USER 'secure_user'@'localhost'
IDENTIFIED BY 'Strong@Pass123';

-- 查看密码策略
SHOW VARIABLES LIKE 'validate_password%';

最小权限原则示例

sql 复制代码
-- Web应用用户(最小权限集)
CREATE USER 'webapp'@'app-server-ip'
IDENTIFIED BY 'App@Secure789';

GRANT SELECT, INSERT, UPDATE, DELETE 
ON `webapp_db`.* 
TO 'webapp'@'app-server-ip';

GRANT EXECUTE ON PROCEDURE `webapp_db`.`cleanup_sessions`
TO 'webapp'@'app-server-ip';

-- 监控用户
CREATE USER 'monitor'@'monitor-host'
IDENTIFIED BY 'Monitor@123';

GRANT SELECT, PROCESS, REPLICATION CLIENT 
ON *.* 
TO 'monitor'@'monitor-host';

-- 备份用户
CREATE USER 'backup'@'backup-host'
IDENTIFIED BY 'Backup@Secure456';

GRANT SELECT, RELOAD, LOCK TABLES, REPLICATION CLIENT 
ON *.* 
TO 'backup'@'backup-host';

GRANT SHOW VIEW, EVENT, TRIGGER 
ON *.* 
TO 'backup'@'backup-host';

十、故障排查与常用命令

连接问题排查

sql 复制代码
-- 1. 检查用户是否存在
SELECT user, host FROM mysql.user WHERE user = 'username';

-- 2. 检查用户权限
SHOW GRANTS FOR 'user'@'host';

-- 3. 检查认证插件(8.0常见问题)
SELECT user, host, plugin, authentication_string 
FROM mysql.user 
WHERE user = 'username';

-- 4. 刷新权限(修改后立即生效)
FLUSH PRIVILEGES;

-- 5. 查看连接错误(错误日志)
SHOW VARIABLES LIKE 'log_error';

权限问题调试

sql 复制代码
-- 模拟用户权限查看
SHOW GRANTS FOR CURRENT_USER();

-- 查看有效权限
SELECT * FROM information_schema.user_privileges;

-- 查看数据库权限
SELECT * FROM information_schema.schema_privileges;

-- 查看表权限
SELECT * FROM information_schema.table_privileges;

-- 临时提升权限查看
USE mysql;
SELECT * FROM user WHERE user = 'username'\G

十一、迁移注意事项(5.7 → 8.0)

升级前检查清单

sql 复制代码
-- 1. 检查认证插件
SELECT user, host, plugin 
FROM mysql.user 
WHERE plugin = 'mysql_native_password';

-- 2. 备份用户和权限
-- 使用工具或脚本备份
mysqldump --no-data mysql user db tables_priv columns_priv procs_priv > users_backup.sql

-- 3. 检查GRANT创建用户语句
-- 查找所有GRANT语句中是否包含IDENTIFIED BY

-- 4. 升级后测试
-- 测试每个应用用户的连接和操作

升级后修复步骤

sql 复制代码
-- 如果应用不支持caching_sha2_password
ALTER USER 'application_user'@'%'
IDENTIFIED WITH mysql_native_password 
BY 'YourPasswordHere';

-- 或修改默认认证插件(不推荐)
[mysqld]
default-authentication-plugin=mysql_native_password

十二、快速参考表

命令速查表

操作 MySQL 5.7 MySQL 8.0 说明
创建用户+授权 ✓ 支持 ✗ 不支持 8.0必须分开执行
修改密码 SET PASSWORDALTER USER 只能用 ALTER USER
认证插件 默认native 默认caching_sha2 8.0更安全
角色管理 ✗ 不支持 ✓ 支持 8.0新特性
用户锁定 有限支持 完整支持

常用权限速查

sql 复制代码
-- 开发人员权限集
GRANT SELECT, INSERT, UPDATE, DELETE, 
      CREATE, ALTER, DROP, INDEX, 
      CREATE TEMPORARY TABLES, 
      CREATE VIEW, SHOW VIEW, 
      CREATE ROUTINE, ALTER ROUTINE, 
      EXECUTE
ON `dev_db`.* 
TO 'developer'@'dev-environment';

-- 只读分析用户
GRANT SELECT, SHOW VIEW
ON `reporting_db`.* 
TO 'analyst'@'%';

-- DBA权限(谨慎使用)
GRANT ALL PRIVILEGES ON *.* 
TO 'dba'@'localhost' 
WITH GRANT OPTION;

总结

通过本文的实战指南,你应该能够:

  1. 明确区分 MySQL 5.7 和 8.0 在用户管理上的差异
  2. 熟练创建 符合安全要求的数据库用户
  3. 精准授权 实现最小权限原则
  4. 有效管理 用户生命周期和权限变更
  5. 掌握8.0新特性 如角色管理和增强安全功能
相关推荐
0xDevNull4 小时前
MySQL数据冷热分离详解
后端·mysql
科技小花4 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸4 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain4 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希5 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神5 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员5 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java5 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿5 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴5 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存