MongoDB PowerShell备份脚本未生成备份文件求助
MongoDB备份脚本故障排查与修复
问题根源分析
- 数据库列表解析错误:
mongo --eval "db.getMongo().getDBNames()"返回的是JSON格式数组(如["admin","local"]),直接赋值给$dbs会导致遍历的是字符串片段而非真实数据库名,mongodump无法识别无效名称,自然无备份产出。 - try/catch未生效:mongodump是外部命令,PowerShell默认不会将其非零退出码视为异常,即使备份失败,脚本仍会记录“导出成功”,造成日志与实际结果不符。
- 目录操作逻辑冗余:先创建备份目录再删除重建的操作完全多余,且可能干扰后续路径指向。
- 无错误捕获机制:未收集mongodump的错误输出,无法定位具体失败原因。
修复后的脚本
# 定义备份目录与日志路径 $backupDirectory = "C:\MongoDBBackups" $logFile = Join-Path -Path $backupDirectory -ChildPath "log.log" # 确保备份目录存在 if (!(Test-Path -Path $backupDirectory)) { New-Item -ItemType Directory -Path $backupDirectory | Out-Null } # 正确获取并解析数据库列表 $dbsJson = mongo --quiet --host 127.0.0.1:27017 --eval "JSON.stringify(db.getMongo().getDBNames())" $dbs = ConvertFrom-Json -InputObject $dbsJson foreach ($db in $dbs) { # 可选:跳过MongoDB系统数据库(admin/local/config) if ($db -in @("admin", "local", "config")) { Write-Output "跳过系统数据库: $db" | Out-File -FilePath $logFile -Append continue } # 处理数据库名中的非法字符 $safeDbName = $db -replace '[/\\:*?\"<>|]','' $backupPath = Join-Path -Path $backupDirectory -ChildPath $safeDbName try { # 执行备份并捕获错误输出 mongodump --db $db --out $backupPath 2>&1 # 检查外部命令退出码,非0则抛出异常 if ($LASTEXITCODE -ne 0) { throw "mongodump执行失败,退出码: $LASTEXITCODE" } Write-Output "成功导出数据库: $db" | Out-File -FilePath $logFile -Append } catch { $errorMessage = $_.Exception.Message Write-Output "导出数据库 $db 失败: $errorMessage" | Out-File -FilePath $logFile -Append } } Write-Output "所有数据库备份任务已完成" | Out-File -FilePath $logFile -Append
关键修复点说明
- JSON解析数据库列表:用
JSON.stringify和ConvertFrom-Json将MongoDB返回的数组转为PowerShell可识别的数组,确保遍历的是有效数据库名。 - 捕获外部命令错误:通过
$LASTEXITCODE判断mongodump执行状态,手动触发异常进入catch块,记录真实错误信息。 - 路径安全处理:使用
Join-Path拼接路径,避免手动拼接导致的格式错误;提前过滤数据库名中的非法字符,避免创建无效路径。 - 错误输出合并:
2>&1将mongodump的错误输出重定向到标准输出,便于在日志中查看具体失败原因。
内容的提问来源于stack exchange,提问作者Adil15
相关产品推荐
相关产品推荐

