在mongo工具上运行db.fsyncLock()之后运行db.fsyncUnlock()会导致进程停滞

时间:2015-05-13 10:20:25

标签: mongodb mongodump

我使用

登录我的mongodb实例
mongo admin -u <user> -p <pass> --port <port>

然后运行以下命令。

rs0:SECONDARY> db.fsyncLock()
{
  "info" : "now locked against writes, use db.fsyncUnlock() to unlock",
  "seeAlso" : "http://dochub.mongodb.org/core/fsynccommand",
  "ok" : 1
}
rs0:SECONDARY> db.fsyncUnlock()

解锁命令长时间停留。如果按CTRL-C,我会使用Assertion failure isABSONObj() src/mongo/bson/bson-inl.h 1831

获得以下跟踪
2015-05-13T10:08:55.455+0000 Assertion failure isABSONObj() src/mongo/bson/bson-inl.h 183
2015-05-13T10:08:55.458+0000 0x868a51 0x816b59 0x7f9cce 0x7e06be 0x61b2e0 0x7fbcb07fec60 0x7fbcb159eab9 0x8266f2 0x826729 0x826775 0x81edfc 0x81fcc6 0x8202b1 0x66d8e5 0x699f9a 0x66359a 0x680574 0x7c4743 0x7a71f9 0x7197bb52579 
mongo(_ZN5mongo15printStackTraceERSo+0x21) [0x868a51]
mongo(_ZN5mongo10logContextEPKc+0x159) [0x816b59]
mongo(_ZN5mongo12verifyFailedEPKcS1_j+0x17e) [0x7f9cce]
mongo(_ZNK5mongo11shell_utils18ConnectionRegistry30killOperationsOnAllConnectionsEb+0x45e) [0x7e06be]
mongo(_Z10quitNicelyi+0x40) [0x61b2e0] /lib64/libc.so.6(+0x33c60) [0x7fbcb07fec60]
/lib64/libpthread.so.0(recv+0x79) [0x7fbcb159eab9]
mongo(_ZN5mongo6Socket5_recvEPci+0x22) [0x8266f2]
mongo(_ZN5mongo6Socket11unsafe_recvEPci+0x9) [0x826729]
mongo(_ZN5mongo6Socket4recvEPci+0x35) [0x826775]
mongo(_ZN5mongo13MessagingPort4recvERNS_7MessageE+0x9c) [0x81edfc]
mongo(_ZN5mongo13MessagingPort4recvERKNS_7MessageERS1_+0x36) [0x81fcc6]
mongo(_ZN5mongo13MessagingPort4callERNS_7MessageES2_+0x31) [0x8202b1]
mongo(_ZN5mongo18DBClientConnection4callERNS_7MessageES2_bPSs+0x55) [0x66d8e5]
mongo(_ZN5mongo14DBClientCursor4initEv+0xba) [0x699f9a]
mongo(_ZN5mongo12DBClientBase5queryERKSsNS_5QueryEiiPKNS_7BSONObjEii+0xea) [0x66359a]
mongo(_ZN5mongo18DBClientConnection5queryERKSsNS_5QueryEiiPKNS_7BSONObjEii+0xa4) [0x680574]
mongo(_ZN5mongo9mongoFindEPNS_7V8ScopeERKN2v89ArgumentsE+0x3d3) [0x7c4743]
mongo(_ZN5mongo7V8Scope10v8CallbackERKN2v89ArgumentsE+0x89) [0x7a71f9][0x7197bb52579]

当我再次登录并运行以下功能以检查是否保持锁定时:

serverIsLocked = function () {
                 var co = db.currentOp();
                 if (co && co.fsyncLock) {
                     return true;
                 }
                 return false;
             }

我明白了:

rs0:SECONDARY> serverIsLocked()
true
rs0:SECONDARY> db.fsyncUnlock()

和db.fsyncUnlock()再次卡住。不确定发生了什么以及如何解锁数据库。 fsync的文档包含以下内容:

  

警告   使用lock调用fsync时,请确保连接保持打开状态以允许后续调用db.fsyncUnlock()。

     

关闭连接可能会导致锁定失败。

我最初尝试使用--eval锁定和解锁。这可能是个问题吗?现在解锁数据库的方法是什么?

mongo admin --eval "printjson(db.fsyncLock())"
mongo admin --eval "printjson(db.fsyncUnlock())"

所有这些都是我写的mongodump脚本的一部分。

更新:我在创建脚本时关注此帖:http://www.codeproject.com/Tips/547759/Automating-backup-for-MongoDB-using-CRON-and-S-CMD

UPDATE2:看起来像2.2版后,mongodump不应与db.fsyncLock()一起使用。我将从我的脚本中删除它,并将--oplog标记添加到mongodump。但是,我仍然需要弄清楚如何解锁我的数据库。

0 个答案:

没有答案