85

データベースのテーブル (main_table) に「location」という列を追加しようとしていました。私が実行したコマンドは

ALTER TABLE main_table ADD COLUMN location varchar (256);

main_table には 2,000,000 行を超える行が含まれています。2 時間以上実行し続け、まだ完了していません。

mytop このデータベースのアクティビティを監視して、クエリが他のクエリプロセスによってロックされていないことを確認しようとしましたが、そうではないようです。そんなに時間がかかるのでしょうか?実際、このコマンドを実行する前にマシンを再起動しました。現在、このコマンドはまだ実行中です。どうすればよいかわかりません。

4

5 に答える 5

200

あなたのALTER TABLEステートメントは、mysqlが新しい列を含むテーブルのすべての行を書き直す必要があることを意味します。200 万行を超える行があるため、かなりの時間がかかることが確実に予想されます。その間、サーバーはほとんど IO バウンドになる可能性があります。通常、次のことを行う方がパフォーマンスが高いことがわかります。

CREATE TABLE main_table_new LIKE main_table;
ALTER TABLE main_table_new ADD COLUMN location VARCHAR(256);
INSERT INTO main_table_new SELECT *, NULL FROM main_table;
RENAME TABLE main_table TO main_table_old, main_table_new TO main_table;
DROP TABLE main_table_old;

このようにして、空のテーブルに列を追加し、基本的にその新しいテーブルにデータを書き込みます。これは、多くのリソースをロックすることなく、他の誰も見ないことが確実です。

于 2011-09-29T15:21:00.427 に答える
38

これに対する適切な答えは、pt-online-schema-changegh-ostなどの機能を使用することだと思います。

これで 40 億行以上の移行を完了しましたが、ダウンタイムは 1 分未満で、最大 10 日かかる場合があります。

Percona は上記と非常によく似た方法で動作します

  • 一時テーブルを作成する
  • 最初のテーブルに (挿入、更新、削除用の) トリガーを作成し、それらが一時テーブルにレプリケートされるようにします。
  • 小さなバッチでデータを移行する
  • 完了したら、テーブルの名前を新しいテーブルに変更し、他のテーブルを削除します
于 2016-11-01T17:35:47.310 に答える