ibdata1 e MyISAM si escludono a vicenda.
La prima cosa da fare è contare quante tabelle utilizzano entrambi i motori di archiviazione:
SELECT COUNT(1) EngineCount,engine
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','performance_schema','mysql')
GROUP BY engine;
Se ALCUNE tabelle sono InnoDB:
Esegui la mia pulizia di InnoDB
- Come pulire un motore di archiviazione mysql InnoDB?
- https://dba.stackexchange.com/questions/8982/is-there-any-best-way-to-reduce-the-size-of-ibdata-in-mysql/ 8983#8983
Se hai solo tabelle MyISAM e nessuna tabella InnoDB:
Innanzitutto, elimina qualsiasi traccia di InnoDB. Fai quanto segue:
STEP01) Aggiungi questo a my.cnf
[mysqld]
skip-innodb
STEP02) service mysql restart
PASSO03) rm -f /var/lib/mysql/ibdata1 /var/lib/mysql/ib_logfile*
Dopo questi passaggi, puoi eseguire una compressione di ciascuna tabella MyISAM in questo modo:
Per la tabella mydb.mytable che è MyISAM, esegui semplicemente una delle seguenti operazioni:
OPTIMIZE TABLE mydb.mytable;
ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;
Se vuoi deframmentare tutte le tue tabelle MyISAM, ecco uno script di shell per farlo...
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
Una volta che ti fidi visivamente dello script, eseguilo
mysql ${MYSQL_CONN} < GlobalMyISAMOptmizeTable.sql
Provalo!!!
AGGIORNAMENTO 25-07-2012 09:52 EDT
Vorrei chiarire uno dei miei suggerimenti per la compressione di MyISAM
Ho detto prima
OPTIMIZE TABLE mydb.mytable;
ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;
Questi comandi sono meccanicamente identici. OPTIMIZE TABLE
esegue una deframmentazione della tabella MyISAM e quindi esegue ANALYZE TABLE
per calcolare nuove statistiche sull'indice.
Meccanicamente parlando, questo è ciò che ALTER TABLE mydb.mytable ENGINE=MyISAM;
fa:
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;