mysql 8.0 倒入数据报错
今天数据库从5.6切换到8.0测试的时候,倒入数据到8.0版本报错,错误提示:2006 mysql server has gone away。
经过查询得知,导入SQL数据库结构+数据时,如果sql操作时间过长;或者是传送的数据太大(咧如使用insert…values的语句过长);就会报这个错误。登录服务器查看了数据库连接超时的时间默认是8小时,问题应该不是出现在这里。登录老版本数据查看该数据库表的数据,发现该表存放是json的数据格式数据,而且很大,很长。根据这点消息,可以简单的知道问题
这种情况可以通过修改max_allowed_packed的配置参数来避免,修改my.cnf加大max_allowed_packet的值即可。
- 解决办法
找到mysql目录下的my.ini配置文件,加入以下配置或者修改以下配置1
max_allowed_packet=300M
参数详解
- max_allowed_packet: mysql根据配置文件会限制server接受的数据包大小。如果一次插入数据库中的数据太大的话就会失败,官方介绍,
这里我刚开始修改的是200M,还是出现这个错误,然后我看了一下sql文件大小是在260多M,索性我就把这个参数调整为300M,在执行倒入数据ok。这个参数调大不会影响服务器的性能,可以参考官方说明。
mysql 1067 - Invalid default value for
mysql 8.0 在倒入数据的时候提示: 1067 - Invalid default value for ‘xxx_date’。查询结果得知跨版本升级引起的默认值不兼容问题,登录老服务器查看该字段是一个时间字段,是一个datetime类型,而且默认是0,然后看了一下导出的数据数据格式居然是0000-00-00,该类型可能是默认值被限制了,查看 sql_mode。
查看 sql_mode
1 | mysql> show variables like 'sql_mode'; |
NO_ZERO_IN_DATE,NO_ZERO_DATE这两个参数限制时间不能为0
临时修改
1 | mysql> set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'; |
这个我操作了,没成功,我用的永久修改成功导入的。不知道为啥,可能是姿势不对
永久修改
可以直接修改my.cnf文件,在[mysqld]下面添加如下列:
1 | sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |