MySQL LOAD DATA INFILE 之后不会清除内存

Posted

技术标签:

【中文标题】MySQL LOAD DATA INFILE 之后不会清除内存【英文标题】:MySQL LOAD DATA INFILE does not clear memory afterwards 【发布时间】:2020-12-01 21:54:04 【问题描述】:

我正在创建一个 CSV 导入器,它将 CSV 文件加载到 MariaDB 10.3.23 数据库中。为此,我在带有 php 7.4 环境的 Laravel 7 中使用以下代码:

$query = <<<eof
        LOAD DATA LOCAL INFILE '$this->filePath'
        INTO TABLE `$tableName`
        $characterSet
        FIELDS TERMINATED BY '$this->delimiter'
        ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES;
eof;

DB::connection()->getpdo()->exec($query);

我正在使用 ploi.io 来部署和监控我的网站,它在监控页面上显示以下屏幕:

当我重新启动 MariaDB 服务时,RAM-display-line 为 15%,但每当我开始新的导入(因此是新的 LOAD DATA INFILE)时,使用的 RAM 量就会增加(这不是奇怪),并保持不变。 RAM 行的高度差异是由于 CSV 文件大小的差异造成的。看起来它完成了数据加载,并且没有清空之后用于它的内存。

关于如何解决这个问题的任何想法?

ps。我不擅长 infra/devops,所以如果你们需要更多信息,请告诉我。

【问题讨论】:

这是否会导致问题,例如当您要导入下一个文件时,mysql会耗尽内存?因为如果这不是问题,那么我不会花太多时间来解决它。 操作可能被缓存了。当需要其他事情时,内存可能会被清除。垃圾收集是一个非常昂贵的过程,除非真的有必要,否则软件通常会推迟这样做。 jep,最终会导致超出内存限制的错误,会导致mysql崩溃。每次我做新的导入(可能超过 100 个),RAM 都会堆积起来,直到手动重启 mysql 崩溃时才会被清除。 有没有办法不缓存 LOAD DATA INFILE?在我看来,这是每个文件的一次性操作(“将所有记录放入数据库”)。 【参考方案1】:

SHOW TABLE STATUS LIKE 'the_file_name';

然后添加 Data_length + Index_length。这与消耗但未释放的空间量有关吗?

innodb_file_per_table 的值是多少?

【讨论】:

由于某种原因,当我查找名为“productfeed.csv”的文件并使用SHOW TABLE STATUS LIKE 'productfeed'; 时,它没有找到文件名。此外,innodb_file_per_table 的值是 1。这有帮助吗? :D

以上是关于MySQL LOAD DATA INFILE 之后不会清除内存的主要内容,如果未能解决你的问题,请参考以下文章

mysql导入数据load data infile用法

MySQL:启用 LOAD DATA LOCAL INFILE

MySQL通过 LOAD DATA INFILE 批量导入数据

MySql LOAD DATA INFILE 以逗号失败

mysql load data local infile问题

MySQL 之 LOAD DATA INFILE 快速导入数据