MySQL LOAD INFILE由于oom杀死了mysqld

时间:2019-01-19 18:11:18

标签: mysql

据我所知,使用LOAD DATA INFILE最终会消耗大量RAM。我有一个带有mysql的docker --memory 500m容器,用于限制内存。如果我尝试在该容器中导入1.2G文件(约150万行),则mysqld进程将被终止。

Jan 19 11:36:52 archlinux kernel: mysqld invoked oom-killer: gfp_mask=0x6201ca(GFP_HIGHUSER_MOVABLE|__GFP_WRITE), nodemask=(null), order=0, oom_score_adj=0
...
Jan 19 11:36:52 archlinux kernel: Task in /docker/1fb0132efe95e60506ee8a7f5bb9dbf9c5720e98c56e59ac2d799aa015bfc9ab killed as a result of limit of /docker/1fb0132efe95e60506ee8a7f5bb9dbf9c5720e98c56e59ac2d799aa01>
Jan 19 11:36:52 archlinux kernel: memory: usage 512000kB, limit 512000kB, failcnt 60566
...
Memory cgroup out of memory: Kill process 15003 (mysqld) score 1040 or sacrifice child

如果我销毁了该容器(和关联的数据),并尝试在同一文件上使用LOAD DATA INFILE的RAM重新尝试相同的750m,则一切正常。

该行为是可重复的。提供更多的RAM,重新运行时导入可以正常工作。拿走RAM,重新运行导入将被杀死。

在像这样将数据导入MySQL时,是否似乎有一种开箱即用的方式来解决这个问题?也许是我缺少的批处理模式或某种标记?

我认为唯一可能与他们有关的modifierLOW_PRIORITY,但是经过测试,在这种情况下它似乎并不相关或没有帮助。

我意识到有一些简单的解决方案,例如"give it more RAM",“请勿为此使用docker”,"split up the input file"等,而且对于所需的最低RAM水平,我可能不切实际。 mysqld,但在走其他道路之前,我想看看是否有针对LOAD DATA INFILE的内置解决方案可以处理内存受限的大型导入文件,即使这意味着运行速度较慢。

我今天给盒子1000m很简单,但是我正在考虑要加载12G文件的那天,发现我需要给盒子10倍的RAM 。也许到那时我只是必须分解文件,或者可能只是一个最小基准RAM mysqld,对于超过n的任何大导入千兆字节,但我希望其他人以前也遇到过这种情况,并且知道一种以某种方式限制LOAD DATA INFILE的方法。

0 个答案:

没有答案