問題
昨天下午本來要去吃下午茶,然後前端小夥伴突然說介面怎麼崩了,我登上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的管理方式還是比較原始,是不是要找機會上更現代化的容器管理方式?
參考資料
- Docker mysql容器資料庫丟失找回指北:http://i.lckiss.com/?p=4222