Backup-Prozedur für MySQL

Die Aufgabe war, eine gespeicherte Prozedur zu schreiben, mit deren Hilfe kritische Tabellen automatisiert mit einem Suffix gesichert werden können. Entstanden ist folgendes Konstrukt. Ein Cursor durchwandert eine Liste mit Tabellenname. Mit diesen und dem Suffix-Parameter werden vorbereitete Anweisungen erstellt und ausgeführt.

drop procedure if exists pro_backup_create;
delimiter $$
create procedure pro_backup_create (table_suffix varchar(50))
begin
declare done int default 0;
declare table_name varchar(50);
declare debug_id varchar(50) default 'pro_backup_create';
declare cur1 cursor for select 'tab1' as tablename
union all select 'tab2'
union all select 'tab3';
declare continue handler for sqlstate '02000' set done = 1;
call dbmc.debug_on(debug_id);
open cur1;
repeat
fetch cur1 into table_name;
if not done then
-- DROP TABLE
set @cmd = concat(
'DROP TABLE IF EXISTS zp.', table_name, '_', table_suffix
);
prepare backup_table_drop from @cmd;
execute backup_table_drop;
deallocate prepare backup_table_drop;
call dbmc.debug_insert(debug_id, @cmd);

-- CREATE TABLE
set @cmd = concat(
'CREATE TABLE zp.', table_name, '_', table_suffix,
' LIKE zp.', table_name
);
prepare backup_table_create from @cmd;
execute backup_table_create;
deallocate prepare backup_table_create;
call dbmc.debug_insert(debug_id, @cmd);

-- INSERT INTO
set @cmd = concat(
'INSERT INTO zp.', table_name, '_', table_suffix,
' SELECT * FROM zp.', table_name
);
prepare backup_table_copy from @cmd;
execute backup_table_copy;
deallocate prepare backup_table_copy;
call dbmc.debug_insert(debug_id, @cmd);
end if;
until done end repeat;
close cur1;
end $$
delimiter ;

Die Protokollierung der Statusmeldungen call dbmc... wird hier beschrieben.

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.