2,100 万行のテーブルがあります。行名の 1 つを変更する必要があります。クエリ「alter table company change id new_id int(11)」を試してみると、クエリは終了しません。
大きなmysqlテーブルのフィールド名を変更する簡単な方法はありますか?
まず、何よりもまず、テーブルをバックアップします。
mysqldump -uroot -p db big_table > /tmp/big_table.backup.sql
ALTER コマンドを実行する際に留意すべきことの 1 つは、変更したくない変更の列の詳細が同じであることを絶対に確認することです。
たとえば、次のようになります。
ALTER TABLE big_table MODIFY COLUMN id INT(11)
AUTO_INCREMENT
やのようなものはスキップしますNOT NULL
。したがって、それもalterステートメントに含めるのが最善です。
ALTER TABLE big_table MODIFY COLUMN id INT(11) NOT NULL AUTO_INCREMENT;
基本的には、ID 列の create ステートメント領域をコピーし、必要なものを置き換えて、それを変更ステートメントに含めるだけです。
pt-online-schema-change を使用して、テーブルから自分自身をロックアウトすることなく、長時間実行される ALTER TABLE の変更を行います。
http://www.percona.com/doc/percona-toolkit/pt-online-schema-change.html
通常、変更を完了するにはさらに時間がかかりますが、作業中にテーブルから読み書きすることはできます。
また、著者のウェビナーを聞いて、その仕組みと注意事項について説明しています。
http://www.percona.com/webinars/2012-05-02-zero-downtime-schema-changes-in-mysql
次のように簡単に実行できます。
CREATE TABLE big_table_new LIKE big_table;
ALTER TABLE big_table_new MODIFY COLUMN id INT(11);
ALTER TABLE big_table_new DISABLE KEYS;
INSERT INTO big_table_new SELECT * FROM big_table;
ALTER TABLE big_table_new ENABLE KEYS;
ALTER TABLE big_table RENAME big_table_bak;
ALTER TABLE big_table_new RENAME big_table;
CREATE TABLE big_table_new LIKE big_table;
ALTER TABLE big_table_new MODIFY COLUMN id INT(11);
INSERT INTO big_table_new SELECT * FROM big_table;
ALTER TABLE big_table RENAME big_table_bak;
ALTER TABLE big_table_new RENAME big_table;
完了したらbig_table_bak
、バックアップです。
新しいものに満足している場合は、big_table
実行できます
DROP TABLE big_table_bak;
元に戻したい場合は、実行できます
DROP TABLE big_table;
ALTER TABLE big_table_bak RENAME big_table;
試してみる !!!
巨大な Mysql テーブルのフィールドの名前を変更するための時間のかからない方法は次のとおりです。
CREATE TABLE new_big_table SELECT id as new_id,field1,field2,field3 FROM big_table.
についてどう思いますか:
これは簡単なアイデアですが、高速ではありません (エクスポート/インポート)。
または、夜間の数時間のメンテナンス中に ALTER を実行してみますか? :)