mongodump执行触发panic问题求助(send on closed channel)
解决mongodump
panic: send on closed channel 错误的思路 环境信息
- MongoDB版本:4.2.11(副本集配置)
- mongodump版本:
mongodump version: r4.2.24 git version: 5e4ec1d24431fcdd28b579a024c5c801b8cde4e2 Go version: go1.12.17 os: linux arch: amd64 compiler: gc
- 执行命令:
mongodump --quiet --dumpDbUsersAndRoles --authenticationDatabase=admin --authenticationMechanism=SCRAM-SHA-256 --username <USERNAME> --password <PASSWORD> --host <HOST> --db sample-database --archive | aws s3 cp - s3://samplbucket/samplefld
- 错误特征:每导出6个数据库触发一次panic,无固定触发数据库,堆栈指向
archive.(*MuxIn).Open方法的通道发送错误。
解决建议
对齐mongodump与MongoDB服务端版本:当前mongodump版本(4.2.24)与服务端(4.2.11)小版本差异较大,工具与服务端的兼容性问题可能引发内部并发通道异常。将mongodump降级至4.2.11版本,保持与服务端版本完全一致后重试。
取消管道直接输出,改用本地临时文件中转:管道传输过程中,AWS S3端的连接波动、IO中断可能导致mongodump的归档输出通道被意外关闭,触发panic。修改流程为先导出到本地临时文件,再上传至S3:
# 导出到本地临时文件 mongodump --quiet --dumpDbUsersAndRoles --authenticationDatabase=admin --authenticationMechanism=SCRAM-SHA-256 --username <USERNAME> --password <PASSWORD> --host <HOST> --db sample-database --archive=/tmp/sample-db.archive # 上传至S3 aws s3 cp /tmp/sample-db.archive s3://samplbucket/samplefld # 清理临时文件 rm /tmp/sample-db.archive
- 降低mongodump并发数:默认的并发导出设置可能导致内部通道竞争,引发提前关闭的问题。添加
--numParallelCollections=1参数强制单并发导出,减少并发资源冲突:
mongodump --quiet --numParallelCollections=1 --dumpDbUsersAndRoles --authenticationDatabase=admin --authenticationMechanism=SCRAM-SHA-256 --username <USERNAME> --password <PASSWORD> --host <HOST> --db sample-database --archive | aws s3 cp - s3://samplbucket/samplefld
启用详细日志排查前置异常:去掉
--quiet参数,添加--verbose获取mongodump的详细运行日志,查看panic发生前是否存在连接断开、超时、IO错误等信息,定位是否由网络不稳定导致通道关闭。单个数据库独立导出:如果是批量导出多个数据库,改用脚本循环逐个执行mongodump命令,每个数据库对应独立的mongodump进程,避免单个进程处理多个库时出现的资源泄漏或通道状态异常。
内容的提问来源于stack exchange,提问作者BDF
相关产品推荐
相关产品推荐

