mysql忘记初始临时密码解决方法

当遇到 "Access denied for user 'root'@'localhost' (using password: YES)" 这个错误时,除了密码本身不正确外,还有其他一些可能的原因和解决办法:

1. 忘记初始临时密码

正如之前提到的,首次安装启动 MySQL 时会生成一个临时密码。如果你没有使用这个临时密码去登录并修改密码,而是直接尝试设置新密码,就会出现这个错误。请务必使用初始生成的临时密码登录,然后再修改密码。

2. 密码存储格式与认证插件问题

不同的 MySQL 版本和配置可能使用不同的认证插件,这会影响密码的存储和验证方式。

  • 查看当前认证插件 : 登录到 MySQL 数据库(如果能登录的话),使用以下命令查看当前用户使用的认证插件:

    复制代码
    SELECT user, plugin FROM mysql.user WHERE user = 'root';

    如果插件不是 mysql_native_password,可能会导致密码验证问题。

  • 修改认证插件 : 如果你确定要使用 mysql_native_password 插件,可以使用以下命令修改 root 用户的认证插件:

    复制代码
    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';

    这里的 your_password 是你希望设置的密码。之后刷新权限:

    复制代码
    FLUSH PRIVILEGES;

3. 重置 root 用户密码

如果实在无法确定临时密码,或者上述方法都无效,可以尝试重置 root 用户密码。这通常需要以无密码验证的方式启动 MySQL 服务,不同操作系统和 MySQL 版本的操作略有不同,以下是一种常见的方法(适用于类 Unix 系统):

  1. 停止 MySQL 服务

    复制代码
    service mysql stop
  2. 以安全模式启动 MySQL : 在 my.cnfmy.ini 配置文件中添加或修改一行:

    复制代码
    [mysqld]
    skip-grant-tables

    保存配置文件后,重新启动 MySQL 服务:

    复制代码
    service mysql start
  3. 登录并修改密码 : 此时不需要密码即可登录 MySQL

    复制代码
    /usr/local/mysql/bin/mysql -uroot --socket=/var/lib/mysql/mysql.sock

    登录后,在 MySQL 命令行中执行以下操作来修改密码:

    复制代码
    USE mysql;
    UPDATE user SET authentication_string=PASSWORD('new_password') WHERE user='root' AND host='localhost';
    FLUSH PRIVILEGES;

    new_password 替换为你想要设置的新密码。

  4. 恢复正常启动 : 完成密码修改后,将配置文件中的 skip - grant - tables 这一行删除,然后重启 MySQL 服务,使其恢复正常的密码验证机制:

    复制代码
    service mysql stop
    # 删除或注释掉 skip - grant - tables 行
    service mysql start

4. 检查用户和主机匹配

确保 root 用户在 mysql.user 表中的 host 字段设置为允许连接的主机。例如,如果是本地连接,host 应该是 'localhost' 或者 '127.0.0.1'。可以通过以下命令查看:

复制代码
SELECT user, host FROM mysql.user WHERE user = 'root';

如果 host 字段的值不正确,可能会导致访问被拒绝。你可以使用以下命令修改:

复制代码
UPDATE mysql.user SET host = 'localhost' WHERE user = 'root' AND host!= 'localhost';
FLUSH PRIVILEGES;

通过以上步骤,应该能够解决 root 用户访问被拒绝的问题。

要在当前环境下执行这个查询,你需要先进入 MySQL 客户端。假设你的 MySQL 安装在 /usr/local/mysql 目录下,并且已经配置好了相关环境变量,你可以使用以下命令进入 MySQL 客户端:

bash复制代码

复制代码
/usr/local/mysql/bin/mysql -uroot -p --socket=/var/lib/mysql/mysql.sock

输入密码(如果有的话)后,你就进入了 MySQL 客户端环境,此时再执行 SELECT 语句:

sql复制代码

复制代码
SELECT user, host FROM mysql.user WHERE user = 'root';

这样就能得到关于 root 用户及其允许连接的主机信息。

如果你在执行进入 MySQL 客户端命令时遇到问题,比如提示找不到命令,那可能是因为没有正确配置环境变量。你可以将 /usr/local/mysql/bin 添加到系统的 PATH 环境变量中。在 bash 中,你可以使用以下命令临时添加:

bash复制代码

复制代码
export PATH=$PATH:/usr/local/mysql/bin

如果希望永久添加,可以将上述命令添加到 .bashrc.bash_profile 文件中,然后执行 source ~/.bashrcsource ~/.bash_profile 使更改生效。

相关推荐
这个DBA有点耶6 小时前
AI写的SQL跑崩了生产库,这锅谁背?
数据库·人工智能·程序员
镜舟科技7 小时前
Databricks 再提 LTAP,AI 时代的数据底座为何重回大一统叙事?
数据库·架构·agent
Databend7 小时前
从湖仓升级为 Agent 时代的数据控制面,Snowflake 和 Databricks 有哪些布局
大数据·数据库·agent
雨白9 小时前
指针与数组的核心机制
android
ClouGence11 小时前
SQL Server CDC 能放到 Always On 备库读吗?一文讲透原理与实践
数据库·sql server
黄林晴13 小时前
Room 3.0 正式发布!包名彻底重构,KMP 成为核心主线
android·android jetpack
三少爷的鞋14 小时前
Kotlin 协程环境下的 DCL 懒加载:别把线程时代的经验直接搬过来
android
plainGeekDev14 小时前
Gson → kotlinx.serialization
android·java·kotlin
先吃饱再说1 天前
存储的进化:从 MySQL 到浏览器缓存,数据到底住在哪?
数据库