いくつかの選択肢があります。
いずれにせよ、このようなことをする前にバックアップを取る必要があります。
1つの可能性は、サービスをオフラインにして、試したとおりに適切な場所で実行することです。その場合は、キーチェックと制約を無効にする必要があります。
ALTER TABLE bigtable DISABLE KEYS;
SET FOREIGN_KEY_CHECKS=0;
ALTER TABLE (whatever);
ALTER TABLE (whatever else);
...
SET FOREIGN_KEY_CHECKS=1;
ALTER TABLE bigtable ENABLE KEYS;
これにより、ALTERTABLE操作を高速化できます。ENABLE KEYSを実行すると、インデックスが一度に再生成されます。
もう1つの可能性は、必要な新しいスキーマを使用して新しいテーブルを作成し、新しいテーブルのキーを無効にしてから、@ Baderが提案したように実行し、古いテーブルの内容を挿入することです。
新しいテーブルが作成されたら、そのキーを再度有効にし、古いテーブルの名前を「old_bigtable」などの名前に変更してから、新しいテーブルの名前を「bigtable」に変更します。
新しいテーブルにデータを入力している間、サービスをオンラインに保つことができる可能性があります。しかし、それはうまくいかないかもしれません。
3番目の可能性は、巨大なテーブルを(フラットファイルに)ダンプしてから、新しいレイアウトで新しいテーブルにロードすることです。これは、テーブルのバックアップを無料で取得できることを除けば、2番目の可能性とほとんど同じです。SELECT DATA INTO OUTFILE
とを使用すると、これをかなり高速に実行できますLOAD DATA INFILE
。これを行うには、サーバーマシンのファイルシステムにアクセスできる必要があります。
いずれの場合も、制約とキーを無効にしてから再度有効にして、処理を高速化します。