[解決済み] テーブルをロックせずにALTER TABLEを実行できますか?
質問
MySQL で ALTER TABLE ステートメントを実行すると、そのステートメントの間、テーブル全体がリード ロックされます(同時読み込みは許可されますが、同時書き込みは禁止されます)。大きなテーブルの場合、INSERT または UPDATE ステートメントは非常に長い時間ブロックされる可能性があります。処理中もテーブルが更新可能であるような方法で列を追加するような、quot;hot alter" を行う方法はありますか?
主に MySQL のソリューションに興味がありますが、MySQL がそれを行うことができない場合、他の RDBMS に興味を持つでしょう。
明確にするために、私の目的は、余分なテーブル列を必要とする新機能が本番環境にプッシュされたときにダウンタイムを回避することです。どのデータベース スキーマも は は時間の経過とともに変化します。これらの変更が必然的にダウンタイムにつながることを受け入れる必要があるのか、私にはわかりません。
どのように解決するのですか?
他の唯一の選択肢は、多くの RDBMS システムがとにかく行っていることを手動で行うことです...。
- 新しいテーブルを作成する
そして、古いテーブルの内容を一度に一塊ずつコピーすることができます。 ソーステーブルのINSERT/UPDATE/DELETEに常に注意を払いながら。 (トリガで管理することができます。 これはスローダウンの原因となりますが、ロックではありません...)
終了したら、ソーステーブルの名前を変更し、次に新しいテーブルの名前を変更します。 できればトランザクションの中で。
終了したら、そのテーブルを使用するストアドプロシージャなどを再コンパイルしてください。 実行計画はおそらくもう有効ではありません。
EDITです。
この制限が少し貧弱であるというコメントもありました。 そこで、なぜそうなっているのかを示すために、新しい視点を入れてみようと思いました...。
- 新しいフィールドを追加することは、すべての行で 1 つのフィールドを変更するようなものです。
-
フィールドロックは、テーブルロックはともかく、行ロックよりはるかに困難でしょう。
- あなたは実際にディスク上の物理的な構造を変更している、すべてのレコードが移動します。
- これは本当にWholeテーブルのUPDATEのようなものですが、よりインパクトがあります...
関連
-
[解決済み] LINQでInclude()は何をするのですか?
-
[解決済み] SQL Serverで実行中の合計を計算する
-
[解決済み] MySQLでdatetimeとtimestampのどちらのデータ型を使用すべきですか?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] SQLテーブルで重複する値を検索する
-
[解決済み] ATTACHで開いたSQLiteデータベースファイルのテーブルを一覧表示するにはどうすればよいですか?
-
[解決済み] テーブルをロックせずにMySQLDumpを実行する
-
[解決済み] SQL ServerでINSERT INTOとしてデータをエクスポートする
-
[解決済み】「INNER JOIN」と「OUTER JOIN」の違いは何ですか?
-
[解決済み】SQL Serverで既存のテーブルにデフォルト値を持つカラムを追加する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
解決策:ユーザー root で localhost:3306 にある MySQL に接続できませんでした。
-
plsql-stored-procedure ORA-06550 エラー処理
-
[解決済み] SQLのカラム名があいまいな場合のクエリエラー
-
[解決済み] 1つのPostgreSQLクエリで複数のWITHステートメントを使用するには?
-
[解決済み] SQLサーバーでNULL = NULLがfalseに評価される理由
-
[解決済み] SQL Serverでシングルクォートをエスケープするにはどうすればよいですか?
-
[解決済み] Oracleの全テーブルのリストを取得しますか?
-
[解決済み] PostgreSQLからのPL/pgSQL出力をCSVファイルに保存する
-
[解決済み] SQL Serverにおける関数とストアドプロシージャの比較
-
[解決済み] 項目xにアクセスできるように文字列を分割するにはどうすればよいですか?