Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL :réduction de la taille du fichier ibdata pour les tables MyISAM

ibdata1 et MyISAM s'excluent mutuellement.

La première chose à faire est de compter le nombre de tables utilisant les deux moteurs de stockage :

SELECT COUNT(1) EngineCount,engine
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','performance_schema','mysql')
GROUP BY engine;

Si CERTAINES tables sont InnoDB :

Effectuer mon nettoyage d'InnoDB

Si vous n'avez que des tables MyISAM et aucune table InnoDB :

Tout d'abord, éliminez toute trace d'InnoDBFaites ce qui suit :

STEP01) Ajoutez ceci à my.cnf

[mysqld]
skip-innodb

STEP02) service mysql restart

ÉTAPE03) rm -f /var/lib/mysql/ibdata1 /var/lib/mysql/ib_logfile*

Après ces étapes, vous pouvez effectuer une compression de chaque table MyISAM comme ceci :

Pour la table mydb.mytable qui est MyISAM, exécutez simplement l'une des actions suivantes :

  • OPTIMIZE TABLE mydb.mytable;
  • ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;

Si vous souhaitez défragmenter toutes vos tables MyISAM, voici un script shell pour le faire...

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

Une fois que vous faites confiance au script visuellement, exécutez-le simplement

mysql ${MYSQL_CONN} < GlobalMyISAMOptmizeTable.sql

Essayez-le !!!

MISE À JOUR 2012-07-25 09:52 EDT

Je voudrais clarifier une de mes suggestions pour la compression de MyISAM

je l'ai dit tout à l'heure

  • OPTIMIZE TABLE mydb.mytable;
  • ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;

Ces commandes sont mécaniquement identiques. OPTIMIZE TABLE effectue une défragmentation de la table MyISAM puis exécute ANALYZE TABLE pour calculer de nouvelles statistiques d'index.

Mécaniquement parlant, c'est ce que ALTER TABLE mydb.mytable ENGINE=MyISAM; fait :

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;