automongobackup的例外,但脚本完成

我正在使用automongobackup来自动备份mongodb

从脚本输出(到STDERR)有以下例外(但备份完成,转储文件被创build)

###### WARNING ###### STDERR written to during mongodump execution. The backup probably succeeded, as mongodump sometimes writes to STDERR, but you may wish to scan the error log below: exception: connect failed exception: connect failed exception: connect failed exception: connect failed exception: HostAndPort: bad port # exception: connect failed exception: connect failed exception: connect failed exception: connect failed exception: connect failed exception: connect failed 

我知道主机和端口是正确的。

如果我运行mongodump --host=127.0.0.1:27017 --journal (这是来自automongobackup基于选项集和我读取的src代码的有效命令),一切运行干净没有任何错误报告和转储文件创build如预期。

为什么automongobackup报告连接错误,即使它创build了转储文件,但是直接调用mongodump却不行?

  • Debian 6.0 Lenny(来自Linode)image:Latest 3.2(3.2.1-x86_64-linode23))
  • AutoMongoBackup VER 0.9
  • mongodb v 2.0.2

已经潜入了automongobackup的代码,而shell脚本不是我的优势:

简短的回答

在configuration部分设置以下内容:

 # Choose other Server if is Replica-Set Master REPLICAONSLAVE="no" 

我把它设置为'是'(因为我希望不久之后转移到副本集),并且正在通过电子邮件发送OP提供的错误,另一封电子邮件中包含脚本中的成功日志,即同样的问题。

长的答案

该configuration选项的措辞意味着该设置将只有一个效果, 如果这是一个副本集。 但后来在代码中,您看到将该configurationvariables设置为“是”会使其执行

 mongo --quiet --eval 'rs.conf().members.forEach(function(x){ print(x.host) })' 

即向mongo询问副本的成员是什么。 但是,如果您不在复制数据库中,则会返回:

 TypeError: rs.conf() has no properties 

从那里,有一件事会导致脚本内部出现另外一种错误,这可能是错误的结果。 从错误消息我猜测它试图连接到辅助服务器的地方

  • 不存在..
  • 因为它没有configuration..
  • 因为没有configuration。

我决定不使用gWaldo的脚本,因为我认为automongobackup更有可能在未来得到维护和改进。

总之,检测您是否在副本集中的代码以及如果您不需要改进的情况下如何处理它。 设置该选项为“否”将修复它,直到脚本改进 – 这不幸的是我有资格做。

没有潜入他们的代码,我不能告诉你为什么这是抛出错误。

我可以说的是,你已经投入了更多的精力来find(明显是坏的)工具,而不是写一个快速的shell脚本来调用mongodump(甚至是循环),并将其添加到你的crontab中。

这里有一个例子,如果你想每天备份一个星期,你可以做些什么,但永远保持星期天:

 #!/bin/bash ## Determine day of week. If Sunday, do an archival backup. ## Otherwise, do by day of week. DOW=`/bin/date +%a` REPLSET="mlg0" if [ $DOW == "Sun" ]; then DSTRING=`/bin/date +%Y-%m-%d` ARCHSTRING="$REPLSET.$DOW.$DSTRING.tgz" else ARCHSTRING="$REPLSET.$DOW" fi BACKUP_DIR="/var/shared/backup/mongodb/$ARCHSTRING" CRON="backup.$ARCHSTRING" LOCKFILE="/tmp/cron.$CRON.lock" if [ -f "$LOCKFILE" ]; then /usr/bin/logger -t mongodb_backup "$ARCHSTRING locked; skipping" exit 0 fi touch "$LOCKFILE" /usr/bin/logger -t mongodb_backup "$ARCHSTRING started" rm -f $BACKUP_DIR mkdir $BACKUP_DIR /opt/mongodb-2.0.1/bin/mongodump --host server.domain --out $BACKUP_DIR rm -f "$LOCKFILE" /usr/bin/logger -t mongodb_backup "$ARCHSTRING finished" 

现在一个git回购: https : //github.com/gwaldo/mongoBackup

所以,你想有副本集的好处,但还不完全,因为你现在没有真正运行在这种模式。 那么,你又抱怨有错误?

你预计会发生什么? 🙂

显然,如果你在“REPLICAONSLAVE”中input“yes”,那么代码就会假定你想要的是find第一个可用的从机进行备份。

无论如何,我会添加相关的副本集检测代码在某些时候(如果业余时间允许),根据问题,有人通过github打开:-)

KW