MySQL 修改用户密码

MySQL 修改用户密码

MySQL 提供了多种修改用户密码的方法,以下是详细的解决方案和最佳实践。

一 基础密码修改方法

1.1 使用 SET PASSWORD 语句

sql 复制代码
-- 修改当前用户密码
SET PASSWORD = PASSWORD('new_password');

-- 修改指定用户密码(需要权限)
SET PASSWORD FOR 'username'@'host' = PASSWORD('new_password');

1.2 使用 ALTER USER 语句(MySQL 5.7.6+推荐)

sql 复制代码
-- MySQL 5.7.6+ 标准语法
ALTER USER 'username'@'host' IDENTIFIED BY 'new_password';

-- 设置密码过期(强制下次登录修改)
ALTER USER 'username'@'host' IDENTIFIED BY 'new_password' PASSWORD EXPIRE;

1.3 使用 UPDATE 直接修改 mysql.user 表(不推荐)

sql 复制代码
-- 需要FLUSH PRIVILEGES刷新权限
UPDATE mysql.user SET authentication_string = PASSWORD('new_password') 
WHERE User = 'username' AND Host = 'host';
FLUSH PRIVILEGES;

二 不同MySQL版本的注意事项

MySQL版本 推荐方法 密码存储字段 特殊说明
5.6.x SET PASSWORD password 使用mysql_native_password插件
5.7.6+ ALTER USER authentication_string 默认使用caching_sha2_password插件
8.0+ ALTER USER authentication_string 默认强密码策略

三 高级密码管理

3.1 密码策略配置

sql 复制代码
-- 查看密码策略
SHOW VARIABLES LIKE 'validate_password%';

-- 设置密码复杂度要求(MySQL 8.0+)
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.2 密码过期设置

sql 复制代码
-- 设置90天过期
ALTER USER 'username'@'host' PASSWORD EXPIRE INTERVAL 90 DAY;

-- 查看过期信息
SELECT user, host, password_last_changed, 
       password_lifetime FROM mysql.user;

四 忘记root密码的解决方案

4.1 Linux系统重置步骤

bash 复制代码
# 停止MySQL服务
sudo systemctl stop mysql

# 安全模式启动(跳过权限检查)
sudo mysqld_safe --skip-grant-tables &

# 连接MySQL并修改密码
mysql -u root
UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User = 'root';
FLUSH PRIVILEGES;
exit;

# 重启正常服务
sudo systemctl restart mysql

4.2 Windows系统重置步骤

cmd 复制代码
:: 停止MySQL服务
net stop MySQL

:: 启动跳过权限检查
mysqld --skip-grant-tables

:: 新窗口连接并修改密码
mysql -u root
UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User = 'root';
FLUSH PRIVILEGES;
exit;

:: 重启服务
net start MySQL

五 安全最佳实践

  1. 密码复杂度要求

    • 至少12个字符
    • 包含大小写字母、数字和特殊字符
    • 避免使用字典单词
  2. 定期轮换策略

    sql 复制代码
    -- 设置所有用户每90天修改密码
    ALTER USER '%'@'%' PASSWORD EXPIRE INTERVAL 90 DAY;
  3. 审计跟踪

    sql 复制代码
    -- 创建密码修改审计表
    CREATE TABLE password_changes (
        id INT AUTO_INCREMENT PRIMARY KEY,
        username VARCHAR(50) NOT NULL,
        changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        changed_by VARCHAR(50)
    );
    
    -- 创建触发器记录密码修改
    DELIMITER //
    CREATE TRIGGER after_password_change
    AFTER UPDATE ON mysql.user
    FOR EACH ROW
    BEGIN
        IF NEW.authentication_string <> OLD.authentication_string THEN
            INSERT INTO password_changes (username, changed_by)
            VALUES (NEW.User, CURRENT_USER());
        END IF;
    END //
    DELIMITER ;

六 常见问题解决

  1. 密码修改后无法登录

    sql 复制代码
    -- 检查插件类型是否匹配
    SELECT user, host, plugin FROM mysql.user;
    
    -- 修改插件类型(如需要)
    ALTER USER 'username'@'host' 
    IDENTIFIED WITH mysql_native_password BY 'password';
  2. ERROR 1819 (HY000)密码不符合策略

    sql 复制代码
    -- 临时降低策略要求
    SET GLOBAL validate_password.policy = LOW;
    -- 或者创建更复杂密码
  3. 远程用户密码修改后仍使用旧密码

    sql 复制代码
    -- 确保刷新了权限
    FLUSH PRIVILEGES;
    -- 检查是否有多个同名账户
    SELECT user, host FROM mysql.user WHERE user = 'username';

通过以上方法,可以安全有效地管理MySQL用户密码。对于生产环境,建议:

  1. 使用ALTER USER语法(MySQL 5.7.6+)
  2. 启用密码过期策略
  3. 定期审计密码变更记录
  4. 避免使用简单密码

谨记:心存敬畏,行有所止。

相关推荐
TDengine (老段)4 分钟前
TDengine 时间函数 TODAY() 用户手册
大数据·数据库·物联网·oracle·时序数据库·tdengine·涛思数据
码界奇点14 分钟前
KingbaseES一体化架构与多层防护体系如何保障企业级数据库的持续稳定与弹性扩展
数据库·架构·可用性测试
悟乙己36 分钟前
数据科学家如何更好地展示自己的能力
大数据·数据库·数据科学家
皆过客,揽星河1 小时前
mysql进阶语法(视图)
数据库·sql·mysql·mysql基础语法·mysql进阶语法·视图创建修改删除
盟接之桥1 小时前
盟接之桥说制造:在安全、确定与及时之间,构建品质、交期与反应速度的动态平衡
大数据·运维·安全·汽车·制造·devops
tuokuac2 小时前
Redis 的相关文件作用
数据库·redis·缓存
dbdr09012 小时前
Linux 入门到精通,真的不用背命令!零基础小白靠「场景化学习法」,3 个月拿下运维 offer,第二十六天
linux·运维·服务器·网络·python·学习
鹧鸪云光伏与储能软件开发3 小时前
投资储能项目能赚多少钱?小程序帮你测算
运维·数据库·小程序·光伏·光伏设计软件·光伏设计
群联云防护小杜3 小时前
服务器异常磁盘写排查手册 · 已删除文件句柄篇
运维·服务器·nginx·开源·lua
云的牧人3 小时前
Ubuntu 22 redis集群搭建
linux·运维·ubuntu