2009-06-23 12 views
16

Ich möchte OPTIMIZE alle derzeit fragmentierten Tabellen. Diese Tabellen sollten information_schema.DATA_FREE > 0 haben.Mysql OPTIMIZE TABLE für alle fragmentierten Tabellen

Ist es möglich, alle Tabellen mit dieser Eigenschaft in einem Befehl in SQL zu optimieren oder muss ich dafür externen Code schreiben?

Antwort

36

Sie können etwas tun:

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

Alternativ, falls die erste ausfällt, versuchen:

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

Leichte Veränderungen für mich arbeiten erforderlich, aber großen Ansatz. SELECT concat ("OPTIMIZE TABLE", Tabellenschema, ".", Tabellenname, ";") FROM information_schema.tables WHERE DATA_FREE> 0 INTO OUTFILE '/tmp/optimize.sql'; SOURCE /tmp/optimize.sql; –

+0

Du brauchst ein paar Backticks, die in der Nähe von table_schema und table_name stehen, sonst schulde ich dir ein Bier, vielen Dank. –

1

ok, das eine alte Post, aber dies erforderlich ist.

Phil Dufault http://www.dufault.info/blog/a-script-to-optimize-fragmented-tables-in-mysql/ ein wunderbares Drehbuch geschrieben hat, ist, dass auf 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 

und das ist alles. Habe es seit einiger Zeit auf einer Reihe von Servern verwendet.

Verwandte Themen