Technical Article

Full and Differential Backup of Select Databases

,

Full and Differential Backup of Select Databases with Calculating Disk Space and Checking if a Database is in Use With Selections

CREATE procedure DP_DiffDatabaseBackup @@DatabaseType varchar(5)
as
begin

-- Variable declaration for the backups

declare @LogFileInfo varchar(255)
declare @Date varchar(10)
declare @DatabaseName varchar(255)
declare @StatusReport varchar(1000)
declare @DirName varchar(255)
declare @ArcDirName varchar(255)
declare @SQL varchar (255)
declare @SQL2 varchar (255)
declare @Counter tinyint
set @DirName = 'D:\SQL2000\DiffBack\'
set @ArcDirName = 'D:\SQL2000\DiffArch\'
set @counter = 1
set @LogFileInfo = ''
set @Date = ''
set @StatusReport=''
set @SQL2=''

-- Checking for enough free space to perform the backups

declare @FileText varchar(255)
declare @FileTextLength tinyint
declare @FileSize varchar(255) 
declare @FileSizeInMB bigint

set @FileTextLength = 1

create table #DirName
(
context varchar(255)
)

set @SQL2 = 'dir D:\SQL2000\Data\' + @@DatabaseType + '*'
insert into #DirName exec xp_cmdshell @SQL2

select @FileText=Rtrim(Ltrim(context)) from #DirName where context like '%file(s)%'

set @FileSize = replace(@FileText,' bytes','')
set @FileSize = replace(@FileSize,'File(s)','')

while @FileTextLength < len(@FileSize)
begin
if right(left(@FileSize,@FileTextLength),1) = ' '
break
set @FileTextLength = @FileTextLength + 1
end

set @FileSize = right(@FileSize,(len(@FileSize) - @FileTextLength))
set @FileSize = replace(@FileSize,' ','')
set @FileSize = replace(@FileSize,',','')
set @FileSize = rtrim(ltrim(@FileSize))

set @FileSizeInMB = cast(@FileSize as bigint)/1024/1024

select @FileSizeInMB

drop table #DirName

create table #DriveSpace
(
DriveName char(1),
DriveSpace int
)

insert into #DriveSpace exec xp_fixeddrives

if (select DriveSpace from #DriveSpace where DriveName = 'D') < @FileSizeInMB
set @StatusReport =  @StatusReport + ' Not enough disk space to perform backups... ' 
else
begin

-- Backup Commencing

-- Archiving differential database backups to the archive folder

set @SQL = 'copy ' + @DirName + '*Diff.bak ' + @ArcDirName + '*' 
exec xp_cmdshell @SQL

if @@error <> 0 
begin
set @StatusReport = @StatusReport + ' Unable to archive the backup file... ' 
return
end

set @SQL = 'del ' + @DirName + '*Diff.bak ' 
exec xp_cmdshell @SQL

if @@error <> 0 
begin
set @StatusReport = @StatusReport + ' Unable to delete all the files in the backup folder... ' 
return
end


-- Creating a temp table to populate the log file information

create table #LogFiles
(
LogFileInfo varchar(255)
)

-- Creating a temp table to populate the database information

create table #PopulateDatabases
(
ID tinyint identity,
DatabaseName varchar(255) not null
)

-- Inserting all active databases to the temp table

insert into #PopulateDatabases 
select name from master.dbo.sysdatabases d  
where (d.status & 992 = 0)  
and name like @@DatabaseType + '%'
and ((DATABASEPROPERTY(d.name, 'issingleuser') = 0 and (has_dbaccess(d.name) = 1)) 
or  ( DATABASEPROPERTY(d.name, 'issingleuser') = 1 
and not exists  (select * from master.dbo.sysprocesses p where dbid = d.dbid and p.spid <> @@spid)))

-- Getting the log file information

insert into #LogFiles exec xp_cmdshell 'dir /O-D E:\SQL2000\log'
delete from #LogFiles where LogFileInfo not like '%ldf%' or LogFileInfo is null

-- Process of backing up starts here

while @counter <= (select max([ID]) from #PopulateDatabases)
begin

select @DatabaseName=DatabaseName from #PopulateDatabases where [ID] = @counter
select @LogFileInfo = LogFileInfo from #LogFiles where LogFileInfo like '%'+@DatabaseName+'%'

if @@rowcount <> 0
begin

set @Date = Left(@LogFileInfo,10)
if cast(@Date as datetime) > getdate()-2
begin

select distinct(logical_name) from msdb..backupfile
where logical_name like @@DatabaseType + '%' and logical_name like '%'+@DatabaseName+'%'

if @@rowcount = 0
begin

set @StatusReport = @StatusReport + ' The Database ' + @DatabaseName + ' has never been backed up before... Backing up for the first time...'

set @SQL = 'backup database ' + @DatabaseName + ' to disk =' + ''''
set @SQL = @SQL +  'D:\SQL2000\FullBack\' + @DatabaseName + '_'
set @SQL = @SQL + (convert(varchar(8), getdate(),112) )
set @SQL = @SQL + '_Full.bak' + ''''

exec (@sql)

set @StatusReport = @StatusReport + ' The Database ' + @DatabaseName + ' has been backed up successfully...'

end

set @SQL = 'backup database ' + @DatabaseName + ' to disk =' + ''''
set @SQL = @SQL + @DirName + @DatabaseName + '_'
set @SQL = @SQL + (convert(varchar(8), getdate(),112) )
set @SQL = @SQL + '_Diff.bak' + ''''  + ' with DIFFERENTIAL '

exec (@sql)

set @StatusReport = @StatusReport + ' The Database ' + @DatabaseName + ' has been backed up successfully...'

end

end

set @counter = @counter + 1

end

-- Dropping the temp tables

drop table #PopulateDatabases
drop table #LogFiles

end

drop table #DriveSpace


-- Displaying error messages

declare @MailSubject varchar(255)
set @MailSubject = (select @@servername)
set @MailSubject = 'SQL Server Differential Backup Report of ' + @@DatabaseType + ' Databases on Server : ' + @MailSubject
EXEC xp_sendmail @recipients = 'databaseadministrators@abcd.com', 
   @message = @StatusReport,
   @subject = @MailSubject

end
GO

Rate

Share

Share

Rate