mysql大資料表新增欄位
阿新 • • 發佈:2020-08-21
方案一、老表資料遷移四部曲方案
1、新建老表t_order_goods的備份表t_order_goods_bak,同時加一個欄位:isVirtual 並給預設值
2、遷移老表t_order_goods資料到備份表t_order_goods_bak中
3、刪除老表t_order_goods
4、新命名備份表t_order_goods_bak表名為t_order_goods
以上的操作步驟2~4建議是在離線的情況下執行,避免在執行遷移資料過程中有新資料進來,導致新表資料流失不完整
方案二、升級MySQL的伺服器版本
1、將現有MySQL版本5.7升級到8.0.12之後的版本
2、然後再執行新增欄位操作
方案一:
優勢:不用再調整業務層的應用程式程式碼,只需要DBA遷移表即可
方案二:
優勢:不影響業務層的應用程式程式碼,也不會導致資料丟失
劣勢:升級過程,必然要離線,此過程時間過程一樣會影響業務的正常執行
經驗總結
個人建議在實際情況允許的情況下,如果大家所在的公司也出現類似的問題時,儘可能的還是採用方案三:升級伺服器版本
畢竟長遠考慮,後續在業務的發展不確定情況下,原始表拓展加新的欄位是很正常的一件事,升級到高版本後 因為引入了新的演算法:即時演算法 所以會毫秒級別的加欄位 不會對業務釋出上線造成影響
方案一案例:
為了避免這種問題,記錄一下比較妥帖的辦法
1.建立一個臨時的新表,複製舊錶的結構
create table `tmp` like `goods`;
2.給新表加上新增的欄位
ALTER TABLE `tmp` ADD COLUMN `num` int(10) NOT NULL DEFAULT 0 AFTER `unit`;
3.把舊錶的資料複製過來
insert into tmp(id,name,unit) select id,name,unit from goods;
4.重新命名
rename table goods to goods_bak; rename table tmp to goods;
一般情況下,一百多萬的資料量,也可以直接進行加欄位操作
但是得看伺服器的執行情況,如果有大量服務佔用記憶體,新增欄位可能會出現問題