MySQLサーバーのHD容量が不足しています。私の大きなテーブルのほとんどは、InnoDBエンジンを使用しています(ミッションクリティカルな理由はありません)。恐ろしい 'dropデータベースがinnodb disk-space' 応答を回復するのを回避するために、私はより良くしたいと思います2つのエンジンがどのようにデータをディスクに保存するかを理解します。
DiskSpaceのMySQLの使用はかなり予測可能です。
Information_schemaは、両方のストレージエンジンで使用されているスペースの量をすばやく提供できます。ただし、innodb_file_per_tableを使用してInnoDBを構成する方がはるかに優れていますこのようにして、個々のInnoDBテーブルのディスクスペースを細かく管理できます。 innodb_file_per_tableがない場合、ibdata1は大きくなり、決して縮小しません。
私はInnoDBのクリーンアップに関する素晴らしい記事を一度だけ書きました。
MyISAMについては、次のいずれかを定期的に実行する必要があります。
OPTIMIZE TABLE myisam-tablename
_;ALTER TABLE myisam-tablename ENGINE=MyISAM; ANALYZE TABLE myisam-tablename
_;これらはMyISAMを圧縮して、MyISAMテーブルコンポーネント(.MYDおよび.MYI)に未使用のデータとインデックスページがないようにします。
このクエリを使用して、ディスク容量の使用状況を手動で監視できます。
_SELECT IFNULL(B.engine,'Total') "Storage Engine", CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),' ',SUBSTR(' KMGTP',pw+1,1),'B') "Data Size", CONCAT(LPAD(REPLACE(FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '),' ',SUBSTR(' KMGTP',pw+1,1),'B') "Index Size", CONCAT(LPAD(REPLACE(FORMAT(B.TSize/POWER(1024,pw),3),',',''),17,' '),' ',SUBSTR(' KMGTP',pw+1,1),'B') "Table Size" FROM (SELECT engine,SUM(data_length) DSize,SUM(index_length) ISize,SUM(data_length+index_length) TSize FROM information_schema.tables WHERE table_schema NOT IN ('mysql','information_schema','performance_schema') AND engine IS NOT NULL GROUP BY engine WITH ROLLUP) B,(SELECT 3 pw) A ORDER BY TSize;
_
これにより、エンジンストレージエンジンのデータとインデックスが占めるスペースの量がわかります。クエリの最後に次の句があることに注意してください:(SELECT 3pw)。数値を変更して、異なる単位でレポートを生成します
_(SELECT 0 pw) for Bytes
(SELECT 1 pw) for KiloBytes
(SELECT 2 pw) for MegaBytes
(SELECT 3 pw) for GigaBytes
(SELECT 4 pw) for TeraBytes
(SELECT 5 pw) for PetaBytes (Write me if you every get numbers this high)
_
InnoDBに関して言えば、innodb_file_per_tableを使用する場合、_.ibd
_ファイルのファイルサイズとdata_length + index_lengthの合計の間に違いがあることに気付くでしょう。
InnoDBテーブル_mydb.mytable
_の場合、次の比較を行う必要があります。
ls -l /var/lib/mysql/mydb/mytable.ibd | awk '{print %5}'
_を実行してファイルのサイズを取得しますSELECT data_length+index_length FROM information_schema.tables WHERE table_schema='mydb' AND table_name='mytable';
_filesize > (data_length+index_length) * 1.1
の場合は、次のようにテーブルをドラッグする必要があります:_ALTER TABLE mydb.mytable ENGINE=InnoDB;
_これにより、一時テーブルが作成され、実際のデータページとインデックスページのみが一時テーブルにコピーされ、元のテーブルが削除され、一時テーブルの名前がmydb.mytableに戻されます。 1つのコマンドによるインスタントテーブル圧縮。営業時間外にすべてのテーブル圧縮を計画してください。
MyISAMは、実際に使用されているスペースを反映してディスクに割り当てます。外部キー、トランザクション、またはInnoDBに固有のその他の機能を使用していない場合は、MyISAMに簡単に変換できます。 InnoDBは書き込みが速く、MyISAMは読み取りが速くなります。最終的には、ストレージエンジンを任意に変更する前に、エンジン間の違いを詳細に調査することをお勧めします。
これは、過去にInnoDBテーブルスペースを解放するために使用した手順です。