ibdata1 e MyISAM são mutuamente exclusivos.
A primeira coisa que você deve fazer é contar quantas tabelas usam os dois mecanismos de armazenamento:
SELECT COUNT(1) EngineCount,engine
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','performance_schema','mysql')
GROUP BY engine;
Se ALGUMAS tabelas são InnoDB:
Execute minha limpeza do InnoDB
- Como:limpar um mecanismo de armazenamento mysql InnoDB?
- https://dba.stackexchange.com/questions/8982/is-there-any-best-way-to-reduce-the-size-of-ibdata-in-mysql/ 8983#8983
Se você tiver apenas tabelas MyISAM e nenhuma tabela InnoDB:
Primeiro, elimine quaisquer vestígios de InnoDBDo o seguinte:
PASSO01) Adicione isso ao my.cnf
[mysqld]
skip-innodb
STEP02)
service mysql restart
STEP03)
rm -f /var/lib/mysql/ibdata1 /var/lib/mysql/ib_logfile*
Após essas etapas, você pode realizar uma compactação de cada tabela MyISAM como esta:
Para a tabela mydb.mytable que é MyISAM, basta executar um dos seguintes procedimentos:
OPTIMIZE TABLE mydb.mytable;
ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;
Se você quiser desfragmentar todas as suas tabelas MyISAM, aqui está um script de shell para fazer isso...
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
Depois de confiar no script visualmente, basta executá-lo
mysql ${MYSQL_CONN} < GlobalMyISAMOptmizeTable.sql
De uma chance !!!
ATUALIZAÇÃO 25/07/2012 09:52 EDT
Gostaria de esclarecer uma das minhas sugestões para compressão do MyISAM
eu disse antes
OPTIMIZE TABLE mydb.mytable;
ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;
Esses comandos são mecanicamente idênticos.
OPTIMIZE TABLE
executa uma desfragmentação da tabela MyISAM e então executa ANALYZE TABLE
para calcular estatísticas de índice frescas. Mecanicamente falando, é isso que
ALTER TABLE mydb.mytable ENGINE=MyISAM;
faz: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;