3

1 TB に近い大規模な InnoDB データベースがいくつかあります。

代替ストレージでの作業中にスペースを解放するために、スペースが解放されることを期待して、未使用の InnoDB インデックスをいくつか削除しました。

それは何も解放しませんでした。

InnoDB であるため、エンジンは割り当てられた空の領域をさらに挿入してインデックス化するために使用しますか?

4

3 に答える 3

1

ここで答えてください: https://stackoverflow.com/a/8932289/82114

innodb_file_per_table を使用しない場合、ディスク領域を再利用することは可能ですが、非常に面倒で、かなりのダウンタイムが必要です。

「ハウツー」はここにあります: http://dev.mysql.com/doc/refman/5.6/en/innodb-data-log-reconfiguration.html

また、スキーマのコピーをダンプに保持してください。

現在、システム テーブルスペースからデータ ファイルを削除することはできません。システム テーブルスペースのサイズを減らすには、次の手順を使用します。

mysqldump を使用して、すべての InnoDB テーブルをダンプします。

サーバーを停止します。

ibdata および ib_log ファイルを含む、既存のテーブルスペース ファイルをすべて削除します。情報のバックアップ コピーを保持する場合は、MySQL インストールでファイルを削除する前に、すべての ib* ファイルを別の場所にコピーします。

InnoDB テーブルの .frm ファイルをすべて削除します。

新しいテーブルスペースを構成します。

サーバーを再起動します。

ダンプ ファイルをインポートします。

于 2013-09-04T21:11:14.673 に答える
1

InnoDB はデータをテーブルスペースに格納します。デフォルトでは、1 つのテーブルスペースがあり、すべてのデータベースのデータが 1 つのファイルに格納されます。このファイルには、データ ディクショナリ、テーブル、およびインデックスが含まれています。innodb_data_file_pathこのテーブルスペース ファイルを定義するグローバル パラメータがあります。のような構文がありますibdata1:256M:autoextend。これは、最初にサイズ 256 MB のファイルが作成され、データ サイズがこれを超えるたびにファイルが自動拡張されることを意味します。このinnodb_autoextend_increment変数は、各増分がどれだけあるべきかを MB 単位で定義します。

インデックス スペースを取得するにはどうすればよいですか?

最初にすべての InnoDB テーブルをバックアップし、my.ini/my.cnfasの設定を変更してinnodb_file_per_table、MySQL サーバーを再起動する必要があります。これらのテーブルをインポートすると、各テーブルには独自のテーブルスペースがあり、テーブルの削除時にサイズを縮小できます。

考えられる回避策は次のとおりです。

  • テーブルごとに個別のファイル: InnoDB は、グローバル変数 innodb_file_per_table を介して各テーブルのデータ (データ + インデックス) を個別のファイルに格納できるこのオプションを提供します。
  • 表領域サイズの固定: 表領域ファイル サイズの問題を回避する 1 つの方法は、表領域サイズを外挿値に修正する (自動拡張を削除する) ことです。したがって、制限に達したときは、クリーンアップの時期であることがわかります。
  • MyISAM に移動: すべてのテーブル (またはデータベース) について、データがトランザクションなどにとってそれほど重要ではないと思われる場合は、それらを MyISAM に移動します。
于 2012-08-01T05:10:23.113 に答える
0

InnoDBインフラストラクチャを再編成する必要があります。なんで?ibdata1は決して縮小しないからです。innodb_file_per_tableを無効にすると、急いでibdata1が肥大化しますかデータとインデックス以外に、ibdata1には何がありますか?

  • データディクショナリ
  • ダブル書き込みバッファ(バックグラウンドページの書き込みを処理します)
  • バッファの挿入(セカンダリインデックスへの変更を含む)
  • ロールバックセグメント
  • 表領域を元に戻す

そうは言っても、データを移行し、すべてのInnoDBリレーファイルを削除し、次の2つのことでリロードする必要があります。

  • innodb_file_per_tableが有効になっています
  • より大きなトランザクションログ

2010年10月29日にこれを行う方法を書きました:方法:mysql InnoDBストレージエンジンをクリーンアップしますか?

将来的には、個々のInnoDBテーブルを常に縮小することができます。たとえば、mydb.mytableを縮小するには:

ALTER TABLE mydb.mytable ENGINE=InnoDB;
于 2012-08-15T15:14:33.527 に答える