2009-06-23 6 views
16

Je voudrais OPTIMIZE toutes les tables actuellement fragmentées. Ces tables doivent avoir information_schema.DATA_FREE > 0.Mysql OPTIMIZE TABLE pour toutes les tables fragmentées

Est-il possible d'optimiser toutes les tables avec cette propriété dans une commande dans SQL ou devrais-je écrire le code externe pour faire ceci?

Répondre

36

Vous pouvez faire quelque chose comme ceci:

SELECT concat("OPTIMIZE TABLE ", table_schema,".",table_name,";") 
FROM tables 
WHERE DATA_FREE > 0 
INTO OUTFILE '/tmp/optimize.sql'; 
SOURCE '/tmp/optimize.sql'; 

Par ailleurs, si le premier échoue, essayez:

SELECT concat("OPTIMIZE TABLE ", table_schema,".",table_name,";") 
FROM information_schema.tables 
WHERE DATA_FREE > 0 
INTO OUTFILE '/tmp/optimize.sql'; 
SOURCE /tmp/optimize.sql; 
+9

légères modifications nécessaires pour travailler pour moi, mais une grande approche. SELECT concat ("OPTIMIZE TABLE", schéma_table, ".", Nom_table, ";") FROM information_schema.tables O WH DATA_FREE> 0 INTO OUTFILE '/tmp/optimize.sql'; SOURCE /tmp/optimize.sql; –

+0

Vous avez besoin de quelques balises en arrière autour de table_schema et nom_table, sinon je vous dois une bière, merci beaucoup. –

1

ok, c'est un ancien poste, mais cela est nécessaire.

Phil Dufault http://www.dufault.info/blog/a-script-to-optimize-fragmented-tables-in-mysql/ a écrit un script wonderfull, qui est sur github: https://github.com/pdufault/mysqlfragfinder/blob/master/mysqlfragfinder.sh

vim mysqlfragfinder.sh 
#copy paste from github 
chmod +x ./mysqlfragfinder.sh 
./mysqlfragfinder.sh --user root_username --password root_password 

et qui est tout. Je l'utilise depuis un certain temps sur un certain nombre de serveurs.

Questions connexes