7

2000万行を超えるMySQLDBのテーブル(MyISAMテーブル)に新しい列を追加する必要があります。

列を追加するプロセスは実行時に行う必要があります。つまり、アプリは引き続き実行され、テーブルの変更中に行が挿入および選択されます。

  • これは実行中のアプリにどのように影響しますか?
  • この変更を実行するのにどのくらい時間がかかりますか?

実行中のアプリに害を与えることなく、このプロセスを安全に行うにはどうすればよいですか?

4

2 に答える 2

5

DDL クエリが実行されている間、テーブルはロックされます。これは、サーバーがロックされている間、他のセッションでのクエリを受け入れないという意味ではありませんが、クエリはキューに入れられ、ALTER TABLE が完了する前にタイムアウトになる可能性があります。ハードウェア、テーブル構造、そしてもちろん行の量 (非常に多いと言った) などの要因に応じて、変更にはしばらく時間がかかります。

MySQL 5.5 (より高速なインデックス作成、innodb)、8 コア CPU、チップ ディスクでは、いくつかのインデックスを持つ 5 ミルの行テーブルを変更するには、この場合、約 15 ~ 20 分かかります。

コピーを作成し、コピーを変更することをお勧めします。完了したら、データ デルタを再生する必要があります。Facebookはこれをより高いレベルで処理する必要がありました。これをチェックしてください

http://m.facebook.com/note.php?note_id=430801045932

トー、これがすべて MyISAM エンジンで安全に動作することを約束することはできません

編集:

Percona は、明らかにすべてのストレージ エンジンで動作するツールキットを作成しました。

http://www.mysqlperformanceblog.com/2012/04/05/percona-toolkit-2-1-with-new-online-schema-change-tool/

このリリースでは、ブロッキングやダウンタイムなしで大きなテーブルを ALTER できるツールである pt-online-schema-change の新しいバージョンを導入しました。ご存知のように、MySQL はほとんどの ALTER 操作でテーブルをロックしますが、pt-online-schema-change はロックなしで ALTER を実行します。クライアント アプリケーションは、中断することなくテーブルの読み取りと書き込みを続行できます。

于 2012-12-02T10:29:26.977 に答える
2

新しい列を追加している間、テーブルがロックされます。これは、テーブルを使用しようとするすべてのアプリケーションが、使用が完了するまでブロックされることを意味します。データに害はありませんが、テーブルを使用しようとするアプリケーションはハングします。

どれくらいの時間がかかるかを言うのは難しいです。それは、データベースがすでにどれだけ大きいかによって異なります。これは、大量のデータのコピーを行う必要があるため、およびサーバーの速度によって異なります。上で誰かが言ったように、これを見つける方法は、テーブルのコピーを作成し、最初にそのコピーに対して変更を行うことです。

于 2012-12-02T10:16:05.880 に答える