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