diff --git a/SQL_full_backup b/SQL_full_backup new file mode 100644 index 0000000..0127c66 --- /dev/null +++ b/SQL_full_backup @@ -0,0 +1,122 @@ +DECLARE @FILEPATH NVARCHAR(255) -- servername +SET @FILEPATH = '[FILEPATH LIKE: \\SERVERNAME\SHARENAME\FOLDERNAME]' + +DECLARE @name NVARCHAR(256) -- database name +DECLARE @bakLocation NVARCHAR(255) -- Backup location +DECLARE @path NVARCHAR(512) -- path for backup files +DECLARE @fileName NVARCHAR(512) -- filename for backup +DECLARE @fileDate NVARCHAR(40) -- used for file name +DECLARE @backupHistoryDate NVARCHAR(40) -- used for file name +DECLARE @fileExtention NVARCHAR(10) -- file extension + +DECLARE @sendSucceeded NVARCHAR(3) +DECLARE @errorexists bit +DECLARE @succeededbaks NVARCHAR(MAX) +DECLARE @failedbaks NVARCHAR(MAX) + +DECLARE @csubject NVARCHAR(255) +DECLARE @cbody NVARCHAR(MAX) +DECLARE @delDate Datetime +DECLARE @recipients NVARCHAR(50) + +-- customizable variables +SET @sendSucceeded = 'no' -- decide to send mail everytime [yes] or only on errors [no] +SET @fileExtention = 'full.bak' -- [full.bak] or [diff.bak] +-- specify the backup location path / share until last static folder +SET @bakLocation = @FILEPATH +'\' + (CASE WHEN SERVERPROPERTY('InstanceName') IS NULL THEN 'MSSQL\' ELSE '\' END) +SET @recipients = '[RECIPIENTS-MAIL-ADRESSES LIKE: user.example@mail.com]' + +-- you can change the date difference between today and last created backups (second parameter must be negative) +SET @delDate = DATEADD(DAY, -15, GETDATE()) + +-- delete backup_history older than XX days +SET @backupHistoryDate = FORMAT(DATEADD(DAY, -22, GETDATE()), 'yyyy-MM-dd_hh-mm-ss') + +-- don't touch these variables! +-- mail html body +SET @cbody = ' + + + ' +SET @failedbaks = '

Fehlerhafte Aktionen

' +SET @succeededbaks = '

Erfolgreiche Aktionen:

' +SET @errorexists = 1 + + +DECLARE db_cursor CURSOR READ_ONLY FOR +SELECT name FROM master.sys.databases WHERE name NOT IN ('master','model','msdb','tempdb') -- exclude these databases +AND state = 0 -- database is online +AND is_in_standby = 0 -- database is not read only for log shipping + +OPEN db_cursor +FETCH NEXT FROM db_cursor INTO @name + +WHILE @@FETCH_STATUS = 0 +BEGIN + -- specify filename format + SET @fileDate = FORMAT(GETDATE(), 'yyyy-MM-dd_hh-mm-ss') + + -- specify database backup directory @name = databasename as last folder + SET @path = @bakLocation + @name + '\' + + BEGIN TRY + -- create subfolders until path end + EXECUTE master.dbo.xp_create_subdir @path + END TRY + BEGIN CATCH + SET @errorexists = 1 + SET @failedbaks += ' Pfad [' + @path + '] konnte nicht erstellt werden
' + END CATCH + + SET @fileName = @path + @name + '_' + @fileDate + '.' + @fileExtention + BEGIN TRY + BACKUP DATABASE @name TO DISK = @fileName WITH NOFORMAT, NOINIT, NAME = @name, SKIP, REWIND, NOUNLOAD, COMPRESSION, STATS = 10 + -- changeable backup procedure + -- EXECUTE master.dbo.xp_delete_file @FileType = 0 [backup=0 or log=1], @FolderPath = @path, @FileExtension = N'bak', @Date = @DeleteDate, @Subfolder = 1 + EXECUTE master.dbo.xp_delete_file 0, @path, @fileExtention, @delDate, 1 + + SET @succeededbaks += ' Full Backup [' + @name + '_' + @fileDate + '.' + @fileExtention + ']
' + + ' Bereinigung Backupdateien älter ' + CONVERT(VARCHAR(25), @delDate, 120) + '
' + + ' Bereinigung Backup Log älter ' + CONVERT(VARCHAR(25), @backupHistoryDate, 120) + '
' + + ' Pfad: ' + @path + '

' + SET @errorexists = 0 + END TRY + BEGIN CATCH + SET @errorexists = 1 + SET @failedbaks += ' Full Backup [' + @name + '_' + @fileDate + '.' + @fileExtention + ']
' + + ' Bereinigung Backupdateien älter ' + CONVERT(VARCHAR(25), @delDate, 120) + '
' + + ' Bereinigung Backup Log älter ' + CONVERT(VARCHAR(25), @backupHistoryDate, 120) + '
' + + ' Pfad: ' + @path + '

' + END CATCH + + FETCH NEXT FROM db_cursor INTO @name +END + + +IF (@errorexists = 0) +BEGIN + SET @failedbaks += ' Keine Fehler' +END +SET @failedbaks += '

' +SET @succeededbaks += '

' +SET @cbody = @failedbaks + @succeededbaks + + ' + ' + + IF (@errorexists = 0) +BEGIN + IF (@sendSucceeded = 'yes') + BEGIN + SET @csubject = '[Erfolgreich] Volle SQL-Backups auf [' + @@SERVERNAME + (CASE WHEN SERVERPROPERTY('InstanceName') IS NULL THEN '\MSSQL' ELSE '' END) + ']' + EXECUTE msdb.dbo.sp_send_dbmail @body_format = 'HTML' ,@subject= @csubject ,@body= @cbody, @recipients=@recipients + END +END +ELSE +BEGIN + + SET @csubject = '[Fehlerhaft] Volle SQL-Backups auf [' + @@SERVERNAME + (CASE WHEN SERVERPROPERTY('InstanceName') IS NULL THEN '\MSSQL' ELSE '' END) + ']' + EXECUTE msdb.dbo.sp_send_dbmail @body_format= 'HTML', @subject= @csubject ,@body= @cbody, @recipients=@recipients +END + + CLOSE db_cursor +DEALLOCATE db_cursor \ No newline at end of file