暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[MYSQL] 导个数据也能遇到一堆坑 ERROR 1118 (42000) ERROR 2013 Out of memory

原创 大大刺猬 2025-03-14
246

导读

最近遇到一个数据导入的坑, 只是简单的把生产数据恢复到测试(mysqldump)

第一阶段

使用 mysql < xxxx.sql 导入数据, 然后遇到报错如下:

ERROR 1118 (42000) at line xxxxx: Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline

这个报错很简单, 就是字段太多了, 导致行长度超过了8126. 官方要求每页能存放至少2条数据, 即每条数据最长为PAGE_SIZE的一半.

The maximum row size, excluding any variable-length columns that are stored off-page, is slightly less than half of a page for 4KB, 8KB, 16KB, and 32KB page sizes. For example, the maximum row size for the default innodb_page_size of 16KB is about 8000 bytes. However, for an InnoDB page size of 64KB, the maximum row size is approximately 16000 bytes. LONGBLOB and LONGTEXT columns must be less than 4GB, and the total row size, including BLOB and TEXT columns, must be less than 4GB.

解决方案也比较简单, 要么把字段调小一点, 要么关闭严格模式

set global innodb_strict_mode=off;

那生产是怎么建表成功的呢? 不会也是关闭严格模式吧. 已经无法考证了.

第二阶段

在关闭严格模式之后, 表创建成功了. 但是又报错

ERROR 2013 (HY000): Lost connection to MySQL server during query

导个数据而已, 连接咋还断开了呢? 咨询了甲方大佬后, 发现是因为挂载的nas网络不稳定导致的, 其实也不是第一次遇到这个问题了.

解决办法也比较简单, 就是把nas上的sql文件拷贝到本地来, 这样就不存在网络问题了.

第三阶段

把sql文件拷贝到本地之后, 再次导入数据, 又遇到了第二阶段的报错.

ERROR 2013 (HY000): Lost connection to MySQL server during query

连接又断开了, 本地数据导入应该不存在网络问题啊. 检查日志发现mysql有启动记录, 但未找到对应的关闭记录, 也就是mysqld被kill了, 谁去kill它呢? 查看/var/log/messages发现了OOM

Mar 14 16:19:56 XXX kernel: Out of memory: Kill process 3140 (mysqld) score 728 or sacrifice child

啊? 为啥会OOM啊, 这可是mysql单独的服务器啊, 检查参数发现 innodb_buffer_pool_size是实际内存的2倍. 这就很秀了! (其它同事发现的这个参数问题)

重新设置innodb_buffer_pool_size之后数据导入正常了.

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论