none
Auftrag zur Datenbanksicherung endet erfolgreich, sichert aber nicht alle Datenbanken RRS feed

  • Frage

  • Moin,

    ich habe unten stehendes Skript entwickelt, um Datenbanken und Logfiles zu sichern und lasse das in einem Auftrag täglich ausführen. Der Auftrag endet immer erfolgreich, aber es wird nicht jede Datenbank verarbeitet.
    Ich habe die Ausgaben in eine Datei ausgegeben und auch dort ist kein Fehler zu erkennen. Das Skript endet einfach irgendwann, wenn es mit einer der Datenbanken fertig ist. Das ist nicht immer dieselbe, sondern wahllos. Es kann nach der ersten Datenbank enden oder nach der vorletzten. Einmal ist das Skript auch komplett durchgelaufen und hat alles gesichert.
    Woran kann das liegen?

    Wir verwenden MSSQL 2005.

    use master
    
    declare @ID int
    declare @name nvarchar(128)
    declare @recoverymodel tinyint
    declare @befehl nvarchar(4000)
    declare @backupDate varchar(20)
    declare @deleteDate datetime
    declare @verzeichnisBackup nvarchar(4000)
    declare @verzeichnisBackupDatenbank nvarchar(4000)
    declare @verzeichnisBackupDatenbankLog nvarchar(4000)
    declare @aufbewahrungsdauer int
    
    set @verzeichnisBackup = 'F:\Sicherungen'
    set @aufbewahrungsdauer = 5
    
    set @backupDate = convert(varchar(100), getdate(), 20)
    set @backupDate = replace(@backupDate, ':', '')
    set @backupDate = replace(@backupDate, '-', '')
    set @backupDate = replace(@backupDate, ' ', '')
    set @deleteDate = DATEADD(day,-@aufbewahrungsdauer,GETDATE())
    
    --veraltete Dateien löschen
    set @befehl = N'EXECUTE master.dbo.xp_delete_file 0,' + @verzeichnisBackup + ',N''bak'',' + cast(@deleteDate as varchar) + ',1'
    print @befehl
    EXEC master.dbo.xp_delete_file 0,@verzeichnisBackup,'bak',@deleteDate,1
    
    --Alle Datenbanken durchgehen
    declare DBCursor Cursor for
    	select database_id, name, recovery_model from sys.databases where name <> N'tempdb' order by name
    
    open DBCursor
    fetch next from DBCursor into @ID, @name, @recoverymodel
    
    while @@fetch_status = 0
    begin
    	print 'Verarbeite Datenbank ' + @name
    	
    	--Unterordner anlegen
    	set @verzeichnisBackupDatenbank = @verzeichnisBackup + '\' + @name
    	EXEC master.dbo.xp_create_subdir @verzeichnisBackupDatenbank
    
    	--Datenbank sichern
    	set @befehl = 
    		N'Backup Database [' + @name + '] to disk = N''' + 
    		@verzeichnisBackupDatenbank + '\' + @name + '_backup_' +
    		@backupDate + '.bak'' with retaindays = ' + cast(@aufbewahrungsdauer as varchar) + ', ' +
    		'noformat, noinit, skip, rewind, nounload, stats = 10, ' +
    		'name = N''' + @name + '_backup_' + @backupDate + ''''
    	print @befehl
    	EXEC (@befehl)
     
    	--Log sichern
    	if @recoverymodel <> 3
    	begin
    		set @verzeichnisBackupDatenbankLog = @verzeichnisBackupDatenbank + '\log'
    		EXEC master.dbo.xp_create_subdir @verzeichnisBackupDatenbankLog
    
    		set @befehl =
    			N'Backup Log [' + @name + '] to disk = N''' + 
    			@verzeichnisBackupDatenbankLog + '\' + @name + '_backup_Log.bak'''
    		print @befehl
    		EXEC (@befehl)
    	end
    
    	fetch next from DBCursor into @ID, @name, @recoverymodel
    end
    
    close DBCursor
    deallocate DBCursor


    • Bearbeitet Ottersberg Montag, 16. September 2013 06:33
    Montag, 16. September 2013 06:32

Alle Antworten

  • Hallo!

    Da Du keinerlei Fehlerbehandlung im Skript hast, ist es schwierig die Ursache zu ermitteln.

    Hast Du im Errorlog des SQL Servers keine Meldungen?

    Warum verwendest Du noch eine uralte Version, die nicht mehr supported wird? Welches SP hast Du denn da drauf?

    Wenn es nie richtig funktioniert hat, wie habt ihr dann in den vergangenen Jahren gesichert?

    Kennst Du die Skripte von Ola Hallengren?


    Einen schönen Tag noch,
    Christoph Muthmann
    Microsoft SQL Server MVP - Blog

    Dienstag, 17. September 2013 07:31
  • Moin,

    zu deinen Fragen:

    Da Du keinerlei Fehlerbehandlung im Skript hast, ist es schwierig die Ursache zu ermitteln.

    Wenn ich "Ausgabe in eine Datei" mache, sollten Fehler dort nicht mit ausgegeben werden?

    Hast Du im Errorlog des SQL Servers keine Meldungen?

    Nein. Dort steht dasselbe wie im Log. Bis zu einer der Datenbanken funktioniert die Sicherung und dann kommen keine weiteren Meldungen.

    Warum verwendest Du noch eine uralte Version, die nicht mehr supported wird? Welches SP hast Du denn da drauf?

    Umstellung auf 2012 ist für Frühjahr geplant. Der Extended Support läuft ja noch. SP4 ist installiert.
    Für die Umstellung hatten wir jetzt kürzlich erstmalig eine Schulung für MSSQL. Aus dieser Schulung stammt das Skript. Ich habe es auf unsere Verzeichnisstruktur angepasst und die Sicherung der Logfiles hinzugefügt.

    Wenn es nie richtig funktioniert hat, wie habt ihr dann in den vergangenen Jahren gesichert?

    Die Sicherung lief über einen Wartungsplan. Das hat immer gut funktioniert. Die Logfiles wurden hin und wieder manuell gelöscht mit truncate_only, aufgrund fehlenden besseren Wissens. Eigentlich wollte ich die Sicherung erst mit 2012 überarbeiten, aber dann waren letztens die Platten voll und ich habe bereits jetzt damit begonnen.

    Kennst Du die Skripte von Ola Hallengren?

    Nein die kannte ich noch nicht. Ich werde mir das mal ansehen und melde mich wieder.

    Dienstag, 17. September 2013 08:23