• 问题核心
  • 原因
  • 解决方案

    1、问题核心

    1.1核心问题

    mysql服务启动,点开客户端navicat图形界面,打开数据库提示1045 Access denied for user
    ‘root’@’localhost’(using password:YES)。如下图:
    2022-04-23_130203.png
    链接1
    链接2

    1.2解决过程中其他并发问题

    在cmd窗口解决1045问题时,由于MySQL5.7版本没有password这个字段了,password字段改成了authentication_string,所以会出现1054:Unknown column ‘password’ in ‘field list’.错误。如下图所示:
    2022-04-23_134035.png
    链接3

    2、原因

    2.1数据库密码被篡改了!

    没错,就是这个原因。但是很多人会立马反驳,我自己的电脑一直用着好好的,怎么会被篡改了呢?黑客的手段厉害着呢,篡改你的数据库密码不是主要目的,目的是篡改后进入你的数据库备份数据库文件然后删除本地数据库,要挟你索要比特币才是主要目的。

    2.数据库权限变更了!

    这个原因与你机器的账户权限变更有很大的关系

    3、解决方案(更改密码指定,5.7版本以上)

    3.1方法一:重新设置root用户密码(推荐)

    在Windows平台下操作步骤如下:

    1.编辑mysql配置文件my.ini

    在[mysqld]这个条目下加入 skip-grant-tables 保存退出后重启mysql服务
    skip-grant-tables 用于启动mysql后,关闭权限的检查更改权限,方便改root密码
    但会降低数据库安全性,修改密码成功后需要注释掉(加#)。

    2022-04-23_152304.png


    2.Win+R,打开cmd命令窗口,并右键以管理员身份运行


    3.重启mysql服务

    a.停止MySQL服务:

    ①方法一:进入服务管理器:如果是作为Windows服务运行的服务器,
    开始菜单->控制面板->管理工具->服务
    或 菜单栏右键->任务管理器->服务
    或 此电脑右键->管理->服务和应用程序->服务
    如果服务器不是作为服务而运行的,可能需要使用任务管理器来强 制停止它。但后续还是需要cmd命令窗口来运行后续更改操作(从启动服务开始)。
    ②方法二:(推荐)先在cmd窗口中切换到MySQL安装目录的bin目录下,
    输入 :net stop mysql
    2022-04-23_141317.png

    b.启动MySQL服务:

    输入:net start mysql

    4.使用mysql数据库

    1. 输入:**mysql -u root -p **<br /> **出现 password:的时候直接回车**<br /> 由于启动mysql后用 skip-grant-tables关闭了权限,在cmd里面输入mysql -u root -p就可以不用密码登录了,出现 password:的时候直接回车可以进入,不会出现ERROR 1045 (28000),但很多操作都会受限制,因为没有grant权限。

    5.进入mysql数据库

     mysql> **use mysql;**<br />      Database changed
    

    6.给root用户设置新密码

    mysql> update user set password=password("新密码") where user="root";<br />      Query OK, 1 rows affected (0.01 sec)<br />      Rows matched: 1 Changed: 1 Warnings: 0<br />由于MySQL5.7以上版本没有password这个字段了,password字段改成     authentication_string.<br />即将上边的改为:<br />**update user set authentication_string=password("新密码") where user="root";**
    

    7.刷新数据库


    mysql> **flush privileges; Query OK, 0 rows affected (0.00 sec)

    8.退出mysql


    mysql> quit;
    Bye

    9.再次修改my.ini

    改好之后,再修改一下my.ini这个文件,把我们刚才加入的 “skip-grant-tables”这行删除,保存退出再重启mysql服务,再重新用Navicat连接就可以了。
    2022-04-23_150028.png

    10.或cmd运行脚本修改


    ①.创建1个文本文件,并将下述命令置于单一行中:
    SET authentication_string FOR ‘root’@’localhost’ = PASSWORD(‘**‘);
    用任意名称保存该文件。在本例中,该文件为D:\mysql1\mysql-installer-community-5.7.37.0-init.txt(文件路径在安装目录下)。
    ②.进入DOS命令提示:开始菜单->运行-> cmd
    如果你将MySQL安装到了另一位置,请对下述命令进行相应的调整。
    在DOS命令提示符下,执行命令:
    D:>D:\mysql1\mysql-installer-community-5.7.37.0\bin\mysqld-nt —init-file=D:\mysql1\mysql-installer-community-5.7.37.0\bin\mysql-init.txt
    在服务器启动时,执行由“—init-file”选项(作用:在启动时从指定的文件中读取SQL命令)命名的文件的内容,更改根用户密码。当服务器成功启动后,应删除init.txt文件。
    ③.停止MySQL服务器,然后在正常模式下重启它。如果以服务方式运行服务器,应从Windows服务窗口启动它。如果以手动方式启动了服务器,能够像正常情形下一样使用命令。


    3.2、方法二:卸载重装(保存原有数据库data备份)

    卸载原有的数据库,包括主程序、注册表和安装目录文件夹,但一定要备份D:\mysql1\mysql-installer-community-5.7.37.0\data数据库文件,这是你之前数据库表文件等,要恢复数据库必须备份下来,后面才可以恢复数据。此外,此文件夹是默认隐藏的。
    复制data文件夹下面你之前创建的数据库,名字都是对应的,你有印象就能知道哪个是你创建的数据库,D:\mysql1\mysql-installer-community-5.7.37.0\data数据库文件下还有三个文件也是必须备份的,看图:
    2022-04-23_152838.png

备份这些文件后,卸载原来的数据库程序并删除文件夹和注册表,重装数据库后关闭数据库服务,把备份的文件放入对应的位置,有重名的点击替换,然后再重启数据库服务。这个时候打开数据库,原来的数据库已经存在了。虽然表存在异常,但原来保存的新建查询,加上外部的sql脚本可以恢复原有表。


3.3、其他方法:

1.方法一: (推荐)

mysql> use mysql;
mysql> UPDATE user SET authentication_string=PASSWORD('你的新密码') where USER=&rsquo;root&rsquo;;  
mysql> FLUSH PRIVILEGES;  
mysql> quit


2.方法二:

直接使用/etc/mysql/debian.cnf文件中[client]节提供的用户名和密码:

# mysql -udebian-sys-maint -p  
Enter password: <输入[client]节的密码>  
mysql> UPDATE user SET authentication_string=PASSWORD(&rsquo;newpassword&rsquo;) where USER=&rsquo;root&rsquo;;  
mysql> FLUSH PRIVILEGES;  
mysql> quit  
# mysql -uroot -p  
Enter password: <输入新设的密码newpassword>  
mysql>


3.方法三:

#Windows:
#1. 管理员登陆系统,停止mysql服务或者结束mysqld-nt进程
#2. 进入命令行,来到mysql的安装目录.假设安装目录为 d:\mysql\ , CMD进入命令行
#3. 运行 d:\mysql\bin\mysqld-nt --skip-grant-tables 启动mysql,关闭权限的检查
#4. 运行 d:\mysql\bin\mysqladmin -u root flush-privileges password "newpassword" 重设root密码
#5. 重新启动mysql服务