このような状況に遭遇したことがあるかどうかはわかりません。オンラインビジネスでは、MySQL テーブルに対して追加、削除、変更、クエリなどの操作を実行します。時間が経つにつれて、テーブル内のデータはますます増え、テーブル データ ファイルはますます大きくなり、データベースが占めるスペースは自然に徐々に増加します。 ディスク上のテーブル データ ファイルが占有するスペースを削減するために、削除コマンドを使用して、最大のビジネス テーブルの古いデータの半分を削除しました。削除後、ディスク上のテーブル データ ファイルは縮小されませんでした。テーブル全体のデータを削除しても、ファイルは小さくなりませんでした。なぜでしょうか。 この記事では、上記の問題を詳細に分析し、テーブルスペースを再利用するための正しい方法を紹介します。 予備的注釈現在、ほとんどの MySQL データベースは InnoDB エンジンを使用しているため、特に指定がない限り、この記事の例は InnoDB エンジンに基づいています。 MySQLの設定には、 そのため、通常は 問題の再現新しいテーブル mysql> テーブル ta\G の作成を表示します ************************** 1. 行 **************************** テーブル: テーブルの作成: CREATE TABLE `ta` ( `id` int(11) NULLではない、 `ia` int(11) NULLではない、 主キー (`id`) ) エンジン=InnoDB デフォルト文字セット=utf8 セット内の 1 行 (0.00 秒) 次のストアドプロシージャを使用して、データをバッチで挿入します 区切り文字 // プロシージャ multinsert(in beg int, in cnt int) を作成します。 始める icnt int をデフォルトで 0 と宣言します。 tmp int のデフォルトを 0 と宣言します。 icnt < cnt の場合 icnt = icnt + 1 を設定します。 tmp = beg + icnt を設定します。 ta(id,ia) に値(tmp,tmp) を挿入します。 終了しながら; 終わり// 区切り文字 ; MySQL コンソールで mysql> multinsert(0,100000) を呼び出します。 mysql> taからcount(*)を選択します。 +----------+ | カウント(*) | +----------+ | 100000 | +----------+ セット内の1行(0.02秒) ディスク上の [root@ecs-centos-7 test]# cd /var/lib/mysql/test/ [root@ecs-centos-7 テスト]# ls -l ta.ibd -rw-r----- 1 mysql mysql 11534336 1月3日 23:14 ta.ibd 上記の結果から、 ここで、 mysql> id が 1 から 50000 の間の ta から削除します。 クエリは正常、10000 行が影響を受けました (0.03 秒) mysql> taからcount(*)を選択します。 +----------+ | カウント(*) | +----------+ | 50000 | +----------+ セット内の1行(0.02秒) 削除が完了したら、ディスク上の [root@ecs-centos-7 test]# cd /var/lib/mysql/test/ [root@ecs-centos-7 テスト]# ls -l ta.ibd -rw-r----- 1 mysql mysql 11534336 1月3日 23:14 ta.ibd 上記の結果から、 つまり、 データ ファイルが縮小されない理由を理解するには、データを削除する原理を理解する必要があります。 データ削除の原則ご存知のとおり、InnoDB のデータは B+ ツリーを使用して編成されます。B+ ツリーの詳細については、「B+ ツリーの理解」を参照してください。 図(1) 上記は InnoDB インデックスの概略図です。点線で囲まれたノードは Page1 データ ページに属します。リーフ ノードにはインデックスに対応するデータが格納されます。これらは、インデックスの小さい順から大きい順に配列されます。 上図の赤い部分である、Page1 のインデックス キー値が 13 のデータを削除するとします。 InnoDB エンジンは、インデックス キー値が 13 のノードを削除済みとしてマークします。ノードの実際の物理スペースは再利用されず、後で再利用できる削除済みノードとしてマークされるだけです。したがって、テーブル レコードを削除しても、ディスク上のデータ ファイルは縮小されません。 上記では Page1 の 1 つのノードのデータのみが削除されているので、Page1 のすべてのノード データが削除されると、Page1 のスペースが再利用されるはずだと言うかもしれませんね。 答えはリサイクルなし Page1 のデータがすべて削除されると、データ ページ全体が削除済みとしてマークされ、データ ページ全体が再利用できるようになります。したがって、この場合、ディスク上のデータ ファイルは縮小されません。 データの再利用データの再利用には、データノードの挿入、削除、転送、データページのマージなどの操作が含まれます。具体的な操作プロセスの詳細については、「B+ ツリーの理解」を参照してください。ここでは繰り返しません。
上図(1)では、インデックスキー値が13のノードが削除されると、このノードは再利用可能としてマークされます。 後でインデックス キー値が 7 ~ 18 のレコードが挿入されると、元のインデックス キー値が 13 のデータ ノードが再利用されます。 ただし、後で挿入されたレコードのインデックス キー値が 7 ~ 18 の範囲外の場合、元のインデックス キー値が 13 のデータ ノードは再利用されない可能性があります。 つまり、データ ノードを再利用するには、インデックス キー値が特定の範囲条件を満たしている必要があります。
図(1)では、Page1のデータノードをすべて削除した後、Page1全体が再利用可能になります。挿入されたレコードが新しいページを使用する必要がある場合、Page1を再利用できます。 隣接するデータ ページの使用率が低い場合、それらのページがいずれかのデータ ページにマージされることがあります。このとき、もう一方のデータ ページは空きになり、空きになったデータ ページは再利用できるようになります。 どの操作がデータホールの原因になりますか?
データを削除すると、データホールが作成されます。これは以前に説明されているため、ここでは繰り返しません。
データがインデックス サイズの順に挿入されると、データ ページはコンパクトになり、データ ホールは発生しません。 インデックスの途中からデータを挿入すると、ページ分割が発生し、分割後のページにデータ ホールが発生する可能性があります。次の図は、挿入によって発生したページ分割の例を示しています。 図に示すように、分割前はリーフ ページがいっぱいになっており、データは非常にコンパクトに配置されています。 ここで、インデックス キー値が 15 のデータを挿入します。挿入後、上図の Page1 は 分割後、Page1 に 2 つの穴が現れました。これらの 2 つのデータ ノードは再利用可能ですが、Page2 はいっぱいです。
データの更新は、最初に削除してから挿入すると見なされ、データホールが発生する可能性もあります。 たとえば、 ただし、ステートメントが そのため、データを更新するとデータにギャップが生じる可能性があります。 まとめると、テーブルの追加、削除、変更操作によってデータ ホールが発生する可能性があり、オンライン サービスではテーブルに対して大量の追加、削除、変更操作が実行されるため、データ ホールが発生する可能性が比較的高くなります。 表領域を縮小する方法不規則な追加、削除、変更操作が多数行われると、テーブルには多くのデータホールが発生するため データ ホールのある元のテーブルと同じ構造の新しいテーブルを作成し、古いテーブルのデータをインデックスの昇順で新しいテーブルに挿入し、古いテーブルのすべてのデータを新しいテーブルに挿入した後、古いテーブルを削除し、新しいテーブルの名前を古いテーブルの名前に変更するとどうなるでしょうか。 新しいテーブルのリーフ ノード データは順番に追加されるため、ページは非常にコンパクトで、ページの使用率は非常に高くなります。必要なページは、古いテーブルよりもはるかに少なくなります。このように、古いテーブルのインデックスの穴は新しいテーブルには存在しません。新しいテーブルのデータ ファイルが占有するディスク領域は自然に削減され、テーブル領域を縮小するという目的が達成されます。 テーブル領域を縮小する方法はいくつかあります。方法はそれぞれ異なりますが、基本的にはテーブルを再構築することで目的を達成します。
この操作は、
この操作は、古いテーブルの主キー インデックスのデータ ページをトラバースし、データ ページ内のレコードの B+ ツリー構造を生成し、それをディスク上の一時ファイルに保存します。データ ページのトラバースが完了すると、一時ファイルを使用して古いテーブルのデータ ファイルが置き換えられます。 MySQL 5.6 以降では、この操作はオンライン DDL です。この方法ではテーブルデータファイルのスキャンが必要となり、大きなテーブルの場合は非常に時間がかかることに注意してください。オンラインサービスの場合は、業務のピーク時間を避けて慎重に操作する必要があります。 知らせ: このようなプロセスがあると仮定します: テーブルtを一度再構築し、 まとめこの記事は、実際の問題から始まり、問題を再現し、問題を分析し、問題を解決します。各ステップは詳細に分析されています。スペースが限られているため、詳細が詳細に説明されていない部分があり、読者は自分で理解する必要があります。 これで、MySQL テーブルスペースのリカバリに対する正しいアプローチに関するこの記事は終了です。MySQL テーブルスペースのリカバリに関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Vue の新しい組み込みコンポーネントの使用方法の詳細な説明
序文: MySQL で SQL 文を実行すると、予想した時間内に文が完了しません。このような場合、通...
/etc/my.confファイルで、[mysqld]の下に次の行を追加します: skip-grant...
Nginx を使用して同じドメイン名で複数のプロジェクトを構成するには、次の 2 つの方法があります...
1. 背景Sysbench は、システムのハードウェア パフォーマンスをテストできるストレス テスト...
目次JavaScript オブジェクト1. 定義2. オブジェクトの分類3. オブジェクトを定義する...
CSS によるテキストの切り捨てテキストを自動的に切り捨てるスタイル コードを実装するには、次のコー...
1. はじめにMySQL ロックは、その範囲に応じて、グローバル ロック、テーブル ロック、行ロック...
この記事では、CSS で 2 つの固定列と 1 つのアダプティブ列を実装するいくつかの方法を紹介し、...
目次序文始めるReactライフサイクルリアクトファイバーリアクトセットステートReactイベントメカ...
レスポンシブレイアウト開発の基礎知識この章は主に以下の部分に分かれています• レスポンシブデザインを...
静的ウェブサイトをホストできるサーバーは数多くあります。この記事では、nginx、apache、to...
位置の 4 つのプロパティ値は次のとおりです。 1.相対的な2.絶対3.修正4.静的これら 4 つの...
インデックスの簡単な紹介は次のとおりです。インデックスを追加する目的は、データベース クエリのパフォ...
説明する: fuser は、現在ディスク上のファイル、マウント ポイント、さらにはネットワーク ポー...
1. WEBを理解するWeb ページは主にテキスト、画像、ハイパーリンクなどの要素で構成されていま...