ホームページ >データベース >mysql チュートリアル >MySQLデータベースのテーブル構造をオンラインで変更する方法

MySQLデータベースのテーブル構造をオンラインで変更する方法

WBOY
WBOY転載
2022-09-05 17:45:282486ブラウズ

推奨学習: mysql ビデオ チュートリアル

1. MDL メタデータ ロック

テーブル構造を変更する前に、まず考えられる問題を見てみましょう。

1. MDL ロックとは

MySQL には MDL メタデータ ロックと呼ばれるロックがあり、テーブルが変更されると、このロックは自動的にテーブルに追加されます。自分で明示的に使用する必要があります。

  • テーブルの追加、削除、変更、クエリを実行すると、MDL 読み取りロックが追加されます。
  • テーブル構造に変更が加えられると、MDL 書き込みロックが追加されます。

読み取りと読み取りは相互排他的ではなく、読み取りと書き込み、書き込みと書き込みは相互排他的であるため、

  • スレッドがテーブルに対して追加、削除、および変更を実行すると、テーブル構造を変更する他のスレッドのリクエストをブロックします。
  • #スレッドがテーブル構造を変更すると、テーブルの追加、削除、変更、チェックを行う他のスレッドのリクエストをブロックします
  • #2. MDL ロックの問題

MDL がロックされると、現在要求されているトランザクションが送信された後にのみロックが解放されます。トランザクションが長い場合、またはオンライン データの量が多い場合、テーブルはMDL 書き込みロックがないと、時間がかかり、後続の他のリクエストがブロックされます。

A(select)、B(alter)、C(select)、D(select)... が同じ MySQL テーブルに対する連続したリクエストであるシナリオを想像してください。これらのリクエストはキューを形成します。

A (選択) がテーブルの MDL 読み取りロックを取得すると、B (変更) がブロックされます。B は MDL 書き込みロックを追加する必要があるためです。B がブロックされると、待機キュー内の他のユーザーがブロックされます。すべてのリクエストがブロックされ、最終的には MySQL の利用可能な接続が枯渇し、リクエストのタイムアウトやその他の問題が発生します。


2. MySQL テーブル構造をオンラインで変更する方法

上記の MDL ロックを考慮すると、テーブルの構造を変更すると他の通常のリクエストがブロックされることがわかっているため、変更操作は次のように行う必要があります。これは、営業のピーク時間帯、通常は午前 2 時から 4 時の間で行われます。

具体的な手順:

テーブルに読み取り/書き込みロックを追加し、現時点ではテーブルを読み取り専用にします。
  • テーブルの物理構造をコピーします。元のテーブル
  • 新しいフィールドの追加や他のテーブル構造の変更など、新しいテーブルの物理構造を変更します。
  • テーブル構造を新しいテーブルにインポートします。データ同期が完了し、中間テーブルをロックします。を削除し、元のテーブルを削除します。
  • 新しいテーブルの名前を元のテーブル名に変更します。
  • ロックを解放します。
  • 上記の解決策の問題は、データ量が多いため、すべてのデータをインポートするのに時間がかかり、その間はサービスにアクセスできなくなります。

改善点:

元のテーブルよりもいくつかのフィールドが多い新しいテーブル A_new を作成し、データ サブスクリプションを通じて元のテーブル A をサブスクライブします。オンライン テーブル A のデータは、新しく作成されたテーブル A_new に同期されます。このプロセスは続行され、このプロセス中にテーブル A を追加、削除、変更、確認することができます。2 つのテーブルのデータが同期される瞬間が常に存在します。完全に同期されています。はい、データに違いはありません。このとき、元のテーブル名 A が変更され、新しいテーブル A_new が元のテーブル A に変更されます。この操作は短い操作であり、瞬時に完了できます。あまり影響なく。

利点と欠点:


利点は、同期プロセスが元の通常のビジネスに影響を与えないことです。
  • 欠点は、プロセス中に新しいテーブルを保存するために余分なストレージ スペースが必要になることです。名前変更が完了すると、古いテーブルは削除できます。
  • 推奨学習:
mysql ビデオ チュートリアル

以上がMySQLデータベースのテーブル構造をオンラインで変更する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjb51.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。