简短的回答

简短的回答

我在用自动备份嗯,自动执行 mongodb 的备份。

脚本的输出(到 STDERR)有以下异常(但备份完成,并且创建了转储文件)

###### 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

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

如果我运行(这是基于设置的选项和我对 src 代码的解读而产生的mongodump --host=127.0.0.1:27017 --journal有效命令),一切都会顺利运行而没有任何错误报告,并且转储文件也会按预期创建。automongobackup

为什么会automongobackup报告连接错误,即使它确实创建了转储文件,但直接调用却mongodump没有?

  • Debian 6.0 Lenny(来自 Linode 映像:最新 3.2(3.2.1-x86_64-linode23))
  • AutoMongoBackup 版本 0.9
  • mongodb v 2.0.2

答案1

深入研究了 automongobackup 的代码,虽然 shell 脚本不是我的强项:

简短的回答

在配置部分设置以下内容:

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

我将其设置为“是”(因为我希望不久后就能转移到副本集)——并且收到了 OP 提供的错误电子邮件,另一封电子邮件包含脚本的成功日志,即同样的问题。

详细答案

该配置选项的措辞暗示该设置只会产生影响如果这是在副本集中。但稍后在代码中你会看到,将该配置变量设置为“yes”会使其执行

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

即它询问 mongo 副本集的成员是什么。但是如果你不知道副本集,返回:

TypeError: rs.conf() has no properties

从那里开始,脚本中的一件事导致了另一件事,错误可能是结果。从错误消息来看,我猜它会尝试在某个地方连接到辅助服务器

  • 不存在..
  • 因为它尚未配置..
  • 因为没有配置。

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

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

答案2

如果不深入研究他们的代码,我就无法告诉你为什么它会抛出错误。

我可以说的是,您已经投入了更多的精力来寻找那个(显然已损坏的)工具,而不是仅仅编写一个快速 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

答案3

因此,您想享受副本集带来的好处,但目前还不是时候,因为您目前还没有真正以这种模式运行。不过,您又抱怨那里有错误吗?

你期望发生什么?:)

显然,如果您在“REPLICAONSLAVE”中输入“是”,那么代码会假定您想要的是找到第一个可用的从属服务器来进行备份。

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

千瓦

相关内容