不小心刪庫(kù)是一種怎樣的體驗(yàn)?半個(gè)DBA的跑路經(jīng)驗(yàn)總結(jié)
最近這篇《不小心刪庫(kù)是一種怎樣的體驗(yàn)?》比較火,蹭個(gè)熱度講講半個(gè) DBA 的刪庫(kù)經(jīng)驗(yàn)。
大半夜的腦子比較糊涂,簡(jiǎn)單寫(xiě)一寫(xiě)。
部分內(nèi)容僅限于 mysql。
0. 國(guó)內(nèi)呆不下了,趕緊出國(guó)
首先,不要選動(dòng)車(chē),要選最近的一班飛機(jī),盡快出國(guó),能走高速走高速,不然選人少的路線。
沒(méi)錯(cuò),我們 DBA 都是常備護(hù)照的。
切記,注意看高德地圖實(shí)時(shí)路況。
我們有個(gè)前輩就是刪庫(kù)之后開(kāi)車(chē)就上二環(huán),下午五點(diǎn)鐘。警察到的時(shí)候他還堵在路上。
1. 只不過(guò)是把數(shù)據(jù)干掉了
權(quán)限問(wèn)題永遠(yuǎn)是大問(wèn)題,做好權(quán)限回收,開(kāi)發(fā)數(shù)據(jù)庫(kù)和線上數(shù)據(jù)庫(kù)分離,線上數(shù)據(jù)庫(kù)管理權(quán)限(一般指修改表結(jié)構(gòu)權(quán)限與刪表權(quán)限)禁止回收,也不提供給業(yè)務(wù)直接用。
不然參考 0。
公司管理上,***有自己的 DB 運(yùn)維產(chǎn)品,線上數(shù)據(jù)庫(kù)只允許查,改的話(huà)要有審批流程。
至于查數(shù)據(jù)要不要脫敏、導(dǎo)入導(dǎo)出流程,就看自己產(chǎn)品的規(guī)劃和排期了。
至于 DBA 怎么保證不手滑,這個(gè)每個(gè)人有每個(gè)人的習(xí)慣。
2. 刪庫(kù)什么的都是小 case
清理數(shù)據(jù)庫(kù)之前一定要檢查進(jìn)程,是否存在數(shù)據(jù)庫(kù)進(jìn)程,如果存在則寧愿不搞也不要深夜搞。
公司清理數(shù)據(jù)庫(kù)要有下線流程。下線一定要走流程。寧愿多租幾天機(jī)房也不要丟掉數(shù)據(jù)。
不然參考 0。
原則是:
rm 文件之前先檢查進(jìn)程是否存在。
絕不手工 drop 庫(kù)表,如果非要 drop,則應(yīng)該寫(xiě)成 rename,truncate 也是類(lèi)似,寫(xiě)成 rename 和 create table like 兩條 sql。
刪表之前可以根據(jù)表文件的***修改時(shí)間進(jìn)行再次確認(rèn),不確認(rèn)就找人 review,有下線流程則走下線流程。
3. 備份,備份,備在何處?
冷備,熱備都要有,一定要每天一備。
冷備便是應(yīng)對(duì)這種情況。
公司應(yīng)該有自己的 DB 備份方案,并且保證執(zhí)行到位。
4. 人算不如天算
關(guān)于這一點(diǎn),可以單獨(dú)拉一個(gè)大專(zhuān)題出來(lái)了,核心內(nèi)容是 mysql 高可用。
簡(jiǎn)單起見(jiàn),推薦這篇文章:避免硬件故障的核心解決方案是冗余。
硬件層面的 raid,軟件層面的主從、熱備都是為了保證某一個(gè)節(jié)點(diǎn)宕機(jī),其他節(jié)點(diǎn)仍然能繼續(xù)工作。
所有庫(kù)都要有主從備份,一方面做讀寫(xiě)分離,一方面也是為了備份、高可用。
即便有半同步復(fù)制,有些極端情況下可以認(rèn)為,mysql binlog 沒(méi)有同步到從庫(kù)上,仍然可能存在 binlog 丟失(數(shù)據(jù)丟失)的風(fēng)險(xiǎn)。
所以應(yīng)對(duì)這點(diǎn),比較好的開(kāi)源解決方案有 2:TiDB 和 Mysql GR。
5. 升級(jí)也能失敗?
說(shuō)起來(lái)很簡(jiǎn)單,升級(jí)無(wú)非是:
準(zhǔn)備升級(jí)
過(guò)程原理
手工升級(jí)后拓?fù)洌?/p>
工具(mha)升級(jí)后拓?fù)洌?/p>
6. 操作之前有個(gè)流程
一般自己操作的時(shí)候,都不會(huì)有太多的顧忌。
但是要是拿給別人看,就要考慮一下了。
如果別人不只要看,還要 review,那這樣就比較難犯重大的錯(cuò)誤了。
如果有些操作需要夜間一個(gè)人搞,那么一定要提前列好準(zhǔn)備,這個(gè)就比較正式了。
包括:
1. 梳理具體的執(zhí)行步驟、執(zhí)行命令和每個(gè)步驟的預(yù)計(jì)結(jié)果。
2. 如果某些步驟出錯(cuò),是否要求回滾、預(yù)先制定回滾方案。
3. 詳細(xì)記錄執(zhí)行記錄,每一步都要有反饋。
4. 事先梳理好收尾工作。
5. 強(qiáng)關(guān)聯(lián)業(yè)務(wù)要事先通知,考慮到時(shí)間段和別的業(yè)務(wù)高峰,盡量讓對(duì)方也安排人留守觀察。
6. 一定要嚴(yán)格按照步驟來(lái)進(jìn)行操作。寧愿延期,不要加戲。
7. 留幾個(gè)問(wèn)題
1. 如果你有機(jī)會(huì)進(jìn)行 mysql 遷移和升級(jí)工作,你認(rèn)為無(wú)法寫(xiě)入數(shù)據(jù)造成的影響大,還是寫(xiě)入臟數(shù)據(jù)造成的影響大?
2. 如果數(shù)據(jù)庫(kù)掛了,機(jī)器可以啟動(dòng)但是 mysql 進(jìn)程無(wú)法啟動(dòng),你這里又有昨天的備份可以恢復(fù),你該怎么做?
3.想要?jiǎng)h庫(kù)完全不出問(wèn)題,那么刪庫(kù)流程該怎么設(shè)計(jì)?
好了,公司還是要有自己的 DB 產(chǎn)品,再簡(jiǎn)陋也要有。