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.7restart: alwaysenvironment:MYSQL_ROOT_PASSWORD: examplecommand:--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=64Mvolumes:- db_data:/var/lib/mysql- ./init.sql:/data/application/init.sqlports:- "3306:3306"volumes:db_data:
2. 增加 wait_timeout 和 interactive_timeout
增加连接的超时时间,以防止连接因空闲时间过长而断开:
在 docker-compose.yml 中:
version: '3'
services:db:image: mysql:5.7restart: alwaysenvironment:MYSQL_ROOT_PASSWORD: examplecommand:--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=28800volumes:- db_data:/var/lib/mysql- ./init.sql:/data/application/init.sqlports:- "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 服务器能够处理较大的数据包和长时间的连接。