1. ホーム
  2. sql

[解決済み] テーブルをロックせずにALTER TABLEを実行できますか?

2022-10-02 21:20:06

質問

MySQL で ALTER TABLE ステートメントを実行すると、そのステートメントの間、テーブル全体がリード ロックされます(同時読み込みは許可されますが、同時書き込みは禁止されます)。大きなテーブルの場合、INSERT または UPDATE ステートメントは非常に長い時間ブロックされる可能性があります。処理中もテーブルが更新可能であるような方法で列を追加するような、quot;hot alter" を行う方法はありますか?

主に MySQL のソリューションに興味がありますが、MySQL がそれを行うことができない場合、他の RDBMS に興味を持つでしょう。

明確にするために、私の目的は、余分なテーブル列を必要とする新機能が本番環境にプッシュされたときにダウンタイムを回避することです。どのデータベース スキーマも は時間の経過とともに変化します。これらの変更が必然的にダウンタイムにつながることを受け入れる必要があるのか、私にはわかりません。

どのように解決するのですか?

他の唯一の選択肢は、多くの RDBMS システムがとにかく行っていることを手動で行うことです...。

- 新しいテーブルを作成する

そして、古いテーブルの内容を一度に一塊ずつコピーすることができます。 ソーステーブルのINSERT/UPDATE/DELETEに常に注意を払いながら。 (トリガで管理することができます。 これはスローダウンの原因となりますが、ロックではありません...)

終了したら、ソーステーブルの名前を変更し、次に新しいテーブルの名前を変更します。 できればトランザクションの中で。

終了したら、そのテーブルを使用するストアドプロシージャなどを再コンパイルしてください。 実行計画はおそらくもう有効ではありません。

EDITです。

この制限が少し貧弱であるというコメントもありました。 そこで、なぜそうなっているのかを示すために、新しい視点を入れてみようと思いました...。

  • 新しいフィールドを追加することは、すべての行で 1 つのフィールドを変更するようなものです。
  • フィールドロックは、テーブルロックはともかく、行ロックよりはるかに困難でしょう。



  • あなたは実際にディスク上の物理的な構造を変更している、すべてのレコードが移動します。
  • これは本当にWholeテーブルのUPDATEのようなものですが、よりインパクトがあります...