我修复了 MongoDB 启动时出现信号 7 (总线错误) 导致的崩溃问题

首先

这是在修复错误地拔掉运行GROWI的树莓派的电源后,恢复了MongoDB无法正常启动时的操作日志。

如果我先写结论的话,只是重新安装了MongoDB,但是在一些地方遇到了问题,所以我创建了这个备忘录来记录这些情况。

环境

    Raspberry Pi 4 Model B 4GB (32GB MicroSD)
    Ubuntu Server 19.10.1 (64bit)
    MongoDB 3.6.8

主要以超级用户身份进行操作。

发生的事件

同标题所示,发生了 Got signal:7 (Bus error) 的信号,在启动时崩溃了(可能是由于电源中断引起的)。
实际的日志内容如下所示。

起動日志(总线错误)
/var/log/mongod.log
I CONTROL [main] ***** 服务器重新启动 *****
I CONTROL [initandlisten] MongoDB 正在启动:pid=11552 端口=27017 数据库路径=/var/lib/mongodb 64位主机=ubuntu
I CONTROL [initandlisten] 数据库版本 v3.6.8
I CONTROL [initandlisten] git 版本:8e540c0b6db93ce994cc548f000900bdc740f80a
I CONTROL [initandlisten] OpenSSL 版本:OpenSSL 1.1.1c 28 May 2019
I CONTROL [initandlisten] 分配器:tcmalloc
I CONTROL [initandlisten] 模块:无
I CONTROL [initandlisten] 构建环境:
I CONTROL [initandlisten] distarch: aarch64
I CONTROL [initandlisten] target_arch: aarch64
I CONTROL [initandlisten] 选项:{ config: “/etc/mongodb.conf”, net: { bindIp: “127.0.0.1”, unixDomainSocket: { pathPrefix: “/run/mongodb” } }, storage: { dbPath: “/var/lib/mongodb”, journal: { enabled: true } }, systemLog: { destination: “file”, logAppend: true, path: “/var/log/mongodb/mongodb.log” } }
W – [initandlisten] 检测到异常关闭 – /var/lib/mongodb/mongod.lock 不为空。
I – [initandlisten] 检测到由 ‘wiredTiger’ 存储引擎创建的 /var/lib/mongodb 中的数据文件,因此将活动存储引擎设置为 ‘wiredTiger’。
W STORAGE [initandlisten] 正在从上次清除检查点恢复数据。
I STORAGE [initandlisten]
I STORAGE [initandlisten] ** 警告:强烈建议使用 XFS 文件系统与 WiredTiger 存储引擎配合使用
I STORAGE [initandlisten] ** 请参阅 http://dochub.mongodb.org/core/prodnotes-filesystem
I STORAGE [initandlisten] wiredtiger_open 配置:create,cache_size=1383M,session_max=20000,eviction=(threads_min=4,threads_max=4),config_base=false,statistics=(fast),cache_cursors=false,compatibility=(release=”3.0″,require_max=”3.0″),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),statistics_log=(wait=0),verbose=(recovery_progress),
I STORAGE [initandlisten] WiredTiger 消息 [1662171225:956355][

看起来像是违反访问权限,但是就算查看堆栈跟踪,也不知道是什么原因。
因为我的脑袋只能理解到”似乎 WiredTrigger 的打开操作没有成功”这样的程度,所以我放弃了认真解读它。

尝试过的事情 (Cesaire)

带有“修复”选项的启动【无效】。

检测到非正常关闭 – /var/lib/mongodb/mongod.lock 文件不为空。由于出现了相应的日志,因此首先怀疑是数据库损坏,尝试修复选项进行修复,但没有特别效果。

$ mongod --dbpath /var/lib/mongod/ --repair

手动删除mongod.lock并启动【无效】。

看到了这样的文章,尝试删除/var/lib/mongod/mongod.lock(重命名),然后尝试使用“repair”选项进行修复,但效果也没有。


    https://qiita.com/naberina/items/d29ce3982f88fe2df095
    https://shinodogg.com/2012/01/25/mongodbでunclean-shutdownの際にmongod-lockを消す/

指定新创建的数据库文件夹进行启动【无效】。

创建适当的文件夹(/home/hogehoge/mongod/)并将其指定为 dbpath 启动尝试,但崩溃方式没有改变。

$ mkdir /home/hogehoge/mongod/
$ mongod --dbpath /home/hogehoge/mongod/

即使在创建数据库时漏掉了任何必要的步骤,系统崩溃的方式都不会改变,这让人感到不自然。这似乎不是数据库的问题,而是系统损坏了吧?

重新安装MongoDB【解决】

如果系统损坏了,重新安装可能是最快的方法。

$ systemctl disable mongodb # サービス無効化
$ tar zcvf /home/hogehoge/mongod-backup.tar.gz /var/lib/mongod/* # DB バックアップ
$ apt purge mongodb* # MongoDB アンインストール (設定ファイルも削除)
$ apt install mongodb-server # MongoDB インストール

如果可能的话,我希望直接使用,所以没有删除 /var/lib/mongod/ 目录。

重新安装(因为卡住了,稍后会提到)之后,尝试启动服务…

$ systemctl start mongodb
$ systemctl status mongodb
● mongodb.service - An object/document-oriented database
   Loaded: loaded (/lib/systemd/system/mongodb.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code)
     Docs: man:mongod(1)
 Main PID: 15146 (code=exited, status=100)

顺利地失败了。

查看日志。

启动日志(只读)

/var/log/mongod.log
I CONTROL [main] ***** 服务器重新启动 *****
I CONTROL [initandlisten] MongoDB开始:pid=14837 端口=27017 数据库路径=/var/lib/mongodb 64位 主机=ubuntu
I CONTROL [initandlisten] 数据库版本v3.6.8
I CONTROL [initandlisten] git版本:8e540c0b6db93ce994cc548f000900bdc740f80a
I CONTROL [initandlisten] OpenSSL版本:OpenSSL 1.1.1c 28 May 2019
I CONTROL [initandlisten] 分配器:tcmalloc
I CONTROL [initandlisten] 模块:无
I CONTROL [initandlisten] 构建环境:
I CONTROL [initandlisten] distarch: aarch64
I CONTROL [initandlisten] target_arch: aarch64
I CONTROL [initandlisten] 选项:{ config: “/etc/mongodb.conf”, net: { bindIp: “127.0.0.1”, unixDomainSocket: { pathPrefix: “/run/mongodb” } }, storage: { dbPath: “/var/lib/mongodb”, journal: { enabled: true } }, systemLog: { destination: “file”, logAppend: true, path: “/var/log/mongodb/mongodb.log” } }
I STORAGE [initandlisten] 在initAndListen中出现异常:IllegalOperation:尝试在只读目录上创建锁文件:/var/lib/mongodb,终止
I CONTROL [initandlisten] 现在退出
I CONTROL [initandlisten] 以代码100关闭

看起来 /var/lib/mongodb/ 变成了只读模式。
我通过 ls -la /var/lib/mongodb/ 发现部分文件的所有权属于 root,所以我尝试使用 chown 命令将所有权改为 mongodb,并重新运行。

$ chown -hR mongodb:mongodb /var/lib/mongodb/
$ systemctl start mongodb
$ systemctl status mongodb
● mongodb.service - An object/document-oriented database
   Loaded: loaded (/lib/systemd/system/mongodb.service; enabled; vendor preset: enabled)
   Active: active (running)
     Docs: man:mongod(1)
 Main PID: 15331 (mongod)
    Tasks: 23 (limit: 4435)
   CGroup: /system.slice/mongodb.service
           └─15331 /usr/bin/mongod --unixSocketPrefix=/run/mongodb --config /etc/mongodb.conf

动了!耶!

Ubuntu 19.10 的支持結束讓我陷入困境。

重新安装MongoDB时出现了404未找到错误,有点卡住了。
Ubuntu 19.10不是LTS版本,所以早在2020年7月就已经停止了支持。

由于不想让问题更加难以排除而选择不升级操作系统,暂时采用修改/etc/apt/sources.list的存储库URL的方式,参考了这篇文章。

$ sed -i -e 's/ports.ubuntu.com\/ubuntu-ports/old-releases.ubuntu.com\/ubuntu/g' /etc/apt/sources.list
$ apt-get update
bannerAds