案例1 端口不通/进程没有启动
错误信息:
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). 如果要经过其它网络设备, 也需要添加相应的规则.
案例2 网络不通
报错信息如下:
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地址正确. 确保路由配置正确(非直连请配置静态路由或者网关)
案例3 密码过期
登录mysql后,无法执行sql, 报错如下
ERROR 1820 (HY000): 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'; -- 修改当前用户的密码案例4 密码不对
报错信息如下:
ERROR 1045 (28000): Access denied for user 'u2023_2'@'192.168.101.21' (using password: YES)
此报错为密码不对.
解决方法
使用正确的密码即可. 若忘记密码,可直接修改密码.
ALTER USER 'u2023_2'@'%' IDENTIFIED BY '123456'; -- 修改密码案例5 密码加密插件不匹配
报错类似如下:
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加密方式
解决办法
1. 更换server端用户的密码加密方式为mysql_native_password
由于mysql 不会保存原密码, 所以密码修改密码加密插件的时候必须修改密码
alter user 'u1'@'%' identified with mysql_native_password by 'Ygs123456.';
也可以修改默认的密码加密插件(需要重启)
default-authentication-plugin=mysql_native_password
2. 更新客户端/应用程序驱动包
案例6 无目标数据库的权限
错误信息
ERROR 1044 (42000): Access denied for user 'u2023_3'@'%' to database 'db2'
该报错为u2023_3用户无db2数据库的权限
解决办法
授予该用户目标数据库的权限即可
grant all on db2.* to 'u2023_3'@'%';案例7 连接错误次数过多
错误信息如下:
ERROR 1129 (HY000): Host 'host' is blocked because of many connection errors
若 未设置skip-name-resolve, 则不会产生本错误。该报错为连接错误次数过多,MySQL暂时封锁了该主机
解决办法
在服务器上执行’FLUSH HOSTS;'命令或者重启MySQL服务
FLUSH HOSTS;案例8 连接太多
错误信息如下:
ERROR 1040 (HY000): Too many connections
该报错为当前的连接数量 已经超过了@@max_connections+1
mysql会保留一个连接用来管理数据库, 但这个连接也是可以被使用的. 所以实际的最大连接数为@@max_connections+1
解决办法
如果可以在应用侧释放连接最好, 但往往不行. 这时就需要增大数据库的连接数了, 但又连不上去
1. 使用gdb修改mysqld进程参数
gdb -p `pidof mysqld` --batch --ex 'print max_connections' --ex 'set max_connections = 102400' #尽可能小的阻塞
该命令在shell环境执行, 作用是gdb临时接管mysqld进程并设置max_connections = 102400然后退出gdb.
修改完后就可以登录数据库了. 如有必要, 还需要修改配置文件相应的参数
2. 重启数据库
重启数据库也是会释放连接的. 但是影响较大.酌情考虑.
总结:
mysql的报错提示都是很明显的, 认真看提示, 麻烦点的就是命令行客户端 会识别一些变量和自动读取一些默认的配置文件. 所以有必要的话, 可以加个--no-defaults
领取专属 10元无门槛券
私享最新 技术干货