Stored procedure per archiviare una tabella
Categories: MySQL
Tags:
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).

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
29 Dic 2007 inandrea
Come detto da Inandrea nell’articolo. abbiamo usato questo script a lavoro su una tabella di log. In questa tabella salvavamo le eccezioni verificatesi in un programma, serializzandole come blob, e deserializzandole potevamo controllare lo stack trace di tutte le eccezioni verificatesi :). La cosa bella è che quando archiviavamo i vecchi log, la tabella di 60 MB diventava qualcosa tipo 4MB!