sql >> Base de Datos >  >> RDS >> Mysql

MySQL:reducción del tamaño del archivo ibdata para tablas MyISAM

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

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;