Ecco a voi un rapido esempio su come creare una stored procedure su mysql che crea un backup di una tabella e la svuota. Il backup viene effettuato su una tabella di tipo ARCHIVE, quindi compressa e senza chiavi primarie. Naturalmente per adattare lo script alle vostre esigenze cambiate la struttura ed il nome della tabella nelle “SET” delle variabili “backup_table_name” e “backup_table_structure”, con la struttura della tabella che volete archiviare eliminando chiavi primarie, campi con autoincremento ed eventuali vincoli di integrità (lasciando solo la struttura di base).

mysql logo

Lanciando la stored procedure “CALL BACKUP_TABLE(1)” verrà automaticamente creata una tabella dal nome “backup_nome_tabella_aaaaMMggHHmmss” compressa, e la tabella di origine verrà svuotata. Se preferite che la tabella di origine non venga svuotata passate alla stored procedure il parametro “0″: “CALL BACKUP_TABLE(0)”. Nel mio caso lo script si è rivelato utilissimo per fare in automatico il backup di una tabella di log.

DELIMITER $$

DROP PROCEDURE IF EXISTS `BACKUP_TABLE`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `BACKUP_TABLE`(IN empty_table TINYINT(1))
BEGIN
    DECLARE table_name text;
    DECLARE backup_table_name text;
    DECLARE backup_table_structure text;
    DECLARE create_statement text;
    DECLARE insert_statement text;
    DECLARE delete_statement text;

    SET backup_table_name = 'ciccio';
    SET backup_table_structure =  ' ( `campo1` varchar(25) NOT NULL default \'\',
  							`campo2` varchar(25) default NULL,
  							`campo3` varchar(25) default NULL
							)ENGINE=ARCHIVE DEFAULT CHARSET=latin1;' ;

  SELECT CONCAT('backup_', backup_table_name, '_', LEFT(CONCAT(CURDATE()+0, CURTIME()+0), 14)) INTO table_name;

  SELECT CONCAT('CREATE TABLE ', table_name, backup_table_structure) INTO @create_statement;
  PREPARE stmt FROM @create_statement;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;

  SELECT CONCAT('INSERT INTO ', table_name, ' (SELECT * FROM ', backup_table_name, ');') into @insert_statement;
  PREPARE stmt FROM @insert_statement;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;

  IF empty_table > 0 THEN
  	SELECT CONCAT('TRUNCATE TABLE ', backup_table_name) INTO @delete_statement;
  	PREPARE stmt FROM @delete_statement;
  	EXECUTE stmt;
  	DEALLOCATE PREPARE stmt;
  END IF;
END$$

DELIMITER ;

Se sei interessato a questo post, potresti anche provare a leggere:

    No related posts