我正在办公室运行一台服务器来处理一些文件,并将结果报告给远程MySQL服务器。

文件处理需要一段时间,进程中途死亡,并出现以下错误:

2006, MySQL server has gone away

我听说过MySQL的设置,wait_timeout,但是我需要在我办公室的服务器或远程MySQL服务器上更改它吗?


当前回答

不太可能的情况是,在客户端和服务器之间有一个防火墙,强制TCP重置到连接中。

我遇到了这个问题,我发现我们公司的F5防火墙被配置为终止空闲超过5分钟的非活动会话。

再说一次,这是不太可能发生的情况。

其他回答

在MAMP(非专业版)中我添加了

--max_allowed_packet=268435456

到 ...\MAMP\bin\startMysql.sh

更多细节请点击这里

在docker-compose.yml中添加以下设置时,我也遇到了同样的问题:

db:
    image: mysql:8.0
    command: --wait_timeout=800 --max_allowed_packet=256M --character-set-server=utf8 --collation-server=utf8_general_ci --default-authentication-plugin=mysql_native_password
    volumes:
      - ./docker/mysql/data:/var/lib/mysql
      - ./docker/mysql/dump:/docker-entrypoint-initdb.d
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}

对我来说,它有助于修复一个innodb表的损坏的索引树。我用这个命令本地化了这样一个表

mysqlcheck -uroot --databases databaseName 

结果

mysqlcheck: Got error: 2013: Lost connection to MySQL server during query when executing 'CHECK TABLE ...

如下所示,我只能从mysqld日志/var/log/mysqld.log中看到哪个表造成了问题。

FIL_PAGE_PREV links 2021-08-25T14:05:22.182328Z 2 [ERROR] InnoDB: Corruption of an index tree: table `database`.`tableName` index `PRIMARY`, father ptr page no 1592, child page no 1234'

mysqlcheck命令并没有修复它,但帮助揭示了它。 最终,我通过mysql命令行中一个常规的mysql命令来修复它

OPTIMIZE table theCorruptedTableNameMentionedAboveInTheMysqld.log

我的问题是我为生产连接添加了SSL配置,这破坏了我的本地环境。很简单,但可能会帮助其他人意识到他们的问题。

我遇到过这种情况很多次,我通常发现答案是max_allowed_packet的默认设置非常低。

在/etc/my.cnf(在[mysqld]下)中将它提升到8或16M通常可以修复它。(MySql 5.7的默认值是4194304,也就是4MB。)

[mysqld]
max_allowed_packet=16M

注意:如果该行不存在,只需创建该行

注意:这可以在服务器运行时设置。

注意:在Windows上,您可能需要使用ANSI而不是UTF-8编码保存my.ini或my.cnf文件。

使用set global max_allowed_packet=104857600。这将它设置为100MB。