MySQL server has gone away (BrokenPipeError(32, ‘Broken pipe‘))

时间:2024-07-17 20:18:12

MySQL server has gone away 错误通常与以下几种情况相关:

1.	max_allowed_packet 设置过低:某些查询或数据包超过了 max_allowed_packet 的限制。
2.	连接超时:MySQL 服务器长时间没有收到客户端请求,导致连接超时。
3.	服务器资源问题:MySQL 服务器因内存不足或其他资源问题导致连接中断。

解决方案

1.增加 max_allowed_packet

确保 max_allowed_packet 参数设置足够大,通常可以设置为 64MB 或更高:

在 docker-compose.yml 中:
version: '3'
services:
  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
    command:
      --max_connections=1000
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --default-authentication-plugin=mysql_native_password
      --tls_version="TLSv1.2,TLSv1.3"
      --init-file=/data/application/init.sql
      --max_allowed_packet=64M
    volumes:
      - db_data:/var/lib/mysql
      - ./init.sql:/data/application/init.sql
    ports:
      - "3306:3306"

volumes:
  db_data:
2. 增加 wait_timeout 和 interactive_timeout

增加连接的超时时间,以防止连接因空闲时间过长而断开:

在 docker-compose.yml 中:

version: '3'
services:
  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
    command:
      --max_connections=1000
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --default-authentication-plugin=mysql_native_password
      --tls_version="TLSv1.2,TLSv1.3"
      --init-file=/data/application/init.sql
      --max_allowed_packet=64M
      --wait_timeout=28800
      --interactive_timeout=28800
    volumes:
      - db_data:/var/lib/mysql
      - ./init.sql:/data/application/init.sql
    ports:
      - "3306:3306"

volumes:
  db_data:
3. 检查服务器资源

确保 MySQL 服务器有足够的资源(如内存、CPU)来处理你的查询和连接。可以通过监控工具检查服务器的资源使用情况。

4. 检查应用程序代码

确保应用程序正确管理数据库连接,并且没有长时间运行的事务或未提交的事务。

重新启动 Docker 容器

修改 docker-compose.yml 文件后,重新启动 Docker 容器以使更改生效:

docker-compose down
docker-compose up -d

验证配置

docker exec -it <container_name> mysql -u root -p
SHOW VARIABLES LIKE 'max_allowed_packet';
SHOW VARIABLES LIKE 'wait_timeout';
SHOW VARIABLES LIKE 'interactive_timeout';

确保输出显示的值为你设置的大小和超时时间。

通过以上步骤,你可以解决 MySQL server has gone away 错误,并确保你的 MySQL 服务器能够处理较大的数据包和长时间的连接。