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 服务器能够处理较大的数据包和长时间的连接。