Pycharm连接mysql遇到的坑,报错Access denied for user ‘root‘

昨天在尝试用pycharm连接mysql,从而在python中对数据库进行增删改查。但是在pycharm连接mysql这一步就遇到了几个很棘手的问题,看其他的教程很快就连接好了,但是我这里就总是报错,命令行连接mysql能够成功,但是ide中连接会报错,最后折腾了好几个小时才全部解决,这里记录一些问题的原因和解决方法,希望能帮助到同样遇到困难的人。

一、操作过程

打开pycharm右侧database,点击+号添加数据库,选择mysql;

弹出的对话框中,需要填写的几项:user,password,database,如果下方提示驱动未安装,需要下载驱动,最后就可以测试是否连接成功。

a. User: Mysql的username

b. Password: Mysql的password

c. Database: 数据库名

d. 自动下载缺失的驱动

e. Test connection:测试连接是否成功

二、报错:The specified database user/password combination is rejected: com.mysql.cj.exceptions.CJException: Access denied for user 'root'

 出现这个问题的原因有以下几种可能:(可以每一条都排查一下)

1.用户名密码错误

这里一开始我以为是要自定义用户名和密码,后来搜索得知,这里的用户名需要是mysql的用户名;

查看mysql用户名

select user,host from mysql.user;

然后我填入了用户名root,但是还是连接不上,考虑密码可能不对;(但其实root用户的密码就是mysql安装时输入的密码) 

查看密码

SELECT User, Password, Host FROM user;

这个命令遇到报错ERROR 1054 (42S22): Unknown column 'Password' in 'field list'

错误的原因是mysql数据库下已经没有password这个字段了,password字段改成了authentication_string

SELECT User, authentication_string, Host FROM user;

但是用了root用户名和正确的密码还是连接不上;

2.用户名没有远程访问权限

root帐户默认不开放远程访问权限,所以需要修改一下相关权限,给数据库添加远程访问权限;

查看表格中 root 用户的 host,默认应该显示的 localhost,只支持本地访问,不允许远程访问。

% 表示通配所有 host,可以访问远程。

先选择mysql数据库

mysql>use mysql

设置访问权限

试了以下几种命令,都遇到了报错:

mysql> GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION;
mysql> grant all privileges on . to root@localhost identified by '密码';

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '. TO 'root'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION' at line 1

搜索得知,需要先创建用户,再执行赋权;

先创建用户,(这里的密码自行设置);

mysql> CREATE USER 'test'@'%' IDENTIFIED BY '密码';

再对该用户分配用户权限;

mysql> GRANT ALL PRIVILEGES ON *.* TO 'test'@'%' WITH GRANT OPTION;

最后刷新权限;

mysql> FLUSH PRIVILEGES;

再次查看,能够看到新创建的用户test拥有了远程登录权限。

select user,host from mysql.user;

 但是再次连接还是失败;

3.检查后台mysql是否启动

ps -ef|grep mysql

能够看到mysql相关的进程;

另一个方法检查mysql是否启动:

mysql.server status

但是这个命令我这边会报错-bash: mysql.server: command not found

一种说法是没有配置环境变量导致的,但是我配置过的;不知道什么原因,暂时只能以下面这种方式使用:

/usr/local/mysql/support-files/mysql.server status

执行这个命令显示ERROR! MySQL is running but PID file could not be found

原因:mysql进程异常

找到并kill掉所有关于mysql的进程;

删掉一堆pycharm连接mysql的进程后,只剩这个进程;

 

这里mysql进程杀不掉,非法关闭mysql时,会被它重新启动的;

看到一个说法是mysql服务启动有多种方式:

mysql.service start - for MySQL installed using package managers

brew services start mysql - for MySQL installed with Homebrew
Using the preference pane for macOS official MySQL installation

重点:

每次启动 MySQL 服务时,都会根据 MySQL 使用的配置在特定位置生成 PID 文件。

当在一个位置生成 PID 文件,但当前运行的命令在另一个位置查找 PID 文件时,会发生 PID 文件位置不匹配。

在系统偏好设置UI面板中启动mysql服务后,该面板与mysql安装文件捆绑在一起,MySQL 会生成一个mysqld.local.pid/usr/local/mysql/data/目录中命名的 PID 文件。

为了修复这个问题,需要在mysql.server start再次运行命令之前从系统偏好设置UI面板中停止当前正在运行的 MySQL 线程。

从系统偏好设置面板中停止mysql服务,再运行ps -ef | grep mysql,发现确实没有mysql进程了;

 

这个时候再去查看/usr/local/mysql/support-files/mysql.server status,提示:

符合预期。

然后尝试重启mysql服务

sudo /usr/local/mysql/support-files/mysql.server start

 

成功启动。

但是再回pycharm里尝试连接mysql还是失败。

 4.端口号是否正确或者端口号是否被占用

url:jdbc:mysql://localhost:3306

注意要把端口号修改成自己的mysql默认监听端口,有的是3306,有的是3308。(一般情况下默认的端口号就是对的,这里也提供自查的方法)

(1)windows电脑中my.init文件可以查看mysql的端口号,my.init文件在mysql安装目录下;(mac下没有my.ini文件,mac下是my.cnf,在/usr/local/mysql/support-files/创建后可自定义一些设置)(2)另一个查询端口号方法,也可以在终端中进入mysql,然后输入status,回车,也可以查询到mysql以及端口号等信息;

 (3)但是在mac下status命令没有查看到端口号,mac下可用下面这个命令查看端口号:

show global variables like 'port';

端口号是对的。

下一步查看端口是否被占用。

sudo lsof -i :3306

 如果有进程占用,则kill掉对应的进程。

5.驱动版本不对应

pycharm中安装的mysql驱动版本需要跟电脑安装的mysql版本对应;5.x对应5.x,8.x对应8.x;

我安装的mysql是8.0.31版本,(安装教程参考(2023)mac安装mysql_Vermouth_00的博客-CSDN博客

因此我装的驱动是8.x版本的。

如果是驱动版本不对应,可以在此切换驱动版本。 

三、报错[08001] Could not create connection to database server. Attempted reconnect 3 times. Giving up. java.net.ConnectException: Connection refused (Connection refused).

这个报错相对来说就比较常见了,基本就是因为时区问题,可以更改一下url,这里database的名称改成自己的;

jdbc:mysql://localhost:3306/database的名称?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC


或者

jdbc:mysql://localhost:3306/test?serverTimezone=GMT

改了URL之后还是不行。

这个时候我命令行连接mysql突然失败了,报错:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

于是又ps -ef|grep mysql,然后杀进程,重启mysql服务,然后查看端口号未被占用,再次尝试连接,终于成功了。

四、总结 

The specified database user/password combination is rejected: com.mysql.cj.exceptions.CJException: Access denied for user 'root'

这个报错并不常见,查到的解决方案比较少,如果有人不幸也遇到了,可以根据本文提供的这些可能的原因进行排查,有新的解决方法欢迎讨论~

总结一下我解决这个问题的关键点:1.给用户授予远程访问权限;2.重启mysql服务;3.查看端口占用,杀掉进程。

希望大家都能顺顺利利,不要踩坑~

猜你喜欢

转载自blog.csdn.net/Vermouth_00/article/details/130969577