SMProxy icon indicating copy to clipboard operation
SMProxy copied to clipboard

[BUG]MySql 链接长时间没用使用时候,执行sql会报:PDO::exec(): MySQL server has gone away

Open david20288 opened this issue 2 years ago • 11 comments

Describe Your Environment (描述你的环境)

  • System: centos 7.2
  • PHP version: 7.3
  • Mysql version: 8.0
  • Swoole version: 4.6
  • SMProxy version: 1.3

How to Reproduce the Problem? (如何重现问题)

MySql 连接池里面的链接长时间没用使用时候,执行sql会报:PDO::exec(): MySQL server has gone away

More Information (更多信息)

image

...

david20288 avatar Aug 02 '21 01:08 david20288

是否在使用链接的时候加入 mysql_ping 机制?

david20288 avatar Aug 02 '21 01:08 david20288

这块需要进一步排查,理论上断开连接后会自动清理掉的,再次请求会重新生成连接。

louislivi avatar Aug 02 '21 01:08 louislivi

这块需要进一步排查,理论上断开连接后会自动清理掉的,再次请求会重新生成连接。 image 您说的是这个清理吗? 但是这个只能判断根据swoole 文档:https://wiki.swoole.com/#/client?id=isconnected isConnected 并不能判断 和mysql server 断开连接了

david20288 avatar Aug 02 '21 07:08 david20288

不是,是在mysql服务端断开时会收到close事件进行处理 src/MysqlProxy.php:297

    /**
     * close.
     *
     * @param Client $cli
     */
    public function onClientClose(\Swoole\Coroutine\Client $cli)
    {
        MySQLPool::destruct($cli, $this->connName);
    }

louislivi avatar Aug 02 '21 08:08 louislivi

不是,是在mysql服务端断开时会收到close事件进行处理 src/MysqlProxy.php:297

    /**
     * close.
     *
     * @param Client $cli
     */
    public function onClientClose(\Swoole\Coroutine\Client $cli)
    {
        MySQLPool::destruct($cli, $this->connName);
    }

项目还再维护吗?

david20288 avatar Aug 05 '21 03:08 david20288

近期在规划进行一次大的版本迭代,针对协议底层进行优化。

louislivi avatar Aug 05 '21 04:08 louislivi

近期在规划进行一次大的版本迭代,针对协议底层进行优化。

这几天我观察日志,基本上八个小时没有请求的话,mysql server 就会断开链接(mysql timeout 配置为八个小时),所以应该有个机制检测链接是否可用

david20288 avatar Aug 06 '21 03:08 david20288

近期在规划进行一次大的版本迭代,针对协议底层进行优化。

这几天我观察日志,基本上八个小时没有请求的话,mysql server 就会断开链接(mysql timeout 配置为八个小时),所以应该有个机制检测链接是否可用

所以是斷開之後, 有新的query / execute, 不會再重新連接了?

gordonlhw avatar Aug 06 '21 12:08 gordonlhw

近期在规划进行一次大的版本迭代,针对协议底层进行优化。

这几天我观察日志,基本上八个小时没有请求的话,mysql server 就会断开链接(mysql timeout 配置为八个小时),所以应该有个机制检测链接是否可用

所以是斷開之後, 有新的query / execute, 不會再重新連接

david20288 avatar Aug 09 '21 09:08 david20288

近期在规划进行一次大的版本迭代,针对协议底层进行优化。

这几天我观察日志,基本上八个小时没有请求的话,mysql server 就会断开链接(mysql timeout 配置为八个小时),所以应该有个机制检测链接是否可用

所以是斷開之後, 有新的query / execute, 不會再重新連接了? 应该用了不可用的链接,然后才重新连接了。

david20288 avatar Aug 09 '21 09:08 david20288

+1,长时间不使用,我这也会断开连接

shuqingzai avatar Oct 08 '21 03:10 shuqingzai