7

大きな変更なしで InnoDB テーブルの列の名前を変更する方法はありますか?

テーブルはかなり大きいので、大きなダウンタイムは避けたいと思っています。

4

3 に答える 3

8

残念ながら、列の名前を変更するには ( を使用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を参照してください。

于 2011-11-17T19:26:59.110 に答える
0

制約がなければ、私が知る限り問題なく変更できます。制約がある場合は、最初に制約を削除し、制約を変更して追加し直す必要があります。

于 2011-11-17T18:53:34.873 に答える
0

多くの行を含むテーブルを変更すると、長い時間がかかる場合があります (ただし、関係する列にインデックスが付けられていない場合は、簡単なことかもしれません)。

その目的のために特別に作成された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 クエリでは、上記の方がかなり高速になる場合があります。ただし、単純な列名の変更の場合は簡単です。実際にどれくらいの時間を見ているかを確認するために、同じテーブルを作成して変更を実行してみるかもしれません。

于 2011-11-17T19:11:03.247 に答える