I recommend creating SQL Maintenance Plan (read BOL - Simple to Set up in SQL Server) But if you really want a stored proc, I've attached one -- this will backup your LOGS & Databases w/out any downtime. You can execute this concurrent w/ your online & batch applications.
Here ya go --
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
drop PROCEDURE spr_backup_all_db
go
CREATE PROCEDURE spr_backup_all_db
AS
-- Get date for operation start
PRINT 'Process Started'
SELECT GETDATE()
-- create variables
DECLARE @command varchar(400),
@database varchar(30)
-- start cursor to fetch all db's that can have log dumps
DECLARE cur_database CURSOR FOR
SELECT name
FROM master..sysdatabases
WHERE [name] NOT IN ('tempdb', 'master', 'pubs', 'northwind')
FOR read only
OPEN cur_database
FETCH NEXT FROM cur_database INTO @database
PRINT '****************************************'
PRINT 'Setting Truncate on Checkpoint to False'
PRINT '****************************************'
PRINT ' '
WHILE @@fetch_status = 0
-- ensure that dboption 'truncate' is off
BEGIN
SELECT @command = 'sp_dboption '''+ @database +''' , ''trunc. log on chkpt.'', ''false'''
EXECUTE (@command)
-- get next database
FETCH NEXT FROM cur_database INTO @database
END
-- Clean up cursor
CLOSE cur_database
DEALLOCATE cur_database
PRINT '************************************************'
PRINT '************************************************'
PRINT ' Begin End of Day Backups'
PRINT '************************************************'
PRINT '************************************************'
PRINT ' '
-- create cursor for all db's except tempdb and master
DECLARE cur_database CURSOR FOR
SELECT name
FROM master..sysdatabases
WHERE [name] NOT IN ('tempdb', 'master', 'pubs', 'northwind')
FOR read only
OPEN cur_database
FETCH NEXT FROM cur_database INTO @database
WHILE @@fetch_status = 0
BEGIN
-- print current database name
PRINT ' '
PRINT '****************'
PRINT @database
PRINT '****************'
PRINT ' '
-- Check if log backup device exists
IF (SELECT count(*) FROM master..sysdevices WHERE cntrltype = 2 AND name = @database + 'LogBackup') = 0
BEGIN
-- If log device NOT exists check for data device (count = 0)
IF (SELECT count(*) FROM master..sysdevices WHERE cntrltype = 2 AND name = @database + 'Backup') = 0
BEGIN
-- If data device AND log device NOT exists (count = 0) create data and log device and backup up both with overwrite
SELECT @command = 'sp_addumpdevice ''disk'', ''' + @database + 'LogBackUp'', ''e:\' + @database + 'LogBackup.bak'''
EXECUTE (@command)
PRINT ' '
PRINT 'Creating Log Backup Device'
SELECT @command = 'sp_addumpdevice ''disk'', ''' + @database + 'BackUp'', ''e:\' + @database + 'Backup.bak'''
EXECUTE (@command)
PRINT ' '
PRINT 'Creating Database Backup Device'
SELECT @command = 'BACKUP DATABASE ' + @database + ' TO ' + @database + 'Backup WITH init'
EXECUTE (@command)
PRINT ' '
PRINT 'Database Backed Up and Initialized'
SELECT @command = 'BACKUP LOG ' + @database + ' TO ' + @database + 'LogBackup WITH init'
EXECUTE (@command)
PRINT ' '
PRINT 'Transaction Log Backed Up and Initialized'
END
ELSE
-- If data device DOES exits AND log device NOT exits create log device and dump log with overwrite
BEGIN
SELECT @command = 'sp_addumpdevice ''disk'', '''+ @database + 'LogBackUp'', ''e:\' + @database + 'LogBackup.bak'''
EXECUTE (@command)
PRINT ' '
PRINT 'Creating Log Backup Device'
SELECT @command = 'BACKUP LOG ' + @database + ' TO ' + @database + 'LogBackup WITH init'
EXECUTE (@command)
-- IF the transaction dump fails for any reason do a database dump and then the transaction dump
IF (@@error = 3032)
BEGIN
SELECT @command = 'BACKUP DATABASE ' + @database + ' TO ' + @database + 'Backup WITH init'
EXECUTE (@command)
PRINT ' '
PRINT 'Backing up Database due to error in log backup'
SELECT @command = 'BACKUP LOG ' + @database + ' TO ' + @database + 'LogBackup WITH init'
EXECUTE (@command)
PRINT ' '
PRINT 'Transaction Log Backed Up and Initialized'
END
ELSE
BEGIN
PRINT ' '
PRINT 'Transaction Log Backed Up and Initialized'
END
END
END
ELSE
-- If log device DOES exists check for data device
BEGIN
IF (SELECT count(*)FROM master..sysdevices WHERE cntrltype = 2 AND name = @database + 'Backup') = 0
-- If log device DOES exists AND data device NOT exists (count = 0) Create data device and backup both with overwrite
BEGIN
SELECT @command = 'sp_addumpdevice ''disk'', '''+ @database + 'BackUp'', ''e:\' + @database + 'Backup.bak'''
EXECUTE (@command)
PRINT ' '
PRINT 'Creating Database Backup Device'
SELECT @command = 'BACKUP DATABASE ' + @database + ' TO ' + @database + 'Backup WITH init'
EXECUTE (@command)
PRINT ' '
PRINT 'Database Backed Up and Initialized'
SELECT @command = 'BACKUP LOG ' + @database + ' TO ' + @database + 'LogBackup WITH init'
EXECUTE (@command)
PRINT ' '
PRINT 'Transaction Log Backed Up and Initialized'
END
ELSE
-- if log device DOES exist AND data device DOES exist, dump log with append
BEGIN
SELECT @command = 'BACKUP LOG ' + @database + ' TO ' + @database + 'LogBackup'
EXECUTE (@command)
IF (@@error = 3032)
-- IF the transaction dump fails for any reason do a database dump and then the transaction dump
BEGIN
SELECT @command = 'BACKUP DATABASE ' + @database + ' TO ' + @database + 'Backup WITH init'
EXECUTE (@command)
PRINT ' '
PRINT 'Backing up Database due to error in log backup'
SELECT @command = 'BACKUP LOG ' + @database + ' TO ' + @database + 'LogBackup WITH init'
EXECUTE (@command)
PRINT ' '
PRINT 'Transaction Log Backed Up and Initialized'
END
ELSE
BEGIN
PRINT ' '
PRINT 'Transaction Log Backed Up and Initialized'
END
PRINT ' '
PRINT 'Transaction Log Backed Up With Append'
END
END -- get next db
FETCH NEXT FROM cur_database INTO @database
END
-- Clean up cursor
CLOSE cur_database
DEALLOCATE cur_database
-- move end of date backup sets
PRINT ' '
PRINT '***********************************'
PRINT 'Moving Backup files *.BAK'
PRINT '***********************************'
PRINT ' '
PRINT 'Deleting Old Archive Set'
-- delete old set
SELECT @command = 'master..xp_cmdshell ''del e:\Archive\*.bak'''
EXECUTE (@command)
-- copy new set to archive
PRINT ' '
PRINT 'Copying New Set to Archive Folder'
SELECT @command = 'master..xp_cmdshell ''copy e:\*.bak e:\Archive\'''
EXECUTE (@command)
-- create cursor for new backup set
DECLARE cur_database CURSOR FOR
SELECT name
FROM master..sysdatabases
WHERE [name] NOT IN ('tempdb')
FOR read only
OPEN cur_database
FETCH NEXT FROM cur_database INTO @database
WHILE @@fetch_status = 0
BEGIN
PRINT ' '
PRINT '****************'
PRINT @database
PRINT '****************'
PRINT ' '
-- backup all db execept temp with overwirte
IF @database = 'Master'
-- Test if master has a backup device
BEGIN
IF (SELECT count(*)FROM master..sysdevices WHERE cntrltype = 2 AND name = @database + 'Backup') = 0
BEGIN
SELECT @command = 'sp_addumpdevice ''disk'', ''' + @database + 'BackUp'', ''e:\' + @database + 'backup.bak'''
EXECUTE (@command)
PRINT ' '
PRINT 'Creating Database Backup Device'
SELECT @command = 'BACKUP DATABASE ' + @database + ' TO ' + @database + 'Backup WITH init'
EXECUTE (@command)
PRINT ' '
PRINT 'Database Backed Up and Initialized'
END
ELSE
BEGIN
SELECT @command = 'BACKUP DATABASE ' + @database + ' TO ' + @database + 'Backup WITH init'
EXECUTE (@command)
PRINT ' '
PRINT 'Database Backed Up and Initialized'
END
END
ELSE
SELECT @command = 'BACKUP DATABASE ' + @database + ' TO ' + @database + 'Backup WITH init'
EXECUTE (@command)
PRINT 'Backing up Database With Init'
-- Backup all logs except for master with overwrite to restart the days logs
IF @database = 'Master'
BEGIN
PRINT 'NO LOG BACKUP FOR MASTER'
END
ELSE
BEGIN
SELECT @command = 'BACKUP LOG ' + @database + ' TO ' + @database + 'LogBackup WITH INIT'
EXECUTE (@command)
PRINT 'Backing up Log With Init'
END
-- Get next database
FETCH NEXT FROM cur_database INTO @database
END
-- clean up
CLOSE cur_database
DEALLOCATE cur_database
PRINT 'Backups Completed'
SELECT getdate()
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO