Att ta backup på SQL-databaser & loggar är lite lagomt tråkigt.
Gör man det med maintenance-plan’s så får man en miljard (nåja… ett ganska rejält gäng iaf) filer. Kör man det genom någon annan wizard så blir det måttligt bra.
Nu har jag gjort samma backup-script i femtielva varianter och det känns som att det här fungerar riktigt bra.
Vad gör det då? Jo det är tvådelat, ett script för transaktionsloggar och ett för databasbackup.
Det script som är för dbbackup kör man lämpligtvis efter att bandaren har plockat upp filerna på band. Varför? Scriptet kör med “WITH INIT” vilket tömmer filerna och alla transloggar försvinner.
Det andra scriptet kör backup på transloggar på de databaser som är i recovery-model “Full” och inte är satta till “read only”.
Båda scripten kör backup till samma fil vilket gör det mycket enkelt att återläsa, och även att återläsa till en viss tidpunkt.
Databas-backup (Körs lämpligtvis efter bandbackup, en gång per dygn)
-- -------------------------------------------------------------------
-- Funktion: Backup av samtliga lokala databaser
-- Skapat: 2007-05-10 av
--
-- Filerna namnsätts \\XYZ\DBBackup\SQLSERVER-INSTANS\DBnamn.bak
-- -------------------------------------------------------------------
-- Deklaration av variabler
DECLARE
@backupPath sysname,
@DBname sysname,
@backupfile sysname
-- Konfiguration
SET @backupPath = '\\XYZ\DBBackup\'
-- -------------------------------------------------------------------
DECLARE myCur CURSOR
-- Läser ur samtliga lokala databaser (förutom tempdb), sortera systemdatabaser först därefter i namnordning
FOR SELECT NAME FROM MASTER..SYSDATABASES WHERE NAME NOT IN ('tempdb') ORDER BY SID, NAME
FOR READ ONLY
OPEN myCur
-- Start av loop
FETCH NEXT FROM myCur INTO @DBname
WHILE (@@FETCH_STATUS <> -1) BEGIN
-- Sätter sökvägen för backupfilerna
SET @backupfile = @backupPath + RTrim(REPLACE(@@SERVERNAME, '\', '-')) + '\' + RTrim(REPLACE(@DBname, ' ', '_')) + '.bak'
-- Skriver info till användaren/loggen
PRINT ''
PRINT '--- DB-backup to: ' + @backupfile
-- Kör backup
BACKUP DATABASE @DBname TO DISK = @backupfile WITH NAME = 'Scripted backup', DESCRIPTION = 'Full Backup', INIT
-- Fortsätter loopen
FETCH NEXT FROM myCur INTO @DBname
END
CLOSE myCur
DEALLOCATE myCur
-- -------------------------------------------------------------------
Translogg-backup (Körs lämpligtvis varje halvtimme mellan 06:00 & 19:00, om det nu är tiderna då användare arbetar i databaserna)
-- -------------------------------------------------------------------
-- Funktion: Backup av transaktionsloggen på lokala databaser
-- Skapat: 2007-05-10 av
--
-- Filerna namnsätts \\XYZ\DBBackup\SQLSERVER-INSTANS\DBnamn.bak
-- -------------------------------------------------------------------
-- Deklaration av variabler
DECLARE
@backupPath sysname,
@DBname sysname,
@backupfile sysname
-- Konfiguration
SET @backupPath = '\\XYZ\DBBackup\'
-- -------------------------------------------------------------------
DECLARE myCur CURSOR
-- Läser ur samtliga lokala databaser (förutom tempdb & model), sortera systemdatabaser först därefter i namnordning
FOR SELECT NAME FROM MASTER..SYSDATABASES WHERE NAME NOT IN ('tempdb', 'model') ORDER BY SID, NAME
FOR READ ONLY
OPEN myCur
-- Start av loop
FETCH NEXT FROM myCur INTO @DBname
WHILE (@@FETCH_STATUS <> -1) BEGIN
-- Kollar att det är recoverymodel full och att den inte är skrivskyddad
IF (convert(sysname,DatabasePropertyEx(@DBname,'Recovery')) = 'FULL') AND (convert(sysname,DatabasePropertyEx(@DBname,'Updateability')) = 'READ_WRITE') BEGIN
-- Sätter sökvägen för backupfilerna
SET @backupfile = @backupPath + RTrim(REPLACE(@@SERVERNAME, '\', '-')) + '\' + RTrim(REPLACE(@DBname, ' ', '_')) + '.bak'
-- Skriver info till användaren/loggen
PRINT ''
PRINT '--- Log-backup to: ' + @backupfile
-- Kör backup
BACKUP LOG @DBname TO DISK = @backupfile WITH NAME = 'Scripted backup', DESCRIPTION = 'Logbackup', NOINIT
END
-- Fortsätter loopen
FETCH NEXT FROM myCur INTO @DBname
END
CLOSE myCur
DEALLOCATE myCur
-- -------------------------------------------------------------------
Det som är (mest) imponerande är att det finns kommentarer!