安全地从MongoDB shell进行写入操作

3

我该如何在JavaScript中进行“安全”的写入,使其立即刷新到磁盘?我希望能够从shell和存储的JavaScript“CRUD”过程中进行操作。这只是一个问题吗:

db.foo.insert({stuff: "yes", meta: "physics"});
db.runCommand( "getlasterror" ) ;

这方面维基百科的解释不够清晰。

1
Shell在每次插入操作之后已经调用了getlasterror函数,但它不会自动将数据刷新到磁盘上。 - kris
1个回答

3

是的,您将使用最后错误命令,但需要设置fsync标志(和/或复制参数,具体取决于您对“安全”的定义):

# force fsync
> db.runCommand({getlasterror:1,fsync:true})

# wait for replication to one other server (w = 2)
> db.runCommand( { getlasterror : 1 , w : 2 } )

如果您正在进行多次写入操作,您可以在最后一次写入后请求fsync或复制。这将使所有先前的写入也变得“安全”(因为它们按顺序应用)。您不必为每个写入付出代价(除非您需要它们单独安全,而不仅仅是作为一组)。

Thilo,我没有分片,也没有副本集,除了每天备份一次并测试过之外,什么都没有。所以,“写入此服务器”是安全的。我知道“单服务器持久性”将在1.8中推出,但实际上我并不确定这意味着什么。 - Justin Dearing
单服务器的耐久性意味着您在fsync之间不会丢失数据。这可能还意味着更快的数据库恢复(现在您只会丢失一分钟的数据,但在您重新上线之前,数据库修复可能需要很长时间)。在传统的数据库(如Oracle)中,这是使用重做日志实现的:即使您不在每次提交时将整个数据库同步到磁盘上,您仍然会写入足够的日志信息以便能够重建缺失的内容。不确定这是否是计划在1.8中采用的方法。 - Thilo
1
单服务器的可靠性仍然要求你没有磁盘崩溃(它只能保护免受停电等问题的影响)。如果你丢失了磁盘,并且没有复制(或RAID),自上次外部备份以来,你将会失去所有数据。 - Thilo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接