今天遇到个离谱的问题, 是IP,账号密码均正确的情况下, 无法连接数据库. 所以来水一篇mysql连接相关的文章.
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的时候是中文的....)
ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.101.31' (111)
此报错为, 目标mysql的端口不通,比如防火墙或者selinux限制了, 或者没有启动mysqld进程.
13:36:36 [root@ddcw21 ~]#perror 111
OS error code 111: Connection refused
确保目标Mysqld已启动. 确保目标端口能通(关闭防火墙和selinux). 如果要经过其它网络设备, 也需要添加相应的规则.
ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.101.33' (113)
这个报错和上面的类似
此报错为路由不通, 即没有到达目标IP的路由
13:36:16 [root@ddcw21 ~]#perror 113
OS error code 113: No route to host
确保IP地址正确. 确保路由配置正确(非直连请配置静态路由或者网关)
登录mysql后,无法执行sql, 报错如下
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement
此报错为用户密码过期.
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
修改密码即可
ALTER USER 'u2023_2'@'%' IDENTIFIED BY '123456';
-- ALTER USER current_user() IDENTIFIED BY '123456'; -- 修改当前用户的密码
ERROR 1045 (28000): Access denied for user 'u2023_2'@'192.168.101.21' (using password: YES)
此报错为密码不对.
13:47:19 [root@ddcw21 ~]#perror 1045
MySQL error code 1045 (ER_ACCESS_DENIED_ERROR): Access denied for user '%-.48s'@'%-.64s' (using password: %s)
使用正确的密码即可. 若忘记密码,可直接修改密码.
ALTER USER 'u2023_2'@'%' IDENTIFIED BY '123456'; -- 修改密码
报错类似如下
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
或者
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加密方式
由于mysql 不会保存原密码, 所以密码修改密码加密插件的时候必须修改密码
alter user 'u1'@'%' identified with mysql_native_password by 'Ygs123456.';
也可以修改默认的密码加密插件(需要重启)
default-authentication-plugin=mysql_native_password
ERROR 1044 (42000): Access denied for user 'u2023_3'@'%' to database 'db2'
该报错为u2023_3用户无db2数据库的权限
15:09:59 [root@ddcw21 ~]#perror 1044
MySQL error code 1044 (ER_DBACCESS_DENIED_ERROR): Access denied for user '%-.48s'@'%-.64s' to database '%-.192s'
授予该用户目标数据库的权限即可
grant all on db2.* to 'u2023_3'@'%';
若 未设置skip-name-resolve
, 则不会产生本错误.
报错类似如下
ERROR 1129 (HY000): Host 'host' is blocked because of many connection errors
该报错为连接错误次数过多,MySQL暂时封锁了该主机
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服务
FLUSH HOSTS;
报错如下
ERROR 1040 (HY000): Too many connections
该报错为当前的连接数量 已经超过了@@max_connections+1
mysql会保留一个连接用来管理数据库, 但这个连接也是可以被使用的. 所以实际的最大连接数为@@max_connections+1
09:29:51 [root@ddcw21 ~]#perror 1040
MySQL error code 1040 (ER_CON_COUNT_ERROR): Too many connections
如果可以在应用侧释放连接最好, 但往往不行. 这时就需要增大数据库的连接数了, 但又连不上去.
gdb -p `pidof mysqld` --batch --ex 'print max_connections' --ex 'set max_connections = 102400' #尽可能小的阻塞
该命令在shell环境执行, 作用是gdb临时接管mysqld进程并设置max_connections = 102400然后退出gdb.
修改完后就可以登录数据库了. 如有必要, 还需要修改配置文件相应的参数
重启数据库也是会释放连接的. 但是影响较大.酌情考虑.
mysql的报错提示都是很明显的, 认真看提示, 麻烦点的就是命令行客户端 会识别一些变量和自动读取一些默认的配置文件. 所以有必要的话, 可以加个--no-defaults
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。