关于启动服务端口被占用但是查看该端口并没有被监听的情况
Posted On 2018年8月15日
今天重新启动mysql服务的时候,提示3306端口被占用. 通过如下命令查看,发现并没有程序占用3306端口.
netstat -lnp | grep 3306 #通过netstat 命令查看 lsof -i:3306 通过lsof命令也可以查看使用3306 端口的句柄 但是都没有发现什么有用线索, 但是实际上重启mysql就是提示端口被占用
于是乎, 放大查找范围. netstat -anp | grep 3306. 发现有一个tcp链接, 是established状态. 从本机的某个端口链接到了本地的3306端口.
tcp localhost:3306 localhost:58883 established (非监听状态,仅是一个tcp链接)
猜测,是因为自己的一个服务已经连接到了数据库3306端口,且建立了链接,并没有断开. 此时, 数据库是因为异常原因导致的数据库关闭. 虽然数据库进程(服务)已经挂掉了, 但是那个奇怪的服务之前建立的链接仍没有被释放掉(close)掉. 所以就看到了这种奇怪的情况, 即mysql服务已经停止,且已经没有在监听端口号3306, 但是因为一个其他的链接仍链接在3306上, 导致启动服务的时候提示端口被占用.
解决方法, 把建立链接的那个服务停止或者重启后. 那个链接丢失了, 这样重启mysql服务就没有问题了.
所以, 端口被占用并不见得是bind的端口被占用, 同样如果存在此端口的established(time wait)的端口, 那么要bind该端口同样会提示端口被占用. 备注: 通过实际发现, time wait的状态的链接也不算释放. 必须close掉才可以.
此篇文章已被阅读2228 次