【填坑向】MySQL常见报错及处理系列(Communications link failure & Access denied for user ‘root‘@‘localhost‘)

本系列其他文章

【填坑向】MySQL常见报错及处理系列(Navicat:2002 - Can‘t connect to MySQL server on ‘127.0.0.1‘ & 获取配置文件my.cnf路径)_AQin1012的博客-CSDN博客由于不同版本的MySQL可能默认的配置文件位置不同,并且有些版本的MySQL在安装时并不会自动创建my.cnf文件,需要用户手动创建。上面命令返回的路径+--verbose --help |grep -A 1 'Default options',然后回车后显示的就是my.cnf的路径。上面红框框内的就是读取配置文件my.cnf的路径的顺序(MySQL在启动时将按照列出的顺序读取这些文件中的配置,即优先级从左到右依次降低)可以尝试右键选择“高级”,勾选“使用套接字文件”https://blog.csdn.net/aqin1012/article/details/132472330?spm=1001.2014.3001.5502

【填坑向】MySQL常见报错及处理系列(ERROR! The server quit without updating PID file)_AQin1012的博客-CSDN博客MySQL 数据文件通常位于 /usr/local/var/mysql 目录中,可以使用sudo rm -rf /usr/local/var/mysql进行删除;如果只有这意味着只有 grep mysql 这一个进程与mysql相关,即MySQL 服务器当前并没有在运行,说明 MySQL 服务器已经停止了,无需再手动删除。删除 MySQL 安装文件和数据文件,MySQL 的默认安装位置是/usr/local/mysql,可以使用sudo rm -rf /usr/local/mysql删除它。https://blog.csdn.net/aqin1012/article/details/132428120?spm=1001.2014.3001.5502

目录

com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)

重置MySQL用户密码

ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement


com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

SpirngBoot整合MyBatis时一直连接不上本地数据库,报com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure这个异常,由于我第一次使用mybatis-generator这个插件,因此不确定项目配置问题还是本地数据库的问题,于是我先使用了一个测试类来通过代码直接连接数据库,代码如下:

package com.aqin.mg;

import java.sql.Connection;
import java.sql.DriverManager;

/**
 * @Description
 * @Author aqin1012 AQin.
 * @Date 8/23/23 10:39 AM
 * @Version 1.0
 */
public class Test {
    public static void main(String[] args) {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
            Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/aqin?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai", "root", "******");
            System.out.println(con.getSchema());
            System.out.println("Database connection success");
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

由于我本地使用的MySQL版本是8.1.0,所以使用的driveClass是"com.mysql.cj.jdbc.Driver",但是仍然会报com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure,于是我再次尝试连接其他服务器上的MySQL(上面的代码仅仅替换mysql地址、用户名和密码),显示连接成功,因此可以确是本地MySQL的问题。

执行brew services list可以看到MySQL是启动成功了的

执行lsof -i:3306无任何返回,说明MySQL并未在端口3306处启动,但是我在配置文件里是配置端口了的(配置文件内容如下图)

因此可能是配置文件未生效,执行mysqld --help --verbose | grep "Default options" -A 1,返回如下:

翻一下大致的意思就是默认会按照如下的顺序读取配置文件,我上面贴出的配置文件就是第一个/etc/my.cnf,但显然目前在运行的MySQL并不是使用的这个配置文件,保险起见,我依次查看了列出的所有位置的my.cnf,看是否存在,存在的话内容是什么,于是发现/usr/local/etc/my.cnf也存在,并且未配置端口信息,我在该位置的my.cnf中添加了端口配置(port = 3306)并重启后,再次执行lsof -i:3306

显然,生效的是位于/usr/local/etc/位置下的my.cnf(为什么没有按照执行ysqld --help --verbose | grep "Default options" -A 1的返回顺序,原因目前未知,后续了解原因后会更新,也希望如果有了解原因的大佬能指教下,抱拳ing~)

接着,再次执行我上面贴出的测试代码

终于换了个异常了= =

java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)

导致这个异常的原因一般为权限问题,或者用户名/密码错误

先使用mysql -u root -p在命令行处进行登陆,如果能登录成功,这说明用户名/密码无问题,那么再在命令行中执行SELECT User, Host, Grant_priv FROM mysql.user;查看权限

上图可以看到,用户root是有这些权限的,如果User中的root的Grant_priv的值也是N,则继续执行GRANT ALL PRIVILEGES ON . TO 'root'@'localhost' WITH GRANT OPTION;给用户root赋值,最后再调用FLUSH PRIVILEGES;进行刷新。

如果登录失败,则说明用户名/密码有问题(一般都是密码错误)

如果试遍所有你觉得可能的密码仍然不对那么就需要对密码进行重置

重置MySQL用户密码

先执行brew services stop mysql停止MySQL服务

在配置文件中添加skip-grant-tables,或者将配置文件中的skip-grant-tables=0(如果右)修改为skip-grant-tables,重启MySQL,然后执行mysql -u root可以无需密码直接登录

登录后,重新设置密码

如果你的版本超过5.7.6,你可以使用 ALTER USER 命令去修改密码:

如果你的MySQL版本是8.0,使用以下命令:

修改完密码后,别忘记运行 FLUSH PRIVILEGES; 来使新的权限生效。

如果出现如下异常

ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement

执行flush privileges刷新下,然后再执行相同的修改操作

这个返回说明密码设置的太简单了,不符合MySQL当前的密码策略(MySQL在5.7.4版本引入了一个名为validate_password的插件,默认情况下,插件实施具有一定复杂性的密码策略。例如,密码必须包含一个大写字母,一个小写字母,一个数字和特殊字符,并且密码的长度不能小于8个字符等等)

可以通过执行show variables like 'validate_password%';查看相关策略

上图可以看到此时的validate_password.policy 是MEDIUM,可以尝试增加密码的复杂度(如下图,即修改成功)

也可以执行SET GLOBAL validate_password.policy = LOW;降低策略的级别

降低级别后,再次尝试将密码修改为之前修改失败的12345678(降级后也是要求至少8位的,)

可以看到就修改成功了,记得flush privileges刷新下,最后需要将一开始在配置文件中添加的skip-grant-tables删除,或者改为skip-grant-tables=0,然后重新开启MySQL服务,尝试使用新的密码登录。

ps:其实使用的8.0以后版本的MySQL默认是不设置密码的,当我把password设置为""时,就显示连接成功(不过我还是按上面的流程设置了个密码)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AQin1012

求小鱼干呢~~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值