大きな変更なしで InnoDB テーブルの列の名前を変更する方法はありますか?
テーブルはかなり大きいので、大きなダウンタイムは避けたいと思っています。
残念ながら、列の名前を変更するには ( を使用ALTER TABLE ... CHANGE COLUMN
)、MySQL で完全なテーブル コピーを実行する必要があります。
pt-online-schema-change をチェックしてください。これにより、ALTER の実行中にテーブル全体をロックすることなく、テーブルに対してさまざまな種類の ALTER 変更を行うことができます。データを新しいテーブルにコピーしている間、元のテーブルの読み取りと書き込みを続行できます。トリガーを介して変更がキャプチャされ、新しいテーブルに適用されます。
例:
pt-online-schema-change h=localhost,D=databasename,t=tablename \
--alter 'CHANGE COLUMN oldname newname NUMERIC(9,2) NOT NULL'
更新: MySQL 5.6 では、テーブルを再構築せずに一部の種類の ALTER 操作を実行できます。列の名前の変更は、オンライン変更としてサポートされている操作の 1 つです。どのタイプの変更がこれをサポートしているか、またはサポートしていないかの概要については、http://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-overview.htmlを参照してください。
制約がなければ、私が知る限り問題なく変更できます。制約がある場合は、最初に制約を削除し、制約を変更して追加し直す必要があります。
多くの行を含むテーブルを変更すると、長い時間がかかる場合があります (ただし、関係する列にインデックスが付けられていない場合は、簡単なことかもしれません)。
その目的のために特別に作成されたALTER TABLE構文の使用を特に避けたい場合は、次のように、ほぼ同じ構造 (ただし名前は異なる) のテーブルをいつでも作成し、すべてのデータをそこにコピーできます。
CREATE TABLE `your_table2` ...;
-- (using the query from SHOW CREATE TABLE `your_table`,
-- but modified with your new column changes)
LOCK TABLES `your_table` WRITE;
INSERT INTO `your_table2` SELECT * FROM `your_table`;
RENAME TABLE `your_table` TO `your_table_old`, `your_table2` TO `your_table`;
一部の ALTER TABLE クエリでは、上記の方がかなり高速になる場合があります。ただし、単純な列名の変更の場合は簡単です。実際にどれくらいの時間を見ているかを確認するために、同じテーブルを作成して変更を実行してみるかもしれません。