背景
公司營銷系統(tǒng)前段時(shí)間出了一個(gè)問題,名單表主鍵是INT類型,經(jīng)過4年的業(yè)務(wù)發(fā)展,名單ID超過了21億,到達(dá)了INT類型的閾值,導(dǎo)致無法接收新的營銷名單。
自救失敗
發(fā)現(xiàn)問題原因后,第一時(shí)間聯(lián)系DBA,請(qǐng)他們幫忙執(zhí)行一條ddl語句,將名單ID字段類型由INT調(diào)整為BIGINT。
很遺憾,由于表的存量數(shù)據(jù)有5000多萬,ddl無法短時(shí)間執(zhí)行成功。為了避免線上聯(lián)機(jī)業(yè)務(wù)長時(shí)間受到影響,只能想別的辦法。
騰籠換鳥
名單ID最大值是INT的極大值,存量數(shù)據(jù)5000多萬,20多億歷史數(shù)據(jù)是被遷移備份歸檔了的。
聯(lián)系到每天新增名單200萬左右,所以新辦法的第一步就是將最進(jìn)500萬數(shù)據(jù)的ID,平移到一個(gè)歷史區(qū)間,這樣就騰出了500萬的ID空間,讓新名單能正常接入,保證業(yè)務(wù)短期正常。
無阻塞動(dòng)態(tài)修改schema
第一次自救失敗,主要原因是直接修改表字段類型是阻塞式修改,直接影響了線上業(yè)務(wù)。所以新辦法的第二步就是無阻塞修改表字段類型。DBA推薦了一款工具,PT-ONLINE-SCHEMA-CHANGE,能修改schema而不阻塞其他數(shù)據(jù)庫操作。
它的原理分為四步:
- 新建一個(gè)變更過schema后的表;
- 再在原表上建update觸發(fā)器、delete觸發(fā)器、insert觸發(fā)器,確保新的DML操作能同步到新表;
- 再將原表的數(shù)據(jù)到按照主鍵ID分區(qū)間拷貝到新表;
- 最后待數(shù)據(jù)copy完成后,將新表rename成老表。
整個(gè)過程幾乎不堵塞的(rename 操作會(huì)堵塞,但是rename操作時(shí)間很短),但是整體耗時(shí)很長。