ibdata1 a MyISAM se vzájemně vylučují.
První věc, kterou byste měli udělat, je spočítat, kolik tabulek používá oba moduly úložiště:
SELECT COUNT(1) EngineCount,engine
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','performance_schema','mysql')
GROUP BY engine;
Pokud jsou NĚKTERÉ tabulky InnoDB:
Proveďte čištění InnoDB
- Jak na vyčištění mysql InnoDB storage engine?
- https://dba.stackexchange.com/questions/8982/is-there-any-best-way-to-reduce-the-size-of-ibdata-in-mysql/ 8983#8983
Pokud máte pouze tabulky MyISAM a žádné tabulky InnoDB:
Nejprve odstraňte veškeré stopy InnoDBDProveďte následující:
KROK01) Přidejte toto do my.cnf
[mysqld]
skip-innodb
KROK02) service mysql restart
KROK03) rm -f /var/lib/mysql/ibdata1 /var/lib/mysql/ib_logfile*
Po těchto krocích můžete provést kompresi jednotlivých tabulek MyISAM takto:
Pro tabulku mydb.mytable, která je MyISAM, spusťte jednu z následujících akcí:
OPTIMIZE TABLE mydb.mytable;
ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;
Pokud chcete defragmentovat všechny své tabulky MyISAM, zde je skript shellu, jak to udělat...
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
Jakmile skriptu vizuálně důvěřujete, stačí jej spustit
mysql ${MYSQL_CONN} < GlobalMyISAMOptmizeTable.sql
Vyzkoušejte to !!!
AKTUALIZACE 25.07.2012 09:52 EDT
Rád bych objasnil jeden z mých návrhů na kompresi MyISAM
Řekl jsem dříve
OPTIMIZE TABLE mydb.mytable;
ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;
Tyto příkazy jsou mechanicky totožné. OPTIMIZE TABLE
provede defragmentaci tabulky MyISAM a poté spustí ANALYZE TABLE
pro výpočet nových statistik indexu.
Mechanicky řečeno, toto je to, co ALTER TABLE mydb.mytable ENGINE=MyISAM;
dělá:
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;