tidb修改字段類型的辦法

tidb有很多的限制,比如新增修改和刪除字段一次只能執行一條,比如sql語句比如update一次只能執行幾萬條。比如不能修改字段的類型。

之前我要修改字段類型只能先把tidb的數據先遷移到mysql上,然後在mysql裏面的字段類型修改後,再直接覆蓋tidb裏的表。在開發階段是可以的,但是在產品上線以後,時刻產生新的數據,如果要保證正確性,只能停止服務器,但是數據量大的時候,遷移數據的速度會非常慢,先遷移到mysql,然後再遷移到tidb,時間耗時太長,對服務器影響太大。怎麼樣儘量地減少時間,減少對數據庫的影響,我開始考慮到這一點。

我發現tidb雖然不能執行修改字段類型的語句,但是可以新增字段,刪除字段,修改字段的名稱。於是我就想到了辦法。

比如一個監控數據表monitordata,有一個字段cycleTime(int),我想改成double類型。那麼我就先新增一個字段cycleTime_new,然後利用update語句將cycleTime的數據加到cycleTime_new上,然後刪除cycleTime字段,再修改字段名cycleTime_new爲cycleTime。

ALTER TABLE `monitordata`
ADD COLUMN `cycleTime_new`  double;
update monitordata 
set cycleTime_new = cycleTime
where cycleTime_new is null
limit 50000;
commit;
update monitordata 
set cycleTime_new = cycleTime
where cycleTime_new is null
limit 50000;
commit;
update monitordata 
set cycleTime_new = cycleTime
where cycleTime_new is null
limit 50000;
commit;
.......
#重複到所有數據處理完畢
ALTER TABLE `monitordata`
DROP COLUMN `cycleTime`;
ALTER TABLE `monitordata`
CHANGE COLUMN `cycleTime_new` `cycleTime`  double NULL DEFAULT NULL;

其中update字段數據的時間比較長,但是執行的時候並不會影響到生產環境的數據。當我把所有數據處理完畢後,我只要短時間內停一下服務器,然後再執行一次update語句,將最近生成的數據處理掉,然後再刪除修改字段。對數據庫的影響降到了最低

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章