前几天公司断电,导致公司mongo数据库中部分数据损坏,具体表现为副本集启动失败,单机方式启动接收到客户端请求后会导致服务down掉,日志如下:
xxx为公司库名
2018-07-16T16:39:24.377+0800 [conn26] xxx Deleted record list corrupted in bucket 18, link number 1, invalid link is 107226:0, throwing Fatal Assertion
2018-07-16T16:39:24.377+0800 [conn26] xxx Fatal Assertion 16469
2018-07-16T16:39:24.380+0800 [conn26] xxx 0xedb3e9 0xe6fb3f 0xe4a1c1 0xc87a2f 0xc87d6a 0xc87dd2 0xc944c2 0xc950de 0x7227c7 0x726294 0xa40dbb 0xa48d4e 0x9a1fe2 0x9a4c4b 0x6273fe 0xe84d22 0x7f81d638e6ba 0x7f81d517641d
查询资料确认需要做数据修复,命令如下:
sudo mongod --repair --dbpath 数据存放目录
但是数据修复因为硬盘不足导致修复失败:
2018-07-16T17:16:59.372+0800 [initandlisten] repairDatabase xxx
2018-07-16T17:16:59.372+0800 [initandlisten] xxx Fatal assertion 17401 OutOfDiskSpace Cannot repair database xxx having size: 27903918080 (bytes) because free disk space is: 18944225280 (bytes)
报错显示因为硬盘不足导致数据修复失败,所以查看了当前的硬盘使用情况:
df -h
发现硬盘的确使用了很多,因为公司很多数据都存储在一个实例里,导致当前实例的硬盘剩余量不足以做数据修复
经检查,当前有一个库是使用不到的,而且占用了大量的存储,所以将数据文件直接删除后再次执行数据修复,经过漫长的等待后终于成功
然后注释掉副本集配置,只以单机方式启动后访问正常
当然如果是生产环境是不能使用这种方式的,但是可以先将数据备份后,增大硬盘容量后做数据修复,因为本人不涉及这种场景,所以没有做测试,有兴趣的小伙伴可以尝试一下
总结:真的真的不要把所有的数据库都丢到同一个实例