
一、版本核心差异速览
在开始实战前,先了解两个版本的关键差异:
| 特性 | 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 PASSWORD 或 ALTER 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;
总结
通过本文的实战指南,你应该能够:
- 明确区分 MySQL 5.7 和 8.0 在用户管理上的差异
- 熟练创建 符合安全要求的数据库用户
- 精准授权 实现最小权限原则
- 有效管理 用户生命周期和权限变更
- 掌握8.0新特性 如角色管理和增强安全功能