3

我使用登录到我的 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有以下内容:

警告 调用带锁的 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不应该使用 wit db.fsyncLock()。我将从我的脚本中删除它并将--oplog标志添加到mongodump. 但是,我仍然需要弄清楚如何解锁我的数据库。

4

0 回答 0