ダウンタイムやデータの損失やエラーを発生させることなく、毎秒数百のレコードが挿入されているMySQLテーブルを変更するにはどうすればよいですか。
例:新しいフィールドの追加
ありがとう
さて、私はテーブルをロックし、フィールドを追加し、テーブルのロックを解除します。その場合、挿入に少し遅延が発生しますが、それほど面倒なことではないと思います。
「フィールドを追加する」と言うときは、新しい列を作成しているのですか、それとも単に列の値を更新しているのですか?どちらもまったく異なるものです。列を更新するだけの場合は、同じテーブル内の同じ行の複数のバージョンをサポートするようにデータモデルを変更し、テーブルの最後に新しい行を追加し続けます。これにより、最高の読み取り/書き込み同時実行性が得られます。
それ以外に、「ハンドラーソケット」メソッドを見ることができます。 http://yoshinorimatsunobu.blogspot.com/search/label/handlersocket
列を追加するだけでよい場合は、ダウンタイムが必要になる理由はありません。テーブルは、ALTER TABLEステートメントの期間(ミリ秒)の間ロックされます。この間に送信されたDMLは待機する必要があるため、パフォーマンスに一時的に影響を与える可能性がありますが、コードが明示的にロックをチェックしていない限り、例外が発生することはありません。
ガットフィールは、テーブルの変更は避けるべきだと言っています。別の方法は、列を新しいテーブルに追加し、元のテーブルにリンクして参照整合性を維持することです。これにより、元のテーブルは変更されません。
もう1つのかなり一般的なアプローチは、列が追加された新しいテーブルを作成し、それを古いテーブルと交換してから、データを新しいテーブルに追加し直すことです。しかし、素晴らしい解決策ではありません。
MySQLの達人はおそらく私に同意しないでしょう。
まあ、挿入物だけなら私は最高だと思います:
CREATE TABLE the_table_copy LIKE the_table;
ALTER TABLE the_table_copy ADD new_field VARCHAR(60);
RENAME TABLE the_table TO the_table_backup;
RENAME TABLE the_table_copy TO the_table;
ただし、最初にコピーを作成し、十分な速さでコピーを試してください。次に、実際の生き物でそれを行います!:)