背景
公司使用的是MySQL數(shù)據(jù)庫,隨著業(yè)務(wù)和用戶的增加有張表的數(shù)據(jù)達(dá)到了150000000(1億5千萬)條左右沮榜,其中好幾個(gè)功能都會(huì)對(duì)這張表進(jìn)行增刪改操作。在并發(fā)量比較大的時(shí)候,經(jīng)常會(huì)出現(xiàn)死鎖問題揪荣。
為了解決這個(gè)問題找到CTO和其他領(lǐng)導(dǎo)來請教方案。
經(jīng)過分析之后往史,由于離業(yè)務(wù)繁忙期還有幾天仗颈,并且1月是系統(tǒng)達(dá)到最大并發(fā)的時(shí)期,所以決定暫時(shí)先采取比較穩(wěn)妥的版本號(hào)方案椎例,即只往數(shù)據(jù)庫insert和update數(shù)據(jù)挨决,定時(shí)任務(wù)刪除舊的數(shù)據(jù)(之后會(huì)采取數(shù)據(jù)分表分區(qū)的方案)版本號(hào)記錄在redis里面。于是花了2天左右的時(shí)間把這些業(yè)務(wù)里面的代碼重構(gòu)和修改了一遍(其中涉及到使用第三方庫修改的代碼订歪,修改這部分花了很多時(shí)間)脖祈。經(jīng)測試人員測試沒問題后,準(zhǔn)備發(fā)到線上刷晋。
過程
要刷入得的SQL如下:
ALTER TABLE xxx ADD COLUMN K_VERSION BIGINT(20) DEFAULT 0 COMMENT '版本號(hào)';
17年12月29日凌晨左右盖高,運(yùn)維開始執(zhí)行sql慎陵。到1點(diǎn)多的時(shí)候,運(yùn)維說數(shù)據(jù)庫所在的服務(wù)器硬盤滿了喻奥,導(dǎo)致刷入失敗席纽。里面有人開始議論說,不就是刷入字段嗎映凳,怎么會(huì)造成磁盤滿呢胆筒?運(yùn)維當(dāng)時(shí)立馬通過阿里云德后臺(tái)把數(shù)據(jù)庫的服務(wù)器磁盤增大。當(dāng)時(shí)我的第一反應(yīng):肯定這個(gè)SQL在表數(shù)據(jù)量大的時(shí)候會(huì)有問題诈豌。搜索之后發(fā)現(xiàn)仆救,當(dāng)數(shù)據(jù)量很大的時(shí)候,會(huì)占大量的undo空間矫渔,同時(shí)還會(huì)鎖表彤蔽。所以要想解決問題必須分開執(zhí)行sql 最后執(zhí)行sql如下:
第一步:
ALTER TABLE xxx ADD COLUMN K_VERSION BIGINT(20) COMMENT '版本
第二步:
ALTER TABLE XXX MODIFY(K_VERSION DEFAULT 0);
第三步:
update table XXX set K_VERSION=0;
之后也沒有出現(xiàn)刷sql掛服務(wù)器的問題。