ibdata1とMyISAMは相互に排他的です。
最初にすべきことは、両方のストレージエンジンを使用するテーブルの数を数えることです。
SELECT COUNT(1) EngineCount,engine
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','performance_schema','mysql')
GROUP BY engine;
一部のテーブルがInnoDBの場合:
InnoDBのクリーンアップを実行する
- ハウツー:クリーンアップmysql InnoDBストレージエンジン?
- https://dba.stackexchange.com/questions/8982/is-there-any-best-way-to-reduce-the-size-of-ibdata-in-mysql/ 8983#8983
MyISAMテーブルのみがあり、InnoDBテーブルがない場合:
まず、InnoDBDoの痕跡をすべて削除します。
STEP01)これをmy.cnfに追加します
[mysqld]
skip-innodb
STEP02)service mysql restart
STEP03)rm -f /var/lib/mysql/ibdata1 /var/lib/mysql/ib_logfile*
これらの手順の後、次のように各MyISAMテーブルの圧縮を実行できます。
MyISAMであるテーブルmydb.mytableに対して、次のいずれかを実行します。
-
OPTIMIZE TABLE mydb.mytable;
-
ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;
すべてのMyISAMテーブルを最適化する場合は、これを行うためのシェルスクリプトを次に示します...
MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
SQL="SELECT CONCAT('OPTIMIZE TABLE ',table_schema,'.',table_name,';') "
SQL="${SQL} FROM information_schema.tables "
SQL="${SQL} WHERE engine='MyISAM' AND table_schema NOT IN "
SQL="${SQL} ('information_schema','performance_schema','mysql')"
mysql ${MYSQL_CONN} -ANe"${SQL}" > GlobalMyISAMOptmizeTable.sql
less GlobalMyISAMOptmizeTable.sql
スクリプトを視覚的に信頼したら、実行するだけです
mysql ${MYSQL_CONN} < GlobalMyISAMOptmizeTable.sql
試してみてください!!!
UPDATE 2012-07-25 09:52 EDT
MyISAMの圧縮に関する私の提案の1つを明確にしたいと思います
先ほど言いました
-
OPTIMIZE TABLE mydb.mytable;
-
ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;
これらのコマンドは機械的に同じです。 OPTIMIZE TABLE
MyISAMテーブルのデフラグを実行してから、ANALYZE TABLE
を実行します 新しいインデックス統計を計算します。
機械的に言えば、これはALTER TABLE mydb.mytable ENGINE=MyISAM;
です。 する:
CREATE TABLE mydb.mytabletmp LIKE mydb.mytable;
INSERT INTO mydb.mytabletmp SELECT * FROM mydb.mytable;
ALTER TABLE mydb.mytable RENAME mydb.mytablezap;
ALTER TABLE mydb.mytabletmp RENAME mydb.mytable;
DROP TABLE mydb.mytablezap;