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新特性 如角色管理和增强安全功能
相关推荐
曹牧2 小时前
Oracle:字段为值列表
数据库·oracle
亮子AI2 小时前
【Prisma】如何修复(重建)已经损坏的迁移历史?
数据库·prisma
卡尔特斯2 小时前
Mysql ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded
mysql
+VX:Fegn08952 小时前
计算机毕业设计|基于springboot + vue职位管理推荐系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
热爱专研AI的学妹2 小时前
【搭建工作流教程】使用数眼智能 API 搭建 AI 智能体工作流教程(含可视化流程图)
大数据·数据库·人工智能·python·ai·语言模型·流程图
小韩博2 小时前
小迪第42课:PHP应用&MYSQL架构&SQL注入&跨库查询&文件读写&权限操作
sql·mysql·网络安全·架构·php
DBA小马哥3 小时前
国产数据库加速替代Oracle:聚焦信创背景下的平滑迁移与性能突破
数据库·oracle
漂亮的小碎步丶3 小时前
【7】SQL性能优化实践:EXPLAIN解读+慢查询分析+移动代理商结算案例
数据库·sql性能优化
小股虫3 小时前
从Tair虚拟桶到数据库分库分表:解耦逻辑与物理的架构艺术
数据库·架构·解耦