Total Pageviews

Saturday 24 October 2020

修复意外停止的独立的mongodb

 当独立的mongod服务实例以未开启journaling方式运行,如果不友好的关闭它,可能会使数据标记成不一致的状态.这种情况下,如果在dbpath目录产生一个非空的mongod.lock文件,那么启动日志应该会输出以下信息:

Detected unclean shutdown - mongod.lock is not empty.

出现这种情况,你必须手动修复你的数据库,详细的步骤在下面(只适用于独立的mongod服务):

警告: 不适于mongodb集群,不要用此方法去修复集群中的任何一个mongodb节点.而正确的方式是,从备份中恢复或重新从另一节点同步数据,可以参考 Resync a Member of a Replica Set

修复步骤

提醒: 以下用到的命令需要以mongod服务相同的用户来运行,否则会导致改变数据文件原有权限属性的问题

  1. 首先备份一份数据库文件

    直接拷贝一份--dbpath所指的目录作为备份

  2. --repair选项来运行mongod服务 用--repair选项运行mongod服务来修复数据文件.默认情况下,在修复过程中,mongodb会在--dbpath下使用到_tmp目录.

    如果mongod使用的是MMAPv1存储引擎,你可以用--repairpath选项指定另外的临时目录.

    具体命令类似如下:

    sudo -u mongodb mongod --dbpath /root/data/mongodb --repairpath /root/data/mongodb_tmp --repair
    

    运行完毕之后,--dbpath应该包含修复了的数据和一个空的mongod.lock的文件.至此,你应该可以启动mongodb了.

-----------------

以友好的方式的停止mongod实例

除mongodb32位外,默认情况下,mongod都是开启journaling选项,用来防止不好友关闭导致的数据不一致的情况.所以,最好以友好的方式去停止mongod实例.

一次友好的关闭mongodb会完成所有队列中的等待的处理,然后刷新运行数据保存到数据文件,最后关闭掉所有打开的数据文件.除此之外,其它的关闭都是不友好的,且可能会危及数据的有效性.

确保友好的关闭,使用以下几种关闭方式:

使用 shutdownServer()

在mongo shell环境下使用db.shutdownServer()方法,如下

use admin
db.shutdownServer()

使用 –shutdown

在linux命令行环境下使用mongod命令选项--shutdown,如下:

mongod --shutdown

使用CTRL-C

如果是以交互方式(没有使用–fork选项)来运行mongod,发送CTRL-C来进行友好关闭即可

使用 kill

在linux命令环境下,关闭确定的mongod进程使用如下命令之一

kill <mongod process ID>
kill -2 <mongod process ID>

警告:
永远不要用kill -9(SIGKILL)来终止mongod实例.

No comments:

Post a Comment