2009-06-23 9 views
16

Desidero specificare OPTIMIZE tutte le tabelle attualmente frammentate. Queste tabelle devono avere information_schema.DATA_FREE > 0.Mysql OPTIMIZE TABLE per tutte le tabelle frammentate

E 'possibile ottimizzare tutte le tabelle con questa proprietà in un comando in SQL o dovrò scrivere codice esterno per fare questo?

risposta

36

si può fare qualcosa di simile:

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

In alternativa, se il primo non riesce, provare:

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

leggeri cambiamenti necessari per lavorare per me, ma ottimo approccio. 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; –

+0

Hai bisogno di alcuni backtick catodati lì intorno a table_schema e table_name, altrimenti ti devo una birra, molte grazie. –

1

Ok, questo è un vecchio post, ma questo è necessario.

Phil Dufault http://www.dufault.info/blog/a-script-to-optimize-fragmented-tables-in-mysql/ ha scritto una sceneggiatura meravigliosa, vale a dire su 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 

e questo è tutto. Lo stanno usando da un certo numero di server da un po 'di tempo.

Problemi correlati