当独立的mongod服务实例以未开启journaling方式运行,如果不友好的关闭它,可能会使数据标记成不一致的状态.这种情况下,如果在dbpath目录产生一个非空的mongod.lock文件,那么启动日志应该会输出以下信息:
Detected unclean shutdown - mongod.lock is not empty.
出现这种情况,你必须手动修复你的数据库,详细的步骤在下面(只适用于独立的mongod服务):
警告: 不适于mongodb集群,不要用此方法去修复集群中的任何一个mongodb节点.而正确的方式是,从备份中恢复或重新从另一节点同步数据,可以参考 Resync a Member of a Replica Set
修复步骤
提醒: 以下用到的命令需要以mongod服务相同的用户来运行,否则会导致改变数据文件原有权限属性的问题
首先备份一份数据库文件
直接拷贝一份
--dbpath
所指的目录作为备份用
--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