Tägliches Backup
Backupdatei
Oft will man sämtliche Backups eines Tages übersichtlich zusammenfassen. Dies kann beispielsweise durch eine Backupdatei erreicht werden, die das aktuelle Datum trägt. Hier ein kleines Skript, das dies demonstriert (für MS SQL Server 7.0 und 2000):
DECLARE @backname VARCHAR(128) SET @backname = 'c:\backup\backup' + CONVERT(VARCHAR, GETDATE(), 104) + '.bak' BACKUP DATABASE Northwind TO DISK = @backname
Erläuterung: Es wird hier die Tatsache ausgenutzt, dass T-SQL das Zusammenbauen von Zeichenketten in einer Variablen unterstützt. Hier wird einfach das aktuelle Datum (Funktion "getdate()") in einen Dateipfad eingebaut und als Variable "@backname" an den Backup-Befehl übergeben. Die Datei heißt dann "backup24.02.2002.bak" und liegt in "C:\backup".
Backupmedium
Um hier flexibler zu sein, kann die Technik der Backup-Medien hilfreich sein: Ein Backup-Medium ist ein logischer Name für eine Backup-Datei oder ein Tape. Dieser logische Name ist unabhängig vom realen Speicherort. Daher kann man einfach täglich ein neues Medium unter demselben Namen anlegen, hinter dem sich aber ein neuer physischer Name verbirgt.
Das folgende Skript demonstriert diese Technik. Es prüft, ob bereits ein Medium namens "BackMedium" vorhanden ist. Falls ja, wird es gelöscht. Dann wird es mit dem aktuellen Namen neu angelegt.
IF EXISTS (SELECT name FROM master.dbo.sysdevices WHERE name = 'BackMedium') BEGIN EXEC sp_dropdevice 'BackMedium' END DECLARE @medname VARCHAR(128) SET @medname = 'c:\backup\media' + CONVERT(VARCHAR, GETDATE(), 104) + '.bak' EXEC sp_addumpdevice 'disk', 'BackMedium', @medname
Erläuterung: Fast dieselbe Technik wie oben, nur wird hier der generierte Name an die Prozedur "sp_addumpdevice" übergeben, mit der ein logisches Backupmedium definiert wird (hier: "media24.02.2002.bak" in "C:\backup").
Automatisches Anlegen täglicher Backupmedien
Das Anlegen täglicher Backup-Medien kann mit dem SQL Server Agent automatisiert werden. Hier ist ein solcher Auftrag (das Skript wurde nachträglich mit dem Enterprise Manager generiert):
BEGIN TRANSACTION DECLARE @JobID BINARY(16) DECLARE @ReturnCode INT SELECT @ReturnCode = 0 IF (SELECT COUNT(*) FROM msdb.dbo.syscategories WHERE name = N'[Uncategorized (Local)]') < 1 EXECUTE msdb.dbo.sp_add_category @name = N'[Uncategorized (Local)]' -- Auftrag mit demselben Namen löschen (falls vorhanden) SELECT @JobID = job_id FROM msdb.dbo.sysjobs WHERE (name = N'DailyBackupMedia') IF (@JobID IS NOT NULL) BEGIN -- Überprüfen, ob es sich um einen Multiserverauftrag handelt IF (EXISTS (SELECT * FROM msdb.dbo.sysjobservers WHERE (job_id = @JobID) AND (server_id <> 0))) BEGIN -- Dies ist der Fall, daher Skript abbrechen RAISERROR (N'Auftrag ''DailyBackupMedia'' kann nicht importiert werden, da bereits ein Multiserverauftrag mit diesem Namen vorhanden ist.', 16, 1) GOTO QuitWithRollback END ELSE -- [Lokalen] Auftrag löschen EXECUTE msdb.dbo.sp_delete_job @job_name = N'DailyBackupMedia' SELECT @JobID = NULL END BEGIN -- Auftrag hinzufügen EXECUTE @ReturnCode = msdb.dbo.sp_add_job @job_id = @JobID OUTPUT , @job_name = N'DailyBackupMedia', @owner_login_name = N'SQLSERV\nka', @description = N'Keine Beschreibung verfügbar.', @category_name = N'[Uncategorized (Local)]', @enabled = 1, @notify_level_email = 0, @notify_level_page = 0, @notify_level_netsend = 0, @notify_level_eventlog = 3, @delete_level= 0 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback -- Auftragsschritte hinzufügen EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id = 1, @step_name = N'Create Backup Media' , @command = N'if exists (select name from master.dbo.sysdevices where name = ''BackMedium'') begin exec sp_dropdevice ''BackMedium'' end declare @medname varchar(128) set @medname = ''c:\backup\media'' + convert(varchar, getdate(), 104) + ''.bak'' exec sp_addumpdevice ''disk'', ''BackMedium'', @medname' , @database_name = N'master', @server = N'', @database_user_name = N'', @subsystem = N'TSQL', @cmdexec_success_code = 0, @flags = 0, @retry_attempts = 0, @retry_interval = 1, @output_file_name = N'', @on_success_step_id = 0, @on_success_action = 1, @on_fail_step_id = 0, @on_fail_action = 2 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXECUTE @ReturnCode = msdb.dbo.sp_update_job @job_id = @JobID, @start_step_id = 1 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback -- Auftragszeitpläne hinzufügen EXECUTE @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id = @JobID, @name = N'Daily', @enabled = 1, @freq_type = 4, @active_start_date = 20020224, @active_start_time = 0, @freq_interval = 1, @freq_subday_type = 1, @freq_subday_interval = 0, @freq_relative_interval = 0, @freq_recurrence_factor = 0, @active_end_date = 99991231, @active_end_time = 235959 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback -- Zielserver hinzufügen EXECUTE @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @JobID, @server_name = N'(local)' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback END COMMIT TRANSACTION GOTO EndSave QuitWithRollback: IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION EndSave:
Erläuterung: Nein, das Skript muss man nicht auf Anhieb verstehen. Selbstverständlich kann man den Auftrag auch im Enterprise Manager manuell anlegen: Ein einzelner Schritt, der das Medium anlegt (Skript s. o.), Zeitplan: täglich 0:00 Uhr.
http://faq-o-matic.net/?p=635