2012-06-12 5 views
8

を発行します。HUGEテーブル内の列のデータ型を変更します。パフォーマンスは、私は私のテーブルの上にこれを実行したい

ALTER TABLE table_name MODIFY col_name VARCHAR(255) 

しかし、私のテーブルは巨大である、それは65M(6500万)行以上のものを持っています。今すぐ実行すると、このコマンドを実行するには約50分かかります。テーブルを変更するより良い方法はありますか?

+4

perconaツールキットを使用するいや、遅くなるだろう。 ALTER文は1回のアクションです。それを待って、もう一度やり直す必要はないと願っています。 –

+3

巨大なテーブル?いいえ。非常に大きい?はい。 –

答えて

3

さて、あなたは

ALTER TABLE table_name CHANGE col_name new_name VARCHAR(255) 

を必要とする。しかし、あなたは正しいです、それは、変更を行うためにしばらく時間がかかります。実際には、MySQLのテーブルを変更する高速な方法はありません。

変更中に問題がダウンすることはありますか?その場合は、考えられる方法があります。新しいテーブルにテーブルをコピーし、コピーのカラム名を変更してから、コピーの名前を変更します。

おそらく、本番システムのテーブルで列名を日常的に変更することは良い考えではないと考えているでしょう。

+0

はい。すべての行がこの間にロックされ、この表の他のアクション(CRUD)を防止するので、私は50分のダウンタイムを持つことができません。 – Kiran

+0

Uh。ああ。つまり、テーブルをコピーすると、新しいテーブルを再編成している間に、新しいテーブルと変更されたテーブルが古いテーブルに表示されます。これが私のプロジェクトであれば、今はこの列名を変更することの重要性を判断しようとしています。 –

+0

はい。私は一つのことをすることができます。 1時間のダウンタイムを発表し、負荷が少ないときにこれを変更します。おそらく真夜中に。しかし、あなたの入力に感謝します。 – Kiran

0

Oakを使用して、ダウンタイムなしにスキーマの変更を処理できます。

oak-online-alter-tableオリジナルテーブルのスキーマをコピーし、変更を適用してからデータをコピーします。オークが元のテーブルにいくつかのトリガーを置くので、CRUD操作は依然として呼び出すことができるので、操作中にデータが失われることはありません。

オークの著者がこのメカニズムについての詳細な説明を提供し、他のツールを提案しているother questionを参照してください。

関連する問題