前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[MYSQL] mysql常见连接失败问题汇总

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

原创
作者头像
大大刺猬
发布2024-11-14 16:12:26
760
发布2024-11-14 16:12:26
举报
文章被收录于专栏:大大刺猬

导读

今天遇到个离谱的问题, 是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加密方式

解决办法

  1. 更换server端用户的密码加密方式为mysql_native_password

由于mysql 不会保存原密码, 所以密码修改密码加密插件的时候必须修改密码

代码语言:mysql
复制
   alter user 'u1'@'%' identified with mysql_native_password by 'Ygs123456.'; 

也可以修改默认的密码加密插件(需要重启)

代码语言:my.cnf
复制
   default-authentication-plugin=mysql_native_password
  1. 更新客户端/应用程序驱动包

案例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

解决办法

如果可以在应用侧释放连接最好, 但往往不行. 这时就需要增大数据库的连接数了, 但又连不上去.

  1. 使用gdb修改mysqld进程参数
代码语言:shell
复制
gdb -p `pidof mysqld` --batch --ex 'print max_connections' --ex 'set max_connections = 102400' #尽可能小的阻塞

该命令在shell环境执行, 作用是gdb临时接管mysqld进程并设置max_connections = 102400然后退出gdb.

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

  1. 重启数据库

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

总结

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 导读
  • 案例1 IP,账号,密码均正确 却无法连接
    • 现象
      • 分析
        • 解决办法
        • 案例2 端口不通/进程没有启动
          • 现象
            • 分析
              • 解决办法
              • 案例3 网络不通
                • 报错/现象
                  • 分析
                    • 解决办法
                    • 案例4 密码过期
                      • 报错/现象
                        • 分析
                          • 解决办法
                          • 案例5 密码不对
                            • 报错/现象
                              • 分析
                                • 解决办法
                                • 案例6 密码加密插件不匹配
                                  • 报错/现象
                                    • 分析
                                      • 解决办法
                                      • 案例7 无目标数据库的权限
                                        • 报错/现象
                                          • 分析
                                            • 解决办法
                                              • 报错/现象
                                          • 案例8 连接错误次数过多
                                            • 分析
                                              • 解决办法
                                              • 案例9 连接太多
                                                • 报错/现象
                                                  • 分析
                                                    • 解决办法
                                                    • 总结
                                                    相关产品与服务
                                                    云数据库 MySQL
                                                    腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
                                                    领券
                                                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档