ibdata1 y MyISAM son mutuamente excluyentes.
Lo primero que debe hacer es contar cuántas tablas usan ambos motores de almacenamiento:
SELECT COUNT(1) EngineCount,engine
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','performance_schema','mysql')
GROUP BY engine;
Si ALGUNAS tablas son InnoDB:
Realizar mi Limpieza de InnoDB
- Cómo:limpiar un motor de almacenamiento mysql InnoDB?
- https://dba.stackexchange.com/questions/8982/existe-alguna-mejor-manera-de-reducir-el-tamaño-de-ibdata-en-mysql/ 8983#8983
Si solo tiene tablas MyISAM y no tablas InnoDB:
Primero, elimine cualquier rastro de InnoDBHaga lo siguiente:
PASO01) Agregue esto a my.cnf
[mysqld]
skip-innodb
PASO 02) service mysql restart
PASO 03) rm -f /var/lib/mysql/ibdata1 /var/lib/mysql/ib_logfile*
Después de estos pasos, puede realizar una compresión de cada tabla MyISAM como esta:
Para la tabla mydb.mytable que es MyISAM, simplemente ejecute uno de los siguientes:
OPTIMIZE TABLE mydb.mytable;
ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;
Si desea desfragmentar todas sus tablas MyISAM, aquí hay un script de shell para hacerlo...
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 vez que confíes en el script visualmente, simplemente ejecútalo
mysql ${MYSQL_CONN} < GlobalMyISAMOptmizeTable.sql
Pruébalo !!!
ACTUALIZACIÓN 2012-07-25 09:52 EDT
Me gustaría aclarar una de mis sugerencias para la compresión de MyISAM
Dije antes
OPTIMIZE TABLE mydb.mytable;
ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;
Estos comandos son mecánicamente idénticos. OPTIMIZE TABLE
realiza una desfragmentación de la tabla MyISAM y luego ejecuta ANALYZE TABLE
para calcular estadísticas de índice actualizadas.
Mecánicamente hablando, esto es lo que ALTER TABLE mydb.mytable ENGINE=MyISAM;
hace:
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;