记录一下MySQL出现max_allowed_packet太小的问题
报错信息如下
[2022/03/16-09:43:42] [http-nio-8081-exec-1] [WARN ] [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] : SQL Error: 0, SQLState: S1000
[2022/03/16-09:43:42] [http-nio-8081-exec-1] [ERROR] [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] : Packet for query is too large (10438 > 2048). You can change this value on the server by setting the max_allowed_packet' variable.
[2022/03/16-09:43:42] [http-nio-8081-exec-1] [ERROR] [org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[dispatcherServlet]] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.orm.jpa.JpaSystemException: could not execute statement; nested exception is org.hibernate.exception.GenericJDBCException: could not execute statement] with root cause
com.mysql.jdbc.PacketTooBigException: Packet for query is too large (10438 > 2048). You can change this value on the server by setting the max_allowed_packet' variable.
为什么会出现这个报错原因呢,就是 max_allowed_packet设置的值太小了,出现这个原因是因为我在写博客的时候,由于发送了很多的大的文件,博客发送的字节数据超过了MySQL的最大限制数量,导致server接受的数据包失败。
知道了原因该怎么解决呢,首先就是删除掉docker中MySQL的容器,使用一下命令删除:
// 先使用docker ps查看正在运行的容器
docker ps
// 进入到mysql配置目录,下面这个是我的mysql配置目录
cd /root/docker/my-blog/mysql
// 接下来就是删除运行的mysql容器,不是删除镜像,如果删除镜像,你的数据库没有备份的话,那么你的数据就不存在了,这里大家看自己项目来
// CONTAINER ID 是docker容器的标识,当然你也可以使用NAMES
docker rm -f CONTAINER ID / NAMES
// 之后在mysql的conf文件目录下创建my.cnf
cd conf
vi my.cnf
my.cnf
[mysqld]
#mysql的一些映射地址和配置
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
#log-error = /var/log/mysql/error.log
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
#最大并发数
max_connections = 2000
#最多用户连接数
max_user_connections = 1900
#最大错误连接数
max_connect_errors = 100000
#SQL数据包发送的大小,这里我设置了500M
max_allowed_packet = 500M
#是否对sql语句大小写敏感,1表示不敏感
lower_case_table_names=1
[mysqld]
skip-name-resolve
#mysql5.7之后的不兼容性问题处理
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
之后保存退出,然后再构建我们的docker-compose.yml文件运行mysql的容器。
docker-compose.yml
version: '2.0'
services:
mysql:
container_name: "sob-blog-system-mysql"
network_mode: "host"
environment:
MYSQL_ROOT_PASSWORD: "123456"
MYSQL_USER: 'root'
MYSQL_PASS: '123456'
image: "mysql:5.7.30"
restart: always
ports:
- 3306:3306
volumes:
- "/root/docker/my-blog/mysql/db:/var/lib/mysql"
- "/root/docker/my-blog/mysql/conf:/etc/mysql"
- "/root/docker/my-blog/mysql/log:/var/log/mysql"
这个时候就可以构建容器了。
docker-compose up -d
接下来就是测试一下问题是否解决。我这边发了一篇博客,自己测试发布成功了,测试成功。