tidbフィールドタイプを変更する方法

1408 ワード

tidbには、フィールドの新規変更や削除は一度に1つしか実行できないなど、sql文、updateなどは一度に数万個しか実行できないなど、多くの制限があります.たとえば、フィールドのタイプを変更できません.
前にフィールドタイプを変更するには、tidbのデータをmysqlに移行し、mysqlのフィールドタイプを変更してからtidbのテーブルを直接上書きするしかありません.開発段階では可能ですが、製品がオンラインになってから、常に新しいデータが生成されます.正確性を保証するには、サーバを停止するしかありませんが、データ量が大きい場合、データの移行速度が非常に遅くなります.まずmysqlに移行してからtidbに移行します.時間がかかりすぎて、サーバに大きな影響を与えます.どのようにしてできるだけ時間を減らし、データベースへの影響を減らすか、私はこの点を考え始めました.
tidbはフィールドタイプを変更する文を実行できませんが、フィールドを追加したり、フィールドを削除したり、フィールド名を変更したりすることができます.そこで私は方法を思いついた.
たとえば、モニタデータテーブルmonitordataには、doubleタイプに変更したいフィールドcycleTime(int)があります.では、まずフィールド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文をもう一度実行して、最近生成したデータを処理してから、変更フィールドを削除します.データベースへの影響が最小限に抑えられました