2009-06-23 16 views
16

Me gustaría OPTIMIZE todas las tablas actualmente fragmentadas. Estas tablas deben tener information_schema.DATA_FREE > 0.Mysql OPTIMIZE TABLE para todas las tablas fragmentadas

¿Es posible optimizar todas las tablas con esta propiedad en un comando en SQL o tendré que escribir el código externo para hacer esto?

Respuesta

36

se puede hacer algo como esto:

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

Alternativamente, si el primero falla, intente:

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

ligeros cambios requeridos a trabajar para mí, pero con una buena aproximación. SELECCIONE concat ("OPTIMIZE TABLE", table_schema, ".", Table_name, ";") FROM information_schema.tables WHERE DATA_FREE> 0 EN OUTFILE '/tmp/optimize.sql'; FUENTE /tmp/optimize.sql; –

+0

Necesitas algunos backticks cat-ed en torno a table_schema y table_name, de lo contrario te debo una cerveza, muchas gracias. –

1

bien, esta es una entrada antigua, pero esto se necesita.

Phil Dufault http://www.dufault.info/blog/a-script-to-optimize-fragmented-tables-in-mysql/ ha escrito un guión maravilloso, es decir en 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 

y eso es todo. Lo he estado utilizando en una serie de servidores desde hace un tiempo.

Cuestiones relacionadas