使用mongoimport导入CSV数据时遇InterruptedAtShutdown错误求助
排查mongoimport导入时出现InterruptedAtShutdown错误的方案
问题场景
尝试用mongoimport导入700万条CSV记录到已有800万数据的MongoDB集合,为检测重复邮箱,使用了--mode upsert --upsertFields email参数,通过NodeJS的shell-exec包执行命令时出现如下错误:
2022-10-20T19:39:52.847+0100 connected to: mongodb://127.0.0.1:27017/
2022-10-20T19:39:55.849+0100 […] notitia.usb2bs 1.09MB/1.22GB (0.1%)
2022-10-20T19:39:58.849+0100 […] notitia.usb2bs 1.09MB/1.22GB (0.1%)
2022-10-20T19:40:01.240+0100 […] notitia.usb2bs 1.09MB/1.22GB (0.1%)
2022-10-20T19:40:01.240+0100 Failed: (InterruptedAtShutdown) interrupted at shutdown
2022-10-20T19:40:01.240+0100 0 document(s) imported successfully. 0 document(s) failed to import.
排查步骤
- 先确认
email字段是否有唯一索引:没有索引的情况下,upsert操作会进行全表扫描,速度极慢,大概率导致进程长时间无响应被终止。执行以下命令创建索引:db.your_collection_name.createIndex({email: 1}, {unique: true}) - 检查NodeJS进程状态:shell-exec调用的子进程可能因为Node主进程被kill、内存不足崩溃或超时设置触发中断。可以改用Node原生的
child_process.spawn替代shell-exec,手动监听进程信号,排查是否主进程异常退出;同时检查Node应用的日志,看有没有内存溢出或未捕获的错误。 - 查看MongoDB服务日志:确认导入过程中MongoDB是否重启、崩溃或连接中断。日志路径一般是
/var/log/mongodb/mongod.log(Linux),检查里面有没有OOM(内存不足)、连接断开或服务重启的记录。 - 优化mongoimport参数:
- 调整批量大小:添加
--batchSize 5000(根据内存情况调整),减少IO交互次数; - 启用多线程:添加
--numInsertionWorkers 4(根据CPU核心数设置,比如核心数的一半),提升导入速度; - 拆分CSV文件:把1.22GB的大文件拆成多个小文件(比如每个100MB),分批导入,降低单次导入的资源压力。
- 调整批量大小:添加
- 检查系统资源:
- 内存:用
free -h查看内存使用情况,如果剩余内存不足,系统可能会杀死占用内存高的进程(mongoimport或MongoDB);查看系统日志/var/log/syslog(Linux)有没有OOM Killer相关的记录; - 磁盘IO:用
iostat或iotop检查磁盘读写负载,如果磁盘IO过高,会导致导入卡住,长时间无响应被中断。
- 内存:用
内容的提问来源于stack exchange,提问作者Ahsan Hasan
相关产品推荐
相关产品推荐

