Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL:Reduzierung der ibdata-Dateigröße für MyISAM-Tabellen

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

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;