Ho questa procedura:

codice:
CREATE PROCEDURE optimize_tables()
BEGIN
    UPDATE configs SET value = "1" WHERE name = "db_maintenance"; 

set @a=null,@c=null,@b=concat("show tables where",ifnull(concat("`Tables_in_",database(),"` like '",@c,"' and"),''),"  (@a:=concat_ws('`,`',@a, `Tables_in_",database(),"`))");
 
    Prepare `bd` from @b;
    EXECUTE `bd`;
    DEALLOCATE PREPARE `bd`;
 
    set @a:=concat('optimize table `',@a,'`');
    PREPARE `sql` FROM @a;
    EXECUTE `sql`;
    DEALLOCATE PREPARE `sql`;
 
    set @a=null,@b=null,@c=null;
    UPDATE configs SET `value` = "0" WHERE name = "db_maintenance";
    UPDATE configs SET `value` = NOW() WHERE name = "last_optimization";
END$$
DELIMITER ;
che viene eseguita secondo lo scheduling:
codice:
CREATE EVENT optimizeDBEvent

    ON SCHEDULE EVERY 1 WEEK

     

    DO CALL optimize_tables();

solo che, quando la eseguo inserisco nella tabella configs il campo maintenance a 1 e il sito diventa "out of service" per qualche minuto.

Posso evitare di metterlo down e fare comunque l'ottimizzazione?