**摘要:**本文系统介绍了 MySQL 数据库密码策略的全面管理方法。内容涵盖基础密码修改(SET PASSWORD、ALTER USER、mysqladmin)、密码复杂度策略(validate_password 插件配置与参数详解)、密码过期策略(全局与用户级设置、密码历史)以及高级功能(双密码、随机密码生成、失败锁定)。文章提供了企业级配置示例、批量修改脚本、常见问题解决方案和最佳实践建议,帮助 DBA 和开发者构建安全、合规的数据库密码管理体系。
目录
[1. 引言](#1. 引言)
[2. 基础密码修改方法](#2. 基础密码修改方法)
[2.1 使用 SET PASSWORD 语句](#2.1 使用 SET PASSWORD 语句)
[2.2 使用 ALTER USER 语句(推荐)](#2.2 使用 ALTER USER 语句(推荐))
[2.3 使用 mysqladmin 命令行工具](#2.3 使用 mysqladmin 命令行工具)
[3. 密码复杂度策略配置](#3. 密码复杂度策略配置)
[3.1 安装密码验证插件](#3.1 安装密码验证插件)
[3.2 密码策略参数详解](#3.2 密码策略参数详解)
[3.3 策略级别说明](#3.3 策略级别说明)
[4. 密码过期策略管理](#4. 密码过期策略管理)
[4.1 全局密码过期设置](#4.1 全局密码过期设置)
[4.2 用户级密码过期设置](#4.2 用户级密码过期设置)
[4.3 密码历史策略](#4.3 密码历史策略)
[5. 高级密码管理功能](#5. 高级密码管理功能)
[5.1 双密码支持(MySQL 8.0+)](#5.1 双密码支持(MySQL 8.0+))
[5.2 随机密码生成](#5.2 随机密码生成)
[5.3 密码失败锁定策略](#5.3 密码失败锁定策略)
[6. 实战配置示例](#6. 实战配置示例)
[6.1 企业级密码策略配置](#6.1 企业级密码策略配置)
[6.2 批量修改用户密码](#6.2 批量修改用户密码)
[7. 常见问题与解决方案](#7. 常见问题与解决方案)
[7.1 密码修改失败排查](#7.1 密码修改失败排查)
[7.2 忘记 root 密码的恢复](#7.2 忘记 root 密码的恢复)
[8. 最佳实践建议](#8. 最佳实践建议)
[9. 总结](#9. 总结)
1. 引言
MySQL 数据库的密码策略是保障数据安全的第一道防线。随着安全要求的提升,MySQL 从 5.7 版本开始引入了密码验证插件,并在后续版本中不断增强密码策略功能。本文将系统介绍 MySQL 修改密码策略的多种方法,涵盖基础密码修改、密码复杂度策略、密码过期策略以及密码验证插件配置,帮助 DBA 和开发者构建更安全的数据库环境。
2. 基础密码修改方法
2.1 使用 SET PASSWORD 语句
这是最传统的修改密码方式,适用于所有 MySQL 版本:
sql
-- 修改当前用户密码
SET PASSWORD = PASSWORD('新密码');
-- 修改指定用户密码
SET PASSWORD FOR '用户名'@'主机' = PASSWORD('新密码');
注意: 从 MySQL 8.0 开始,PASSWORD() 函数已被弃用,推荐使用 ALTER USER 语句。
2.2 使用 ALTER USER 语句(推荐)
MySQL 5.7.6+ 和 8.0+ 版本推荐使用此方法:
sql
-- 修改当前用户密码
ALTER USER USER() IDENTIFIED BY '新密码';
-- 修改指定用户密码
ALTER USER '用户名'@'主机' IDENTIFIED BY '新密码';
-- 修改密码并立即过期(强制下次登录修改)
ALTER USER '用户名'@'主机' IDENTIFIED BY '新密码' PASSWORD EXPIRE;
2.3 使用 mysqladmin 命令行工具
在操作系统命令行中修改密码:
bash
mysqladmin -u 用户名 -p旧密码 password 新密码
3. 密码复杂度策略配置
3.1 安装密码验证插件
MySQL 通过 validate_password 插件强制密码复杂度要求:
sql
-- 查看插件是否已安装
SHOW PLUGINS;
-- 安装插件(MySQL 8.0 默认已安装)
INSTALL PLUGIN validate_password SONAME 'validate_password.so'; -- Linux
INSTALL PLUGIN validate_password SONAME 'validate_password.dll'; -- Windows
3.2 密码策略参数详解
安装插件后,可以配置以下策略参数:
sql
-- 查看当前密码策略
SHOW VARIABLES LIKE 'validate_password%';
-- 密码策略级别(0=LOW, 1=MEDIUM, 2=STRONG)
SET GLOBAL validate_password.policy = 1;
-- 密码最小长度(默认8)
SET GLOBAL validate_password.length = 10;
-- 需要的大写字母数
SET GLOBAL validate_password.mixed_case_count = 1;
-- 需要的数字数
SET GLOBAL validate_password.number_count = 1;
-- 需要的特殊字符数
SET GLOBAL validate_password.special_char_count = 1;
3.3 策略级别说明
- LOW (0):只检查密码长度
- MEDIUM (1):检查长度、数字、大小写、特殊字符
- STRONG (2):在 MEDIUM 基础上,增加字典文件检查
4. 密码过期策略管理
4.1 全局密码过期设置
sql
-- 设置全局密码过期时间(天)
SET GLOBAL default_password_lifetime = 90;
-- 永久有效
SET GLOBAL default_password_lifetime = 0;
4.2 用户级密码过期设置
sql
-- 设置用户密码90天后过期
ALTER USER '用户名'@'主机' PASSWORD EXPIRE INTERVAL 90 DAY;
-- 密码永不过期
ALTER USER '用户名'@'主机' PASSWORD EXPIRE NEVER;
-- 立即过期(强制下次登录修改)
ALTER USER '用户名'@'主机' PASSWORD EXPIRE;
4.3 密码历史策略
防止重复使用旧密码:
sql
-- 查看密码历史相关变量
SHOW VARIABLES LIKE 'password_history%';
-- 设置密码历史记录数(默认0,不检查)
SET GLOBAL password_history = 5; -- 禁止使用最近5次用过的密码
-- 设置密码重用间隔天数
SET GLOBAL password_reuse_interval = 365; -- 365天内不能重用密码
5. 高级密码管理功能
5.1 双密码支持(MySQL 8.0+)
支持保留旧密码的同时设置新密码,实现无缝密码轮换:
sql
-- 设置新密码,保留旧密码作为次要密码
ALTER USER '用户名'@'主机'
IDENTIFIED BY '新密码'
RETAIN CURRENT PASSWORD;
-- 丢弃旧密码(完成切换后)
ALTER USER '用户名'@'主机'
DISCARD OLD PASSWORD;
5.2 随机密码生成
sql
-- 为用户生成随机密码
CREATE USER '新用户'@'localhost' IDENTIFIED BY RANDOM PASSWORD;
-- 修改现有用户密码为随机密码
ALTER USER '用户名'@'主机' IDENTIFIED BY RANDOM PASSWORD;
-- 查看生成的随机密码
SHOW CREATE USER '用户名'@'主机';
5.3 密码失败锁定策略
sql
-- 设置连续失败次数阈值
SET GLOBAL connection_control_failed_connections_threshold = 3;
-- 设置失败锁定时间(秒)
SET GLOBAL connection_control_min_connection_delay = 1000;
6. 实战配置示例
6.1 企业级密码策略配置
sql
-- 1. 安装密码验证插件(如未安装)
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
-- 2. 设置密码策略
SET GLOBAL validate_password.policy = 2; -- STRONG级别
SET GLOBAL validate_password.length = 12; -- 最小12位
SET GLOBAL validate_password.mixed_case_count = 2; -- 至少2个大写字母
SET GLOBAL validate_password.number_count = 2; -- 至少2个数字
SET GLOBAL validate_password.special_char_count = 1; -- 至少1个特殊字符
-- 3. 设置密码过期策略
SET GLOBAL default_password_lifetime = 60; -- 60天过期
SET GLOBAL password_history = 10; -- 记录最近10次密码
SET GLOBAL password_reuse_interval = 180; -- 180天内不能重用
-- 4. 应用配置到配置文件(永久生效)
-- 在my.cnf或my.ini中添加:
-- [mysqld]
-- validate_password.policy=2
-- validate_password.length=12
-- default_password_lifetime=60
6.2 批量修改用户密码
sql
-- 生成修改脚本
SELECT CONCAT('ALTER USER \'', user, '\'@\'', host, '\' IDENTIFIED BY \'新密码\';')
FROM mysql.user
WHERE user NOT IN ('root', 'mysql.sys', 'mysql.session');
-- 或使用存储过程批量修改
DELIMITER //
CREATE PROCEDURE batch_change_password()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE user_host VARCHAR(255);
DECLARE cur CURSOR FOR SELECT CONCAT(user, '@', host) FROM mysql.user WHERE user NOT LIKE 'mysql.%';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
FETCH cur INTO user_host;
IF done THEN
LEAVE read_loop;
END IF;
SET @sql = CONCAT('ALTER USER ', user_host, ' IDENTIFIED BY ''新密码''');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP;
CLOSE cur;
END //
DELIMITER ;
7. 常见问题与解决方案
7.1 密码修改失败排查
- 错误: "Your password does not satisfy the current policy requirements"
- 原因: 密码不符合复杂度要求
- 解决: 查看
validate_password%变量,调整密码或降低策略级别
- 错误: "Access denied for user"
- 原因: 无权限修改密码
- 解决: 使用 root 用户或具有 CREATE USER 权限的用户操作
7.2 忘记 root 密码的恢复
- 停止 MySQL 服务
- 使用
--skip-grant-tables参数启动 MySQL - 无密码登录并修改 root 密码
- 刷新权限并重启服务
8. 最佳实践建议
- 分级管理: 根据用户角色设置不同的密码策略
- 定期轮换: 关键账户密码每 30-90 天更换一次
- 复杂度要求: 至少 12 位,包含大小写字母、数字和特殊字符
- 监控审计: 定期检查密码策略合规性
- 备份恢复: 修改重要账户密码前做好备份
9. 总结
MySQL 提供了完善的密码策略管理机制,从基础密码修改到高级安全策略,能够满足不同安全级别的需求。合理配置密码复杂度、过期时间和历史记录策略,结合双密码、随机密码等新特性,可以显著提升数据库的安全性。建议根据实际业务需求和安全规范,制定并实施适当的密码管理策略。