问题描述
终端命令行输入用户名和密码可以进MySQL,也可以正常进行一系列操作。
但是只要一到代码里面发送请求访问就不行。(我的后端是用nodejs写的)
输入正确的用户名和密码,总是报错:Access denied for user 'root'@'localhost' (using password: YES)
const mysql = require('mysql');
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
password: '123456',//密码正确
database: 'my_database',
port: '3306'
});
原因分析:
1.出现access denied的原因有如下可能:
1)mysql的服务器停止
2)用户的端口号或者IP导致
3)mysql的配置文件错误----my.ini等文件
4)root用户的密码错误**
我几乎按照网上教程逐一排除了,其中第2)点
我用的是这篇博客排除的,其实和我最后正确的解决办法差不多,只不过他是通过端口号寻找进程的,甚至找到的进程是同一个
。可是就是没有解决我的问题。呜呜,然后继续找了很多原因。
2.分析是不是我的代码有误,不能连接数据库。
const mysql = require('mysql');
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
password: '',//密码置空
database: 'my_database',
port: '3306'
});
把密码置空,竟然可以连接到数据库,可以获取到默认数据库和表
,比如user表、权限表等等。但是不能访问我自己创建的数据库和表
。所以可以排除这个原因。
3.后来又查到的貌似是Nodejs与MySQL8.0以上不兼容。原因貌似是MySQL8.0里面的加密方式更新之类的,目前Nodejs还不支持这个加密方式连接方式。
我按照网上在Navicat里面改变了加密方式(变成传统的mysql_native_password),同时我用Java重新写了一遍,也报同样的错。所以可以排除这个原因。
4.后来觉得是MySQL8.0版本太高了,出现其他我不知道的问题。
我问了装了MySQL8.0的同学,同学说“everthing is ok!”
5.应该是我电脑本身的有些未知的程序、或者进程、或者缓存之类的影响。
然后走投无路的时候问了同学,同学说他经常出现这个问题,索性就记下来。甚至是很多次MySQL服务起不来的万能用法
。
后来我查了查,感觉比较说的过去的理由是:
如果服务器的mysqld-nt.exe 占CPU很高,一般是因为MYSQL的数据库中有数据进行采集,或者是数据库出现问题。一般CPU过高是因为该用户生成静态或者进行采集。而控制程序池无法解决数据库CPU过高的问题。输入 mysql> show processlist;查询现在mysql在干什么。按向上箭头再查询一边,看哪个数据库查询的语句比较频繁!一般是睡眠连接过多,严重消耗mysql服务器资源(主要是cpu, 内存),并可能导致mysql崩溃。
emm,好像有点官方看不太懂。。。
解决方案:
若大家可以在前面的提到的那篇博客里面解决了问题,那就是说明我当时操作有误。我感觉本质上差不多的,只不过一个是通过占用了
端口号
找到杀死进程,一个是通过查找当前任务列
找到并杀死进程。
解决方案分为四步:
终端cmd,以管理员身份运行:
1. 暂停MySQL服务。
C:\Program Files\MySQL\MySQL Server 8.0\bin>net stop mysql
或者服务
里面停止。
2. 找到mysql任务列正在运行的进程。
C:\Program Files\MySQL\MySQL Server 8.0\bin>tasklist|findstr "mysql"
3. 杀死这些占用的进程。
C:\Program Files\MySQL\MySQL Server 8.0\bin>taskkill/f /t /im mysqld.exe
- 重启MySQL服务。
C:\Program Files\MySQL\MySQL Server 8.0\bin>net start mysql
或者服务
里面启动。
问题解决!
注意:若MySQL服务启动不起来也关闭不了,也可以继续执行2、3步,甚至先重启电脑再执行一遍。总之,问题应该就是,是MySQL进程占用卡死。