ibdata1 en MyISAM sluiten elkaar uit.
Het eerste dat u moet doen, is tellen hoeveel tabellen beide opslagengines gebruiken:
SELECT COUNT(1) EngineCount,engine
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','performance_schema','mysql')
GROUP BY engine;
Als SOMMIGE tabellen InnoDB zijn:
Voer mijn opschoning van InnoDB uit
- Howto:een mysql InnoDB-opslagengine?
- https://dba.stackexchange.com/questions/8982/is-there-any-best-way-to-reduce-the-size-of-ibdata-in-mysql/ 8983#8983
Als u alleen MyISAM-tabellen heeft en geen InnoDB-tabellen:
Verwijder eerst alle sporen van InnoDBDoe het volgende:
STAP01) Voeg dit toe aan mijn.cnf
[mysqld]
skip-innodb
STEP02) service mysql restart
STEP03) rm -f /var/lib/mysql/ibdata1 /var/lib/mysql/ib_logfile*
Na deze stappen kunt u een compressie van elke MyISAM-tabellen als volgt uitvoeren:
Voor de tabel mydb.mytable die MyISAM is, voert u een van de volgende handelingen uit:
OPTIMIZE TABLE mydb.mytable;
ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;
Als je al je MyISAM-tabellen wilt defragmenteren, is hier een shellscript om dit te doen...
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
Zodra u het script visueel vertrouwt, voert u het gewoon uit
mysql ${MYSQL_CONN} < GlobalMyISAMOptmizeTable.sql
Probeer het eens !!!
UPDATE 25-07-2012 09:52 EDT
Ik wil graag een van mijn suggesties voor compressie van MyISAM verduidelijken
Ik zei eerder
OPTIMIZE TABLE mydb.mytable;
ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;
Deze commando's zijn mechanisch identiek. OPTIMIZE TABLE
voert een defragmentatie uit van de MyISAM-tabel en voert vervolgens ANALYZE TABLE
uit om nieuwe indexstatistieken te berekenen.
Mechanisch gezien is dit wat ALTER TABLE mydb.mytable ENGINE=MyISAM;
doet:
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;