方案一、老表數據遷移四部曲方案
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;
一般情況下,一百多萬的數據量,也可以直接進行加字段操作
但是得看服務器的運行情況,如果有大量服務占用內存,添加字段可能會出現問題