神奇的DEBUG:因為異常導致MongoDB容器無法啟動

freephp發表於2022-12-30

越來越多的專案使用docker進行環境搭建,統一了開發和執行環境,好處頗多。但同時也引入了許多複雜性,比如一些容器服務突然無法啟動,那麼debug起來就比物理機安裝的服務麻煩一些。
這段時間Mac Pro經常出現莫名卡死的情況,我在沒有辦法的情況下只能強制關機,於是我遇到了再次開機後無法啟動某個專案中的MongoDB容器的問題。
檢視該mongoDB容器的日誌,一大段非常複雜的輸出,其中最重要的報錯資訊如下:

 Fatal Assertion 28558 at src/mongo/db/storage/wiredtiger/wiredtiger_util.cpp 365

Google了一波之後發現很多人遇到了類似的問題,都是因為之前異常中斷了容器或者像我一樣強制關機,導致mongoDB的本地資料中有一些破損的資料。所以需要對mongoDB進行修復。如果是物理機安裝的話可以直接執行如下命令進行修復:

mongod --dbpath=/path/to/db --repair

而如果是像我一樣,用docker-compose進行編排安裝的mongodb,那麼需要先單獨執行mongodb容器並進入該容器,然後再執行修復命令。
假設我有如下的docker-compose.yml檔案,其中mongodb的部分如下:

 my-mongo:
    container_name: my-mongo
    image: mongo:5.0
    ports:
      - 27018:27017
    volumes:
      - .db/data:/data/db
    healthcheck:
      test: mongo --port 27017 --eval "db.serverStatus()" > /dev/null || exit 1
      interval: 30s
      timeout: 30s
      retries: 10

那麼我需要執行如下命令來單獨執行mongodb容器:

docker-compose -f docker-compose.yml run -it my-mongo sh

然後可以順利進入容器,在容器裡面執行修復命令對破損的mongodb資料進行修復:

mongod --dbpath /data/db --repair

之後退出再重啟mongodb容器就能正常執行了。所以面對突發的問題不能慌張,耐心去分析問題本質,思考之後再合理上網找到解決辦法。

相關文章