【1】Error:MySQL server has gone away
背景:将外部sql文件导入数据库。
解决办法:
Linux下修改my.conf;Windows下修改my-default.ini。
添加(修改)如下配置:
wait_timeout=2880000 interactive_timeout = 2880000 max_allowed_packet = 256M
如果使用命令方式,只在当前会话有效,建议修改配置:
show global variables like 'max_allowed_packet'; set global max_allowed_packet=268435456; set global max_allowed_packet=1024*1024*256;
使用set global命令修改 max_allowed_packet 的值,重启mysql后会失效,还原为默认值。
如果不知道如何修改MySQL配置文件,在运行sql文件时,可以使用命令方式。
【2】Packet for query is too large
异常如下所示:
Packet for query is too large (1238 > 1024). You can change this value on the server by setting the max_allowed_packet' variable. at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3683) ~[mysql-connector-java-5.1.47.jar:5.1.47]
解决方案
Linux下修改my.cnf文件在[mysqld]下添加如下配置:
max_allowed_packet = 100M
如果是windows下则修改my.ini文件。
【3】sql_mode为ONLY_FULL_GROUP_BY的问题
In aggregated query without GROUP BY, expression #32 of SELECT list contains nonaggregated columnXXXXX ' this is incompatible with sql_mode=only_full_group_by
这种模式的官方解释:ONLY_FULL_GROUP_BY是MySQL数据库提供的一个sql_mode, 通过这个 sql_mode 来保证, SQL语句 “分组求最值” 合法性的检查. 这种模式采用了与 Oracle、DB2 等数据库的处理方式。即不允许 select target list 中出现语义不明确的列。
对于用到 GROUP BY 的 select 语句, 查出来的列必须是 group by 后面声明的列, 或者是聚合函数里面的列有这样一个数据库的表。
临时方案-会话有效
set @@GLOBAL.sql_mode=''; set sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
永久方案
mysql的配置文件中[mysqld]
下添加如下配置
sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
【4】数据迁移自动去除转义问题
默认情况下,MySQL会自动给你去除转义的,这在有些情况下会出错。此时我们就可以给sql_mode添加上NO_BACKSLASH_ESCAPES
来避免。如果SQL是通过导入执行脚本的,那么设置全局级别。
-- 查询sql_mode配置 SELECT @@sql_mode; -- 修改会话级别的sql_mode SET SESSION sql_mode = '...,NO_BACKSLASH_ESCAPES'; -- 修改全局级别的sql_mode SET GLOBAL sql_mode = '...,NO_BACKSLASH_ESCAPES';
【8】Windows下MySQL8.0.31突然启动不了 1053错误
一直在正常使用,早上打开电脑突然发现MySQL服务启动不了,一直提示1053错误。因为没有任何异常操作,故而推测可能与电脑系统更新有关。
这里给出自己实践的解决方案。服务-找到MySQL服务0右键属性-登录:
我这边是Janus(本机管理员)可以正常启动。