ibdata1 und MyISAM schließen sich gegenseitig aus.
Als erstes sollten Sie zählen, wie viele Tabellen beide Speicher-Engines verwenden:
SELECT COUNT(1) EngineCount,engine
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','performance_schema','mysql')
GROUP BY engine;
Wenn EINIGE Tabellen InnoDB sind:
Führen Sie mein CleanUp von InnoDB durch
- Howto:Clean a mysql InnoDB-Speichermodul?
- https://dba.stackexchange.com/questions/8982/gibt-es-einen-besten-weg-um-die-größe-von-ibdata-in-mysql-zu-reduzieren/ 8983#8983
Wenn Sie nur MyISAM-Tabellen und keine InnoDB-Tabellen haben:
Beseitigen Sie zunächst alle Spuren von InnoDB. Gehen Sie wie folgt vor:
STEP01) Fügen Sie dies zu my.cnf hinzu
[mysqld]
skip-innodb
SCHRITT02) service mysql restart
STEP03) rm -f /var/lib/mysql/ibdata1 /var/lib/mysql/ib_logfile*
Nach diesen Schritten können Sie eine Komprimierung der einzelnen MyISAM-Tabellen wie folgt durchführen:
Führen Sie für die Tabelle mydb.mytable, die MyISAM ist, einfach einen der folgenden Schritte aus:
OPTIMIZE TABLE mydb.mytable;
ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;
Wenn Sie alle Ihre MyISAM-Tabellen defragmentieren möchten, finden Sie hier ein Shell-Skript dafür ...
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
Sobald Sie dem Skript visuell vertrauen, führen Sie es einfach aus
mysql ${MYSQL_CONN} < GlobalMyISAMOptmizeTable.sql
Probieren Sie es aus !!!
UPDATE 2012-07-25 09:52 EDT
Ich möchte einen meiner Vorschläge zur Komprimierung von MyISAM verdeutlichen
Ich sagte vorhin
OPTIMIZE TABLE mydb.mytable;
ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;
Diese Befehle sind mechanisch identisch. OPTIMIZE TABLE
führt eine Defragmentierung der MyISAM-Tabelle durch und führt dann ANALYZE TABLE
aus um neue Indexstatistiken zu berechnen.
Mechanisch gesehen ist dies ALTER TABLE mydb.mytable ENGINE=MyISAM;
tut:
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;