news 2026/8/6 17:14:46

MySQL密码管理实战:四种修改方式详解与运维安全指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL密码管理实战:四种修改方式详解与运维安全指南

1. 项目概述:为什么MySQL密码管理是运维基本功

在Linux服务器上,MySQL数据库几乎是所有Web应用、数据分析平台和后台服务的核心组件。作为运维或开发人员,我们每天都要和它打交道。而数据库安全的第一道防线,就是访问密码。无论是新环境初始化、同事离职交接、定期安全加固,还是自己不小心忘记了密码,修改MySQL用户密码都是一项必须熟练掌握的基础操作。

很多人觉得改密码不就是一条SET PASSWORD命令吗?但实际操作中,你会遇到各种场景:root密码忘了怎么办?命令行下怎么安全地输入新密码?如何批量修改多个用户的密码?不同版本的MySQL(比如5.7和8.0)命令有差异吗?这些问题,如果没有系统的梳理和实操经验,很容易踩坑,轻则浪费时间,重则可能导致数据库服务中断或安全风险。

今天,我就结合自己多年在运维一线的经验,为你彻底拆解Linux环境下修改MySQL密码的四种核心方式。这不仅仅是四条命令的罗列,我会深入每种方法背后的原理、适用场景、隐藏的细节以及我踩过的那些“坑”,让你在任何情况下都能从容应对。无论你是刚入行的新人,还是需要查漏补缺的老手,这篇内容都能给你带来直接的帮助。

2. 四种密码修改方式的核心思路与选型考量

面对修改密码这个需求,为什么会有多种方法?这背后其实是不同场景下的权限状态、可用工具和安全策略共同决定的。我们不能只会一种,必须根据手头的“牌”来出招。

2.1 场景化需求解析:你的起点决定了路径

在动手之前,你必须先明确自己处于哪种状态。这直接决定了你能采用哪种方法。

场景一:已知当前密码,进行常规修改或安全轮换。这是最理想、最安全的情况。你拥有某个数据库用户(比如root或一个应用账号)的当前有效密码,可以正常登录到MySQL命令行客户端。你的目标可能是执行公司安全策略要求的定期密码更换。此时,你拥有完整的SQL命令执行权限,所有在MySQL内部修改密码的SQL语句都可用。我们的**方式一(使用SET PASSWORD语句)方式二(使用ALTER USER语句)**就是为此而生。它们是在线、联机操作,无需重启服务,对业务影响最小。

场景二:忘记了root密码,需要“救火”。这是最令人头疼但也很常见的场景。你可能接手了一台老服务器,文档不全;或者自己设置的复杂密码太久没用,忘记了。此时,你无法通过常规身份验证进入MySQL。解决办法就是让MySQL“跳过”权限验证表启动,这样你就能以无密码方式登录,然后重设密码。这就是**方式三(使用--skip-grant-tables模式)**的核心思路。这是一种“外科手术式”的修复方法,需要重启MySQL服务进程,并在一段时间内让数据库处于一个不验证密码的特殊状态,因此操作必须快、准、稳,并在完成后立即恢复安全状态。

场景三:需要在Shell脚本中自动化修改,或从外部管理。在自动化运维、CI/CD流水线或使用Ansible/Puppet等配置管理工具时,我们经常需要在非交互式环境下修改密码。你不能手动输入密码,需要一条能直接执行的命令。mysqladmin这个MySQL官方命令行管理工具就派上了用场,它可以直接在操作系统Shell层面完成密码修改,这就是方式四(使用mysqladmin工具)。它本质上是封装了SQL命令,但提供了更脚本友好的接口。

2.2 版本差异:MySQL 5.7 vs 8.0 的关键变化

这是很多老手都会忽略却至关重要的点。MySQL在5.7和8.0版本之间,对用户认证和密码管理进行了重大升级。

  • MySQL 5.7及以前:默认使用mysql_native_password插件,密码加密方式相对简单。修改密码的SQL语句也较多,SET PASSWORDALTER USER都能用。
  • MySQL 8.0及以后默认认证插件改为caching_sha2_password。这个插件更安全,但一些老的客户端驱动可能不支持。更重要的是,在MySQL 8.0中,SET PASSWORD语句被标记为过时(Deprecated)。官方明确推荐使用ALTER USER语句来管理用户和密码。如果你在8.0的环境里还习惯性地用SET PASSWORD,可能会收到一个警告,虽然目前还能用,但指不定哪个小版本更新后就彻底移除了。

注意:如果你管理的生产环境是MySQL 8.0,请务必优先使用ALTER USER语法。这不仅是为了兼容未来,其语法也更标准化、功能更强大(比如直接指定认证插件)。

2.3 安全第一:密码策略与操作红线

无论用哪种方式,安全原则必须贯穿始终。

  1. 密码复杂度:不要设置如123456root这样的弱密码。MySQL本身支持密码复杂度策略插件(如validate_password),建议启用。
  2. 命令行历史:在Shell中直接使用-p参数后接明文密码(如-pMyPass123)是极度危险的!因为其他用户可以通过history命令看到你的完整命令,密码就泄露了。安全的做法是只用-p,然后回车,在提示符下输入密码(输入过程不可见)。
  3. --skip-grant-tables模式的危险性:该方法会让任何用户无需密码即可连接数据库,拥有全部权限。操作期间,务必确保MySQL服务只监听在本地(127.0.0.1),并且操作过程要迅速,完成后立即重启到正常模式。绝对禁止在生产环境长时间保持此模式。
  4. 权限最小化:不要动不动就用root。为应用创建专属的、权限受限的数据库用户。修改这些用户的密码时,你同样可以用这些方法,只是需要先用root或其他有足够权限的用户登录。

3. 方式一详解:使用 SET PASSWORD 语句(经典但渐退)

这是最传统、最经典的修改密码方式,在MySQL 5.7及以前版本中被广泛使用。它的语法直观,直接对“密码”这个属性进行操作。

3.1 语法拆解与参数说明

基本语法如下:

SET PASSWORD [FOR user] = password_option;

我们来拆解每个部分:

  • SET PASSWORD: 固定关键字,声明要执行设置密码的操作。
  • [FOR user]: 可选部分。如果不指定FOR user,那么修改的就是当前登录用户自己的密码。如果指定,则是修改指定用户的密码,当然,当前登录的用户必须有修改其他用户密码的权限(通常是root或具有UPDATE权限的用户)。
    • user的格式是'username'@'hostname'。例如'app_user'@'192.168.1.%''root'@'localhost'。主机名部分很重要,它决定了用户从哪个网络地址连接进来。'root'@'localhost''root'@'%'在MySQL看来是两个不同的用户账户。
  • = password_option: 这是设置密码的核心。在旧版本中,可以直接用PASSWORD('明文密码')函数,但这个函数在MySQL 5.7.6之后被移除了。现在标准且安全的做法是直接使用一个字符串字面量,或者用auth_plugin指定的哈希值。

最常用的标准写法是:

SET PASSWORD FOR 'username'@'hostname' = '明文新密码';

或者,修改当前用户自己的密码:

SET PASSWORD = '明文新密码';

MySQL服务端收到这个命令后,会根据当前默认的认证插件(如caching_sha2_password)自动对新密码进行哈希加密,然后将哈希值存储到mysql.user系统表中。你不需要,也不应该手动计算哈希值。

3.2 完整实操步骤演示

假设我们以root用户登录,需要将用户'reporter'@'%'的密码改为SecurePass2024!

  1. 登录MySQL

    mysql -u root -p

    回车后,在提示符下输入root用户的当前密码。

  2. 执行修改命令

    SET PASSWORD FOR 'reporter'@'%' = 'SecurePass2024!';

    如果命令成功,你会看到提示:

    Query OK, 0 rows affected (0.01 sec)
  3. 立即验证(非常重要): 不要关闭当前root会话。新开一个终端窗口,尝试用新密码登录:

    mysql -u reporter -pSecurePass2024!

    或者更安全地:

    mysql -u reporter -p

    然后输入SecurePass2024!。如果能成功登录,说明修改生效。

3.3 注意事项与避坑指南

  • MySQL 8.0的过时警告:在MySQL 8.0中执行SET PASSWORD,你会看到类似这样的警告:
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    使用SHOW WARNINGS;查看,会提示'SET PASSWORD' is deprecated and will be removed in a future release.。这意味着在未来版本中它可能失效。对于新项目或MySQL 8.0环境,请避免使用此方法,转向ALTER USER
  • 密码中的特殊字符:如果新密码包含单引号'、反斜杠\等特殊字符,需要在SQL语句中进行转义,否则会导致语法错误。例如,密码为O'Reilly@123,需要写成:
    SET PASSWORD FOR 'user'@'%' = 'O\'Reilly@123';
    这增加了复杂性,容易出错。这也是推荐使用ALTER USER的一个小原因,其语法处理起来更一致。
  • 修改后权限刷新SET PASSWORD执行后,修改会立即生效,并自动刷新权限,无需再执行FLUSH PRIVILEGES;。这是一个常见的误解点,很多老教程会多此一举。

4. 方式二详解:使用 ALTER USER 语句(现代首选)

这是目前MySQL官方最推荐的方式,语法更加强大、标准,也是未来发展的方向。它不仅能修改密码,还能修改用户的认证插件、密码过期策略等属性。

4.1 语法深度解析与功能扩展

基础语法是修改密码的核心:

ALTER USER [IF EXISTS] user IDENTIFIED BY '明文新密码';
  • ALTER USER: 声明要修改用户属性。
  • [IF EXISTS]: 可选项。如果指定,当要修改的用户不存在时,语句会生成一个警告而非错误。这在自动化脚本中很有用,可以避免因用户不存在而导致脚本中断。
  • user: 格式同样是'username'@'hostname'
  • IDENTIFIED BY: 关键字,指定通过后面的明文密码来进行身份验证。
  • '明文新密码': 用户的新密码。

它的强大之处在于扩展语法

ALTER USER 'username'@'hostname' IDENTIFIED WITH caching_sha2_password BY '明文新密码' PASSWORD EXPIRE INTERVAL 90 DAY FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 1;

这条命令一次性完成了:

  1. 将用户认证插件改为caching_sha2_password
  2. 设置新密码。
  3. 设置密码90天后过期。
  4. 设置账户锁定策略:连续3次登录失败后锁定1天。

4.2 分步骤实操:从基础到高级

场景1:修改当前登录用户自己的密码。

-- 使用root登录后,想修改root自己的密码 ALTER USER USER() IDENTIFIED BY 'MyNewRootPass456!';

这里USER()是一个函数,返回当前登录的用户名和主机名,非常方便。

场景2:管理员修改其他用户的密码。

-- 修改用户 'webapp'@'localhost' 的密码 ALTER USER 'webapp'@'localhost' IDENTIFIED BY 'StrongAppPass789!';

场景3:升级用户认证插件并修改密码(MySQL 8.0迁移常见操作)。有些从5.7升级到8.0的应用,连接可能会因为认证插件问题失败。可以这样修复:

ALTER USER 'legacy_app'@'%' IDENTIFIED WITH mysql_native_password BY 'NewPassForOldPlugin';

这样就将该用户的认证插件改回了旧的mysql_native_password,同时设置了新密码。注意:这只是临时兼容方案,长远应推动应用客户端升级以支持新的caching_sha2_password插件。

4.3 实战经验与技巧分享

  • 密码过期管理:在安全要求高的环境,可以强制用户首次登录修改密码:
    ALTER USER 'new_user'@'%' IDENTIFIED BY 'TemporaryPass123' PASSWORD EXPIRE;
    用户首次用这个临时密码登录后,MySQL会强制要求立即修改密码。
  • REPLACE子句的安全验证ALTER USER还有一个非常安全的功能,就是在修改当前用户自身密码时,要求提供旧密码进行二次验证,防止在登录会话未退出的情况下被他人恶意修改。
    -- 当前用户是 'john'@'%' ALTER USER USER() IDENTIFIED BY 'SuperNewPass' REPLACE 'CurrentOldPass';
    如果'CurrentOldPass'不对,修改会失败。这个功能在共享管理账号或跳板机场景下特别有用。
  • 修改主机权限ALTER USER不能直接修改user账户中的主机部分(即'username'@'hostname'中的hostname)。如果你想允许用户从另一个IP访问,正确的做法是创建一个新用户,或者使用RENAME USER语句(先确保新旧用户都存在且具有相同密码)。

5. 方式三详解:使用 --skip-grant-tables 模式(终极恢复)

这是忘记root密码时的“救命稻草”。其原理是让MySQL服务启动时不加载权限认证表(grant tables),从而允许任何用户无需密码进行连接并拥有所有权限。这是一个高风险操作,必须谨慎、快速。

5.1 原理与风险深度剖析

MySQL的权限信息存储在mysql数据库的几张核心表里(如user,db,tables_priv等)。正常启动时,服务会加载这些表来验证每一个连接请求。--skip-grant-tables这个启动参数告诉MySQL:“跳过这些权限表,别验证了”。

带来的后果是

  1. 任何知道MySQL服务端口和地址的人,都可以无需密码连接。
  2. 连接上来的用户默认拥有所有数据库的最高权限(相当于root)。
  3. 在此期间,任何权限管理语句(如GRANT,REVOKE,SET PASSWORD,ALTER USER)都无法执行,因为权限系统被禁用了。

因此,整个操作必须在数据库服务器本地进行,并且要确保MySQL服务只绑定在127.0.0.1(本地回环地址),避免被网络上的其他机器扫描攻击。操作流程必须是:停止服务 -> 以特殊参数启动 -> 无密码登录修改密码 -> 停止服务 -> 以正常参数启动。

5.2 步步为营的完整恢复流程

假设我们在一台CentOS 7服务器上,使用systemd管理的MySQL 8.0,忘记了root@localhost的密码。

步骤1:停止MySQL服务。

sudo systemctl stop mysqld

确保服务已经完全停止,可以用sudo systemctl status mysqld确认状态为inactive (dead)

步骤2:以--skip-grant-tables--skip-networking模式启动。--skip-networking参数至关重要,它禁止MySQL监听任何TCP/IP端口,只允许本地通过Unix Socket文件连接,这相当于又加了一把锁。

sudo mysqld_safe --skip-grant-tables --skip-networking &

对于使用systemd的较新版本,更推荐创建一个临时的配置文件来启动:

# 创建一个临时配置文件 echo -e "[mysqld]\nskip-grant-tables\nskip-networking" | sudo tee /etc/my.cnf.d/temp_recovery.cnf # 正常启动服务,它会读取我们添加的配置 sudo systemctl start mysqld

sudo systemctl status mysqld查看是否启动成功。

步骤3:无密码登录MySQL。由于跳过了权限验证,现在可以直接登录:

mysql -u root

注意,这里不需要-p参数。

步骤4:重设root密码。登录后,你会发现执行ALTER USERSET PASSWORD可能会报错,提示权限表没加载。在MySQL 5.7.6以后和8.0中,需要先手动加载权限表,然后才能修改。

-- 刷新权限,让服务器知道我们要重新使用权限系统(但此时仍在特殊模式) FLUSH PRIVILEGES; -- 现在可以修改root密码了,注意用户要写完整 ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewStrongRootPassword123!';

重要:在MySQL 8.0中,root用户的认证插件默认是auth_socketcaching_sha2_password。如果使用auth_socket插件(通过Unix Socket进行操作系统用户认证),上面的密码修改可能不生效。保险起见,可以同时指定插件:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourNewStrongRootPassword123!';

步骤5:退出并重启MySQL服务到正常模式。

EXIT;
# 停止服务 sudo systemctl stop mysqld # 删除或重命名临时配置文件 sudo rm /etc/my.cnf.d/temp_recovery.cnf # 正常启动服务 sudo systemctl start mysqld

步骤6:使用新密码验证登录。

mysql -u root -p

输入你刚设置的新密码YourNewStrongRootPassword123!,确认登录成功。

5.3 极端情况处理与安全强化

  • 如果FLUSH PRIVILEGES;后仍无法修改:在极老的版本或某些特殊状态下,可能需要直接更新mysql.user系统表。这是最后的手段,不推荐,因为手动更新容易出错且可能破坏数据一致性。
    -- MySQL 5.7以前,使用PASSWORD函数 UPDATE mysql.user SET authentication_string=PASSWORD('newpass') WHERE User='root' AND Host='localhost'; FLUSH PRIVILEGES; -- MySQL 8.0,密码存储在authentication_string字段 UPDATE mysql.user SET authentication_string=CONCAT('*', UPPER(SHA1(UNHEX(SHA1('newpass'))))) WHERE User='root' AND Host='localhost'; FLUSH PRIVILEGES;
    8.0的哈希计算非常复杂,强烈建议不要手动计算,优先使用ALTER USER
  • 安全强化操作:密码恢复后,务必进行一次全面的安全检查:
    1. 检查mysql.user表中是否还有匿名用户(User列为空字符串)或测试用户,如有则删除。
    2. 确认root用户是否可以从任意主机('root'@'%')登录。生产环境应限制root仅能从localhost登录。
    3. 考虑启用审计日志,监控后续的登录行为。

6. 方式四详解:使用 mysqladmin 工具(脚本利器)

mysqladmin是MySQL安装包自带的一个命令行管理工具,它可以在不交互式登录MySQL客户端的情况下执行一些管理任务,修改密码是它的核心功能之一。这在自动化脚本中极其有用。

6.1 工具定位与参数精讲

mysqladmin通过TCP/IP连接MySQL服务器,并发送相应的命令。修改密码的命令格式是:

mysqladmin -u [用户名] -p[原密码] password "[新密码]"

参数解析

  • -u: 指定要修改密码的MySQL用户名。
  • -p: 这个参数后面紧跟着原密码,中间不能有空格。例如原密码是oldpass,就写-poldpass。这是一种不安全的写法,因为密码会出现在进程列表和Shell历史中。更安全的方式是只写-p,然后回车,在提示符下输入原密码(不可见)。
  • passwordmysqladmin的子命令,表示执行修改密码操作。
  • "[新密码]":新的密码,用引号括起来,防止Shell解析特殊字符。

一个安全的交互式用法示例

mysqladmin -u app_user -p password "NewAppPass2024!"

执行后,会提示你输入app_user用户的当前密码,输入正确后,密码才会被修改为NewAppPass2024!

6.2 自动化脚本中的应用实例

在Shell脚本或Ansible Playbook中,我们无法进行交互式输入。这时,有几种策略:

策略A:使用-p后接原密码(有一定风险,适用于受控环境)。

#!/bin/bash OLD_PASS="current_password" NEW_PASS="new_secure_password" mysqladmin -u target_user -p${OLD_PASS} password "${NEW_PASS}"

风险:原密码${OLD_PASS}以明文形式出现在脚本和进程列表中。

策略B:使用配置文件(推荐)。MySQL客户端可以从~/.my.cnf配置文件中读取用户名和密码。我们可以临时创建这个文件。

#!/bin/bash NEW_PASS="new_secure_password" # 创建临时配置文件,包含原密码 cat > /tmp/my_temp.cnf << EOF [client] user=target_user password=current_password EOF # 使用--defaults-extra-file指定配置文件,执行修改 mysqladmin --defaults-extra-file=/tmp/my_temp.cnf password "${NEW_PASS}" # 立即删除临时配置文件 rm -f /tmp/my_temp.cnf

这种方式相对更安全,因为密码存储在临时文件中,且文件权限可以严格控制(如chmod 600),命令执行后立即删除。

策略C:使用expectsshpass进行自动化交互(复杂场景)。对于需要完全自动化的场景,可以使用expect脚本模拟输入:

#!/usr/bin/expect set old_pass "current_pass" set new_pass "new_pass" spawn mysqladmin -u target_user -p password $new_pass expect "Enter password:" send "$old_pass\r" expect eof

6.3 局限性与适用边界

  • 只能修改当前连接用户的密码mysqladmin password命令修改的是-u参数指定的那个用户的密码,并且你需要知道该用户的原密码。它无法像root一样修改其他任意用户的密码。它的本质是模拟了该用户登录并执行了SET PASSWORD语句。
  • 版本兼容性:在MySQL 8.0中,如果用户使用caching_sha2_password插件,且服务器启用了SSL,mysqladmin通过非SSL连接修改密码可能会失败。需要确保连接是加密的,或者使用--ssl-mode=REQUIRED参数。
  • 错误处理:在脚本中,务必检查mysqladmin命令的退出状态码($?),非0表示失败,需要记录日志并采取相应处理措施。
    if mysqladmin -u user -ppass password "newpass"; then echo "密码修改成功" else echo "密码修改失败,退出码: $?" >&2 exit 1 fi

7. 常见问题排查与实战技巧实录

即使掌握了方法,在实际操作中还是会遇到各种“诡异”的问题。下面是我总结的几个高频问题和解决思路。

7.1 问题一:修改密码后,应用仍然连接失败

现象:你用root账号在MySQL里成功修改了应用账号app_user的密码,但重启应用后,日志显示Access denied for user 'app_user'

排查思路

  1. 密码错误:这是最常见的原因。仔细核对密码,特别是大小写、特殊字符。最稳妥的验证方法是,在服务器上直接用修改后的密码尝试登录:
    mysql -u app_user -p
    输入新密码,看能否成功。
  2. 主机名不匹配:你修改的是'app_user'@'192.168.1.100'的密码,但应用是从192.168.1.200连接的。在MySQL中,这是两个不同的用户。使用以下命令查看app_user的所有授权记录:
    SELECT User, Host FROM mysql.user WHERE User = 'app_user';
    确认应用连接使用的主机名或IP是否在授权列表中。你可能需要修改的是'app_user'@'%'(任意主机)或对应具体IP的那个用户。
  3. 密码插件不兼容(MySQL 8.0常见):应用客户端可能太老,不支持MySQL 8.0默认的caching_sha2_password插件。查看用户认证插件:
    SELECT User, Host, plugin FROM mysql.user WHERE User = 'app_user';
    如果plugincaching_sha2_password,而应用报错包含“caching_sha2_password”,就需要将插件改回mysql_native_password
    ALTER USER 'app_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
  4. 应用连接池缓存了旧密码:很多应用(如Java的HikariCP、DBCP)或框架(如Spring Boot)会缓存数据库连接。密码修改后,连接池里的旧连接并未更新。需要重启应用,让连接池重新建立连接。

7.2 问题二:使用 --skip-grant-tables 后,ALTER USER 报错

现象:在跳过权限表模式登录后,执行ALTER USER root@localhost IDENTIFIED BY 'newpass';,报错ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement

原因与解决:这个错误提示很明确,在--skip-grant-tables模式下,服务器禁用了权限管理系统,因此不能执行权限管理语句。你需要先让服务器重新加载权限表。

FLUSH PRIVILEGES;

执行这条命令后,权限系统被部分激活(虽然仍处于无密码验证状态),此时再执行ALTER USERSET PASSWORD命令就可以成功了。这是MySQL 5.7.6之后版本的安全改进。

7.3 问题三:mysqladmin 修改密码时报错 “Access denied”

现象:执行mysqladmin -u user -poldpass password "newpass",返回mysqladmin: connect to server at 'localhost' failed error: 'Access denied for user 'user'@'localhost' (using password: YES)'

排查

  1. 原密码错误:确认-p后面跟的原密码是否正确。可以先用这个密码手动登录mysql -u user -p验证一下。
  2. 用户不存在或主机限制:确认用户'user'@'localhost'是否存在。用户可能只允许从127.0.0.1或者特定主机连接。localhost127.0.0.1在MySQL的Socket连接和TCP连接中有时会被区别对待。可以尝试指定主机:
    mysqladmin -u user -h 127.0.0.1 -poldpass password "newpass"
  3. Socket文件问题:如果MySQL配置了特定的Socket文件路径,而mysqladmin找不到,也会连接失败。可以通过mysql_config --socket查找路径,或用-S参数指定:
    mysqladmin -u user -poldpass -S /var/lib/mysql/mysql.sock password "newpass"

7.4 一份速查表:方法选择与命令参考

场景推荐方法核心命令示例关键注意事项
已知密码,常规修改ALTER USER(MySQL 5.7.6+)ALTER USER 'user'@'host' IDENTIFIED BY 'new_pass';MySQL 8.0首选,功能最全。
已知密码,旧版本环境SET PASSWORDSET PASSWORD FOR 'user'@'host' = 'new_pass';MySQL 8.0中已过时。
忘记root密码--skip-grant-tables模式1. 停服务
2. 安全模式启动
3.FLUSH PRIVILEGES;
4.ALTER USER ...
5. 重启服务
高风险,操作需快,务必加--skip-networking
Shell脚本自动化mysqladmin+ 配置文件mysqladmin --defaults-extra-file=cnf.cnf password "new_pass"避免密码出现在命令行历史。检查退出状态码。
修改当前用户自身密码ALTER USERSET PASSWORDALTER USER USER() IDENTIFIED BY 'new_pass';USER()函数获取当前用户信息。
强制下次登录改密码ALTER USERPASSWORD EXPIREALTER USER 'user'@'host' PASSWORD EXPIRE;用户下次登录时会收到修改密码提示。

最后,再分享一个我个人的小习惯:每次修改重要密码(尤其是root密码)后,除了立即用新密码登录验证,我还会顺手检查一下mysql.user表中相关用户的pluginpassword_last_changed字段,确认修改已生效且符合预期。这条简单的检查命令能帮你避免很多后续的迷惑。

SELECT User, Host, plugin, password_last_changed FROM mysql.user WHERE User IN ('root', 'your_app_user');
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/5 6:43:03

QQ邮箱免费升级Foxmail别名:打造专业形象与解决发信失败指南

你有没有想过&#xff0c;为什么你的QQ邮箱地址&#xff0c;总是那个带着一串数字、看起来像临时账号的格式&#xff1f;比如123456789qq.com&#xff0c;或者更早期的123456789qq.com&#xff1f;每次在简历、商务邮件或正式注册时填写它&#xff0c;心里是不是会闪过一丝犹豫…

作者头像 李华
网站建设 2026/8/6 9:58:18

从“雍正李卫”三人群看现代研发协作:如何用RACI与工具打造高效团队

“李卫的微信工作群只有三个人&#xff1a;雍正皇帝 雍正朝常务副皇帝 李卫”——这个看似戏谑的段子&#xff0c;最近在技术圈和职场圈里火了起来。它戳中的&#xff0c;远不止是历史爱好者对雍正朝“君臣奏折直达”的想象&#xff0c;而是每一个身处现代企业、被臃肿组织架构…

作者头像 李华
网站建设 2026/8/6 9:57:02

LangChain实战指南:从零构建基于大语言模型的智能应用

最近在尝试将大语言模型&#xff08;LLM&#xff09;应用到实际业务中时&#xff0c;你是否遇到过这样的困境&#xff1a;模型本身很强大&#xff0c;但让它读取你的私有文档、调用外部API、或者记住多轮对话内容却异常困难&#xff1f;网上资料要么是零散的代码片段&#xff0…

作者头像 李华
网站建设 2026/8/6 9:56:15

储油罐变位识别与罐容表标定:几何建模与参数反演实战

1. 项目概述&#xff1a;从“量不准”到“算得准”的工程挑战在石油化工、粮油仓储乃至战略储备领域&#xff0c;储油罐是再常见不过的工业设施。然而&#xff0c;一个看似简单的问题却长期困扰着现场工程师和计量人员&#xff1a;当储油罐因为地基沉降、安装误差或外力作用发生…

作者头像 李华
网站建设 2026/8/6 12:22:26

SAP增值税配置全解析:从税码到科目确定的实战指南

1. 项目概述&#xff1a;为什么SAP增值税配置是财务数字化的基石在SAP FI&#xff08;财务会计&#xff09;模块的实施与日常运维中&#xff0c;增值税的配置绝对算得上是一个“牵一发而动全身”的核心环节。表面上看&#xff0c;它只是后台配置表&#xff08;T-code: SPRO&…

作者头像 李华