8

このテーブルはMYSQLデータベースにあり、約1,000万レコード/行があります。columnテーブルに新しいものを挿入したい。ただし、単純な列の挿入クエリは私にはうまく機能しないようです。

これは私が試したことです、 ALTER TABLE contacts ADD processed INT(11);

5時間ほど待ちましたが、何も起こりませんでした。このような巨大なテーブルに新しい列を挿入する方法はありますか?

私の質問がはっきりしていることを願っています。どんな助けでもいただければ幸いです。

4

1 に答える 1

10

それが生産の場合:

の pt-online-schema-changeを使用する必要がありPercona Toolkitます。

pt-online-schema-change は、MySQL がテーブルを内部的に変更する方法をエミュレートしますが、変更したいテーブルのコピーに対して機能します。これは、元のテーブルがロックされていないことを意味し、クライアントはテーブル内のデータの読み取りと変更を続行できます。

pt-online-schema-change は、変更するテーブルの空のコピーを作成し、必要に応じて変更してから、元のテーブルから新しいテーブルに行をコピーすることによって機能します。コピーが完了すると、元のテーブルが移動され、新しいテーブルに置き換えられます。デフォルトでは、元のテーブルも削除されます。

または、oak-online-alter-tableの一部であるopenark kit

oak-online-alter-table を使用すると、ノンブロッキング ALTER TABLE 操作、テーブルの再構築、およびテーブルのゴーストの作成が可能になります。

テーブルの変更は遅くなりますが、テーブルはロックされません。

本番環境ではなく、ダウンタイムが問題ない場合は、次のアプローチを試してください。

CREATE TABLE contacts_tmp LIKE contacts;
ALTER TABLE contacts_tmp ADD COLUMN ADD processed INT UNSIGNED NOT NULL;
INSERT INTO contacts_tmp (contact_table_fields) SELECT * FROM contacts;
RENAME TABLE contacts_tmp TO contacts, contacts TO contacts_old;
DROP TABLE contacts_old;
于 2012-12-21T04:54:12.123 に答える