一次生產(chǎn)環(huán)境的docker MySQL故障
問題
昨天下午本來要去吃下午茶,然后前端小伙伴突然說接口怎么崩了,我登上sentry一看,報錯了
(2005,?"Unknown?MySQL?server?host?'mysql'?(-3)")
啥意思啊,連不上數(shù)據(jù)庫,host是mysql因為這是在docker環(huán)境里
直接ssh連上服務器查看,沒啥問題呀,MySQL容器也正常運行著
奇怪
然后我重啟了一波docker,結(jié)果發(fā)現(xiàn)MySQL容器沒有正常重啟?
手動docker stop一下,再重新docker compose up
結(jié)果寄了,服務恢復起來后MySQL數(shù)據(jù)全沒了……
找原因
慌還是有點慌的,畢竟是生產(chǎn)數(shù)據(jù),但我心里也明白數(shù)據(jù)不可能憑空消失,MySQL作為成熟的商用數(shù)據(jù)庫,不可能犯這種低級錯誤,那問題八成就出在我們自己身上了…
果然,之前使用docker-compose編排容器的時候偷懶,沒有給MySQL容器加上volume映射
現(xiàn)在強制stop的時候沒有先commit,所以就導致容器數(shù)據(jù)“丟失”
我這里用了雙引號,因為數(shù)據(jù)也并沒有真正丟失,而是變成了一個orphan volume,(沒人引用的卷?)
解決
那么情況就清楚了,現(xiàn)在我找到之前MySQL容器用到的這個volume,把里面的數(shù)據(jù)文件提取出來重新映射就好了
volume文件路徑是/var/lib/docker/volumes/
里面有一堆volume文件夾,現(xiàn)在只能一個個慢慢看了
也可以執(zhí)行du命令,根據(jù)大小來做一個預估
最終我找到了一個2.9G的目錄,打開看到里面的數(shù)據(jù)就是MySQL的
那就好辦了
cd到這個volume的目錄中,把數(shù)據(jù)文件復制出來
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參數(shù),映射了volume之后MySQL還一直沒數(shù)據(jù)
后面看了文檔才知道不加-V會一直使用原來的volume
小結(jié)
雖然是把數(shù)據(jù)給恢復起來了,但問題其實還沒完全解決,到這里還留下一個疑問:一開始那個故障是怎么來的?MySQL容器為啥會莫名其妙無法連接?
這個問題暫時還不清楚,后續(xù)再看看binlog分析一下。
最后,這次出的故障帶來幾個教訓
不要偷懶,volume一定要提前映射好 docker知識匱乏,一知半解,得系統(tǒng)學一下 docker-compose的管理方式還是比較原始,是不是要找機會上更現(xiàn)代化的容器管理方式?
參考資料
Docker mysql容器數(shù)據(jù)庫丟失找回指北:http://i.lckiss.com/?p=4222
