一次生產環境的docker MySQL故障

程式設計實驗室發表於2022-05-26

問題

昨天下午本來要去吃下午茶,然後前端小夥伴突然說介面怎麼崩了,我登上sentry一看,報錯了

(2005, "Unknown MySQL server host 'mysql' (-3)")

啥意思啊,連不上資料庫,host是mysql因為這是在docker環境裡

直接ssh連上伺服器檢視,沒啥問題呀,MySQL容器也正常執行著

奇怪

然後我重啟了一波docker,結果發現MySQL容器沒有正常重啟?

手動docker stop一下,再重新docker compose up

結果寄了,服務恢復起來後MySQL資料全沒了……

找原因

慌還是有點慌的,畢竟是生產資料,但我心裡也明白資料不可能憑空消失,MySQL作為成熟的商用資料庫,不可能犯這種低階錯誤,那問題八成就出在我們自己身上了…

果然,之前使用docker-compose編排容器的時候偷懶,沒有給MySQL容器加上volume對映

現在強制stop的時候沒有先commit,所以就導致容器資料“丟失”

我這裡用了雙引號,因為資料也並沒有真正丟失,而是變成了一個orphan volume,(沒人引用的卷?)

解決

那麼情況就清楚了,現在我找到之前MySQL容器用到的這個volume,把裡面的資料檔案提取出來重新對映就好了

volume檔案路徑是/var/lib/docker/volumes/

裡面有一堆volume資料夾,現在只能一個個慢慢看了

也可以執行du命令,根據大小來做一個預估

最終我找到了一個2.9G的目錄,開啟看到裡面的資料就是MySQL的

那就好辦了

cd到這個volume的目錄中,把資料檔案複製出來

cp -r _data /var/lib/mysql

然後修改之前的docker-compose.yml配置檔案

version: "3"
services:
  mysql:
    image: daocloud.io/mysql
    volumes:
      - /var/lib/mysql:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=1234
    expose:
      - 3306

新增上volumes配置就好了~

重新啟動容器

docker-compose up -V

我一開始不知道要加-V引數,對映了volume之後MySQL還一直沒資料

後面看了文件才知道不加-V會一直使用原來的volume

小結

雖然是把資料給恢復起來了,但問題其實還沒完全解決,到這裡還留下一個疑問:一開始那個故障是怎麼來的?MySQL容器為啥會莫名其妙無法連線?

這個問題暫時還不清楚,後續再看看binlog分析一下。

最後,這次出的故障帶來幾個教訓

  • 不要偷懶,volume一定要提前對映好
  • docker知識匱乏,一知半解,得系統學一下
  • docker-compose的管理方式還是比較原始,是不是要找機會上更現代化的容器管理方式?

參考資料

相關文章