MySQLでデータを削除してもディスク領域が解放されないのはなぜですか

MySQLでデータを削除してもディスク領域が解放されないのはなぜですか

問題の説明

MySQL で delete ステートメントを使用してデータを削除した後、監視ビューの使用可能なディスク容量が増加しなかったり、ディスク使用量が減少しなかったりしました。

解決

削除してもスペースが解放されない理由は、MySQL 独自のメカニズムによるものです。ディスク スペースを解放するには、テーブルを再構築する必要があります。次の操作を参照してください。

  1. テーブル ${table_name} の最適化を実行します。
  2. InnoDB テーブルの場合は、alter table ${table_name} engine = innodb を実行します。

注意すべき問題が 2 つあります。

どちらのコマンドもテーブルを再構築します。ディスク容量が不足しているとき (>90%) は、この操作を実行しないでください。まずディスクを拡張し、操作後にディスクを縮小してください。
どちらのコマンドも、開始時と終了時にメタデータ ロックを取得しようとするため、業務のピーク時間帯には実行しないようにしてください。

問題分析

MySQL のメカニズムでは、delete によって削除された行は削除済みとしてマークされるだけです。削除された行が多く、データ ページ全体 (innodb_page) のすべての行が削除される場合、データ ページは削除済みとしてマークされるだけです。物理的に削除されるわけではなく、常に占有され、再利用されるのを待ちます。

例えば:

data_length は削除前後で変化しませんが、data_free は大幅に増加していることがわかります。これは、データが削除されたにもかかわらず解放されておらず、まだ test1 テーブルに占有されているが、空き状態として表示されていることを意味します。今後新しいデータが書き込まれるときに、新しいディスク領域を申請することなく、直接再利用できます。

この時点で、 alter table test1 engine = innodbを使用して効果を確認します。

data_length と data_free は両方とも空のテーブルになり、innodb_page は 1 つだけ (デフォルトは 16k) になっていることがわかります。

PS: data_free 自体も、テーブルのスペースの断片化を評価するために使用できます。この数値が非常に高い場合は、同じ方法を使用してテーブルを再構築し、ディスク領域を再利用することを検討できます。

上記は、MySQL Delete がデータを削除した後にディスク領域が解放されない理由の詳細です。MySQL がデータを削除した後にディスク領域が解放されない理由の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQLはテーブルデータを復元するためにfrmファイルとibdファイルを使用します
  • MySQL 全体または単一のテーブルデータのエクスポート
  • MySQLデータベースが予期せずクラッシュし、テーブルデータファイルが破損して起動できなくなる問題を解決します。
  • Ubuntu でディスク容量不足により MySQL が起動しない場合の解決策
  • MySQL ストレージ エンジン MyISAM の一般的な問題 (テーブル破損、アクセス不能、ディスク容量不足)
  • lnmp でディスク領域を保護するために MySQL ログをオフにする方法
  • ディスク容量を節約するためにMySQLを縮小するためのいくつかの提案
  • Mysql InnoDB のデータを削除した後にディスク領域を解放する方法
  • MySQL でテーブル データを削除した後もディスク領域がまだ占有されているのはなぜですか?

<<:  ElementUIはカスケードセレクタを実装します

>>:  ウェブデザインにおけるグリッドシステム

推薦する

SpringBoot と Docker の統合の詳細なプロセス

目次1. デモプロジェクト1.1 インターフェースの準備1.2 構成の準備2. Dockerがリモー...

ドッカー専用倉庫港湾建設プロセス

1. 準備1.1 港ダウンロードハーバーダウンロードアドレス:リンクリンクの説明を追加し、必要なバー...

Tomcat マルチインスタンスの展開と構成の原則

1. ファイアウォールをオフにし、Tomcatのインストールに必要なソフトウェアパッケージを/opt...

Web プロジェクト開発における 2 つのトークン理由とサンプル コードの分析

目次質問:プロジェクトには 2 つのトークンがあり、1 つは有効期間が 2 時間 (ショート トーク...

jsは、州、市、地区の3レベルのリンクの非選択ドロップダウンボックスバージョンを実現します。

インターネットで3レベルリンクを検索したところ、すべてオプションで書かれていました。突然、別の方法で...

CentOS 6 は Docker を使用して Redis マスター スレーブ データベース操作例を展開します

この記事では、Docker を使用して Centos6 に Redis マスター/スレーブ データベ...

VueはWebSocketを使用してチャット機能をシミュレートします

この効果は、2つのブラウザが互いにシミュレートしていることを示しています 1. シミュレートされたノ...

ボリュームを使用してホストと Docker コンテナ間でファイルを転送する方法

以前、Docker コンテナとローカル マシン間のファイル転送に関する記事を書きました。しかし、この...

MYSQL スロークエリとログ設定とテスト

1. はじめにスロークエリログを有効にすると、MySQL は指定された時間を超えるクエリステートメン...

近々ブラウザに導入される CSS :is() と :where() の簡単な分析

Safari (Technology Preview 106) および Firefox (バージョン...

MySQL 5.7.17 のインストールと設定方法のグラフィックチュートリアル

この記事では、MySQL 5.7.17のインストールと設定方法を参考までに紹介します。具体的な内容は...

VMware+centOS 8 で http プロトコルに基づく Git サービスを構築する方法

目次1. 原因2. デバイス情報3. 準備4. Apacheをインストールする5. gitを設定する...

フロントエンドフレームワーク Vue における親子コンポーネントデータの双方向バインディングの実装

目次1. 親コンポーネントと子コンポーネント間の一方向の値転送1. 親から子への値の受け渡し2. 子...

Vite2とVue3を使用したウェブサイトの国際化を実現するプロセス全体

目次序文vue-i18nをインストールするロケールの設定getLangs.js の実装i18nインス...

Hadoop 3.2.0 クラスターの構築に関する一般的な考慮事項

1つのポートの変更バージョン 3.2.0 では、ネームノード ページ ポートは 9870、データノー...