本人有点啰嗦,如果要看解决办法可直接拉到末尾。

问题背景

发现线上数据库某个表连接数过高,因此开始排查原因。
其实原因很简单,某精神小伙儿为了取到已经查询到的结果,居然用pluck再查一次,查完之后foreach后再在循环里去查n次。。。这个分分钟就改了,问题是咋个验证改好了呢?
其实验证只需要连接数改小就可以了,但是之前我们都是直接连的测试库,那么多人在用,我连接数改小了首先是会影响别人使用,其次是我也没法确认就是因为这个接口导致的连接数不够,因此肯定是要使用本地库的了。

show variables like ‘%max_connection%’; 查看最大连接数
set global max_connections=1000; 重新设置最大连接数

于是一大堆关联数据先导一导,然后发现连不上本地数据库。。。当然是连不上啊,我之前在win10上装的数据库,项目通过swoole运行在wsl的linux上。。。
好嘛,问题很明确,数据已经导到localhost了,我不可能再去导一次,那么就是想办法连上了。
首先是ubuntu安装mysql。这就不太用说了,全网都是教程,但是可能会有一些错误,报啥错就直接搜,没啥好说的。
但一通操作后,数据库也安上了,所有的报错也解决了,却还是这样:

mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1698 (28000): Access denied for user ‘root’@‘localhost’

首先确保用户名密码的确是对的,但是连不上。。。于是我想是否需要设置mysql,执行一下命令可以让mysql接受来自其他ip的连接请求:

use mysql;
update mysql.user set host = ‘%’ where user = ‘root’;

当然,其实可能会报错,可以查下是不是有这一行了

select user, host from user;

但悲剧的是,我改了还是没用。。。于是我想,是否是需要用ip连接?于是我查询了下ip,我尝试过windows的ipconfig里所有ip和linux ifconfig里所有ip,结果都是失败的。。。
于是再百度下,对于wsl来说,查询主机的ip不是通过ifconfig来的,这里参考WSL2 的一些网络访问问题
首先使用:

ip route | grep default | awk '{print $3}'
//或者
cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }'

可以拿到主机ip。-h时使用此命令返回的ip,然后打开windows安全中心公用网络的防火墙,就可以联通啦!

更多推荐