<input id="ohw05"></input>
  • <table id="ohw05"><menu id="ohw05"></menu></table>
  • <var id="ohw05"></var>
  • <code id="ohw05"><cite id="ohw05"></cite></code>
    <label id="ohw05"></label>
    <var id="ohw05"></var>
  • 一次生產環境的docker MySQL故障

    問題

    昨天下午本來要去吃下午茶,然后前端小伙伴突然說接口怎么崩了,我登上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的管理方式還是比較原始,是不是要找機會上更現代化的容器管理方式?

    參考資料

    posted @ 2022-05-26 17:19  程序設計實驗室  閱讀(250)  評論(0編輯  收藏  舉報
    国产美女a做受大片观看