[MYSQL] mysql常见连接失败问题汇总

2025-05-18 03:43:29

导读今天遇到个离谱的问题, 是IP,账号密码均正确的情况下, 无法连接数据库. 所以来水一篇mysql连接相关的文章.

案例1 IP,账号,密码均正确 却无法连接现象IP,账号密码都是对的, 但是连接数据库的时候报错ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

分析该报错是说无法通过socket文件/tmp/mysql.sock连接到数据库. 问题来了, 我们明明指定了IP的啊, 而且/etc/my.cnf和~/.my.cnf中均为配置socket相关的信息. 为啥还是使用了默认的/tmp/mysql.sock呢?

难道是我们指定的host没有被识别到?

确实是这样的, 而且不会报错, 啥信息都没得. 仔细看发现是中文的-

开发一般都是在配置文件里面配置数据库相关信息, 在命令行使用的时候就会整出各种奇葩问题 -_-

解决办法使用正确的英文-即可. (这个场景离谱的是-u和-p都是英文的, 就-h的时候是中文的....)

案例2 端口不通/进程没有启动现象代码语言:mysql error复制ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.101.31' (111)分析此报错为, 目标mysql的端口不通,比如防火墙或者selinux限制了, 或者没有启动mysqld进程.

代码语言:shell复制13:36:36 [root@ddcw21 ~]#perror 111

OS error code 111: Connection refused解决办法确保目标Mysqld已启动. 确保目标端口能通(关闭防火墙和selinux). 如果要经过其它网络设备, 也需要添加相应的规则.

案例3 网络不通报错/现象代码语言:mysql error复制ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.101.33' (113) 这个报错和上面的类似

分析此报错为路由不通, 即没有到达目标IP的路由

代码语言:shell复制13:36:16 [root@ddcw21 ~]#perror 113

OS error code 113: No route to host解决办法确保IP地址正确. 确保路由配置正确(非直连请配置静态路由或者网关)

案例4 密码过期报错/现象登录mysql后,无法执行sql, 报错如下

代码语言:mysql error复制ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement分析此报错为用户密码过期.

代码语言:shell复制13:43:00 [root@ddcw21 ~]#perror 1820

MySQL error code 1820 (ER_MUST_CHANGE_PASSWORD): You must reset your password using ALTER USER statement before executing this statement解决办法修改密码即可

代码语言:mysql复制ALTER USER 'u2023_2'@'%' IDENTIFIED BY '123456';

-- ALTER USER current_user() IDENTIFIED BY '123456'; -- 修改当前用户的密码案例5 密码不对报错/现象代码语言:mysql error复制ERROR 1045 (28000): Access denied for user 'u2023_2'@'192.168.101.21' (using password: YES)分析此报错为密码不对.

代码语言:shell复制13:47:19 [root@ddcw21 ~]#perror 1045

MySQL error code 1045 (ER_ACCESS_DENIED_ERROR): Access denied for user '%-.48s'@'%-.64s' (using password: %s)解决办法使用正确的密码即可. 若忘记密码,可直接修改密码.

代码语言:mysql复制ALTER USER 'u2023_2'@'%' IDENTIFIED BY '123456'; -- 修改密码案例6 密码加密插件不匹配报错/现象报错类似如下

代码语言:mysql error复制FATAL: unable to connect to MySQL server on host '127.0.0.1', port 3314, aborting...

FATAL: error 2059: Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory或者

代码语言:mysql error复制Caused by: java.io.IOException: caching_sha2_password Auth failed

at com.alibaba.otter.canal.parse.driver.mysql.MysqlConnector.negotiate(MysqlConnector.java:257)

at com.alibaba.otter.canal.parse.driver.mysql.MysqlConnector.connect(MysqlConnector.java:80)

... 4 more分析该类报错均为客户端使用的密码加密策略和server端保存的加密密码所使用的插件不同导致的.

通常为server使用的caching_sha2_password, 而客户端不支持该密码加密插件.

常见于java等比较稳(老)的应用, python等通常都实现了caching_sha2_password加密方式

解决办法更换server端用户的密码加密方式为mysql_native_password 由于mysql 不会保存原密码, 所以密码修改密码加密插件的时候必须修改密码

代码语言:mysql复制 alter user 'u1'@'%' identified with mysql_native_password by 'Ygs123456.'; 也可以修改默认的密码加密插件(需要重启)

代码语言:my.cnf复制 default-authentication-plugin=mysql_native_password更新客户端/应用程序驱动包案例7 无目标数据库的权限报错/现象代码语言:mysql error复制ERROR 1044 (42000): Access denied for user 'u2023_3'@'%' to database 'db2'分析该报错为u2023_3用户无db2数据库的权限

代码语言:shell复制15:09:59 [root@ddcw21 ~]#perror 1044

MySQL error code 1044 (ER_DBACCESS_DENIED_ERROR): Access denied for user '%-.48s'@'%-.64s' to database '%-.192s'解决办法授予该用户目标数据库的权限即可

代码语言:mysql复制grant all on db2.* to 'u2023_3'@'%';案例8 连接错误次数过多若 未设置skip-name-resolve, 则不会产生本错误.

报错/现象报错类似如下

代码语言:mysql error复制ERROR 1129 (HY000): Host 'host' is blocked because of many connection errors分析该报错为连接错误次数过多,MySQL暂时封锁了该主机

代码语言:shell复制15:18:57 [root@ddcw21 ~]#perror 1129

MySQL error code 1129 (ER_HOST_IS_BLOCKED): Host '%-.64s' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'解决办法在服务器上执行'FLUSH HOSTS;'命令或者重启MySQL服务

代码语言:mysql复制FLUSH HOSTS;案例9 连接太多报错/现象报错如下

代码语言:txt复制ERROR 1040 (HY000): Too many connections分析该报错为当前的连接数量 已经超过了@@max_connections+1

mysql会保留一个连接用来管理数据库, 但这个连接也是可以被使用的. 所以实际的最大连接数为@@max_connections+1

代码语言:shell复制09:29:51 [root@ddcw21 ~]#perror 1040

MySQL error code 1040 (ER_CON_COUNT_ERROR): Too many connections解决办法如果可以在应用侧释放连接最好, 但往往不行. 这时就需要增大数据库的连接数了, 但又连不上去.

使用gdb修改mysqld进程参数代码语言:shell复制gdb -p `pidof mysqld` --batch --ex 'print max_connections' --ex 'set max_connections = 102400' #尽可能小的阻塞该命令在shell环境执行, 作用是gdb临时接管mysqld进程并设置max_connections = 102400然后退出gdb.

修改完后就可以登录数据库了. 如有必要, 还需要修改配置文件相应的参数

重启数据库 重启数据库也是会释放连接的. 但是影响较大.酌情考虑.

总结mysql的报错提示都是很明显的, 认真看提示, 麻烦点的就是命令行客户端 会识别一些变量和自动读取一些默认的配置文件. 所以有必要的话, 可以加个--no-defaults

Copyright © 2022 世界杯奖杯_男足世界杯预选赛 - cbatop.com All Rights Reserved.