1 TB に近い大規模な InnoDB データベースがいくつかあります。
代替ストレージでの作業中にスペースを解放するために、スペースが解放されることを期待して、未使用の InnoDB インデックスをいくつか削除しました。
それは何も解放しませんでした。
InnoDB であるため、エンジンは割り当てられた空の領域をさらに挿入してインデックス化するために使用しますか?
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 ファイルをすべて削除します。
新しいテーブルスペースを構成します。
サーバーを再起動します。
ダンプ ファイルをインポートします。
InnoDB はデータをテーブルスペースに格納します。デフォルトでは、1 つのテーブルスペースがあり、すべてのデータベースのデータが 1 つのファイルに格納されます。このファイルには、データ ディクショナリ、テーブル、およびインデックスが含まれています。innodb_data_file_path
このテーブルスペース ファイルを定義するグローバル パラメータがあります。のような構文がありますibdata1:256M:autoextend
。これは、最初にサイズ 256 MB のファイルが作成され、データ サイズがこれを超えるたびにファイルが自動拡張されることを意味します。このinnodb_autoextend_increment
変数は、各増分がどれだけあるべきかを MB 単位で定義します。
インデックス スペースを取得するにはどうすればよいですか?
最初にすべての InnoDB テーブルをバックアップし、my.ini/my.cnf
asの設定を変更してinnodb_file_per_table
、MySQL サーバーを再起動する必要があります。これらのテーブルをインポートすると、各テーブルには独自のテーブルスペースがあり、テーブルの削除時にサイズを縮小できます。
考えられる回避策は次のとおりです。
InnoDBインフラストラクチャを再編成する必要があります。なんで?ibdata1は決して縮小しないからです。innodb_file_per_tableを無効にすると、急いでibdata1が肥大化しますか?データとインデックス以外に、ibdata1には何がありますか?
そうは言っても、データを移行し、すべてのInnoDBリレーファイルを削除し、次の2つのことでリロードする必要があります。
2010年10月29日にこれを行う方法を書きました:方法:mysql InnoDBストレージエンジンをクリーンアップしますか?
将来的には、個々のInnoDBテーブルを常に縮小することができます。たとえば、mydb.mytableを縮小するには:
ALTER TABLE mydb.mytable ENGINE=InnoDB;