05. december 2002 - 12:25
#1
Fra Sql Server Books Online:
Backing up an entire database:
BACKUP DATABASE { database_name | @database_name_var }
TO < backup_device > [ ,...n ]
[ WITH
[ BLOCKSIZE = { blocksize | @blocksize_variable } ]
[ [ , ] DESCRIPTION = { 'text' | @text_variable } ]
[ [ , ] DIFFERENTIAL ]
[ [ , ] EXPIREDATE = { date | @date_var }
| RETAINDAYS = { days | @days_var } ]
[ [ , ] PASSWORD = { password | @password_variable } ]
[ [ , ] FORMAT | NOFORMAT ]
[ [ , ] { INIT | NOINIT } ]
[ [ , ] MEDIADESCRIPTION = { 'text' | @text_variable } ]
[ [ , ] MEDIANAME = { media_name | @media_name_variable } ]
[ [ , ] MEDIAPASSWORD = { mediapassword | @mediapassword_variable } ]
[ [ , ] NAME = { backup_set_name | @backup_set_name_var } ]
[ [ , ] { NOSKIP | SKIP } ]
[ [ , ] { NOREWIND | REWIND } ]
[ [ , ] { NOUNLOAD | UNLOAD } ]
[ [ , ] RESTART ]
[ [ , ] STATS [ = percentage ] ]
]
05. december 2002 - 12:35
#3
/****** Object: Stored Procedure dbo.usp_dbbackup Script Date: 23/12/99 10:34:44 ******/
if exists (select * from sysobjects where id = object_id('dbo.usp_dbbackup') and sysstat & 0xf = 4)
drop procedure dbo.usp_dbbackup
GO
/****** Object: Stored Procedure dbo.usp_dbbackup Script Date: 23/12/99 10:34:45 ******/
CREATE PROCEDURE usp_dbbackup
@bkup_type VARCHAR(8) = 'NULL'
, @dbname1 VARCHAR(30) = '%'
, @bkup_dir VARCHAR(50) = 'C:\Mssql\Backup'
, @bkup_wkend VARCHAR(1) = 'N'
, @bkup_to_tape VARCHAR(1) = 'N'
, @owrite_tape VARCHAR(1) = 'N'
, @dbcc_run VARCHAR(1) = 'N'
AS
/* Set up local variables */
DECLARE
@msg VARCHAR(255)
, @errmsg VARCHAR(255)
, @jobname VARCHAR(50)
, @command VARCHAR(255)
, @result INT
, @day VARCHAR(10)
, @do_backup VARCHAR(1)
, @database_dir VARCHAR(255)
, @translog_dir VARCHAR(255)
, @bkuplogs_dir VARCHAR(255)
, @cmdshell VARCHAR(20)
, @usp_dbccrun VARCHAR(20)
, @owrite_option VARCHAR(10)
/* Set up environment */
SELECT @jobname = 'usp_dbbackup'
SELECT @cmdshell = 'master..xp_cmdshell'
SELECT @usp_dbccrun = 'master..usp_dbccrun'
SET NOCOUNT ON
/* Check backup option is either DATABASE or TRANSLOG */
IF (@bkup_type <> 'DATABASE')
IF (@bkup_type <> 'TRANSLOG')
BEGIN
SELECT @errmsg = 'Backup type ' + @bkup_type + ' is invalid. Use either DATABASE or TRANSLOG options.'
RAISERROR(@errmsg, -1, -1)
RETURN (1)
END
/* Print job parameters */
SELECT @msg = @jobname + ': Procedure started on '
+ SUBSTRING(CONVERT(VARCHAR, GETDATE(),103),1 ,10)
+ ' at ' + SUBSTRING(CONVERT(VARCHAR, GETDATE(),113),12,13)
+ ' on ' + @@SERVERNAME + ' by ' + SYSTEM_USER + ' (' + SESSION_USER + ')'
PRINT @msg
PRINT " "
SELECT @msg = @jobname + ': Backup Process parameters...'
PRINT @msg
SELECT @msg = @jobname + ': Backup type: ' + @bkup_type
PRINT @msg
SELECT @msg = @jobname + ': Database name: ' + @dbname1
PRINT @msg
SELECT @msg = @jobname + ': Backup directory: ' + @bkup_dir
PRINT @msg
SELECT @msg = @jobname + ': Weekend backup: ' + @bkup_wkend
PRINT @msg
SELECT @msg = @jobname + ': Backup to tape: ' + @bkup_to_tape
PRINT @msg
SELECT @msg = @jobname + ': Overwrite tape: ' + @owrite_tape
PRINT @msg
SELECT @msg = @jobname + ': DBCC checks: ' + @dbcc_run
PRINT @msg
/* Begin */
/* Check database name is valid */
IF @dbname1 IS NULL
SELECT @dbname1 = '%'
ELSE
BEGIN
IF NOT EXISTS (SELECT * FROM sysdatabases WHERE name LIKE @dbname1)
BEGIN
RAISERROR(15010, -1, -1, @dbname1)
RETURN (1)
END
END
PRINT " "
SELECT @msg = @jobname + ': Performing pre-backup checks...'
PRINT @msg
/* Check backup directory destination exists */
SELECT @command = 'dir ' + @bkup_dir + '\'
EXECUTE @result = @cmdshell @command, NO_OUTPUT
IF (@result <> 0)
BEGIN
SELECT @errmsg = @jobname + ': Backup directory ' + @bkup_dir + ' does not exist.'
RAISERROR(@errmsg, -1, -1)
RETURN (1)
END
ELSE
BEGIN
SELECT @msg = @jobname + ': Backup directory ' + @bkup_dir + ' valid.'
PRINT @msg
END
/* Backup */
PRINT " "
SELECT @msg = @jobname + ': Backup process started at ' + SUBSTRING(CONVERT(VARCHAR, GETDATE(),113),12,13) + '...'
PRINT @msg
SELECT @day = CONVERT(VARCHAR, DATENAME(WEEKDAY, GETDATE()))
IF (@bkup_wkend = 'Y' AND (@day = 'Sunday' OR @day = 'Saturday'))
SELECT @do_backup = 'Y'
ELSE
IF (@day in ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'))
SELECT @do_backup = 'Y'
ELSE
SELECT @do_backup = 'N'
IF @do_backup = 'Y'
BEGIN
DECLARE @dbname2 VARCHAR(50)
DECLARE c_dbname CURSOR
FOR SELECT name
FROM sysdatabases
WHERE name LIKE @dbname1
AND name NOT IN ('tempdb')
--ORDER BY dbid /* rem out because of "DB-Library Process Dead - Connection Broken" */
OPEN c_dbname
FETCH NEXT FROM c_dbname INTO @dbname2
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS = -2)
BEGIN
FETCH NEXT FROM c_dbname INTO @dbname2
CONTINUE
END
/* Perform existance checks for DATABASE, TRANSLOG and BKUPLOGS directories */
PRINT " "
SELECT @msg = @jobname + ': Preforming per-backup checks for database ' + @dbname2 + '...'
PRINT @msg
/* DATABASE directory */
/* Only check database directory if @bkup_type = DATABASE */
IF (@bkup_type = 'DATABASE')
BEGIN
SELECT @database_dir = @bkup_dir + '\Database\' +@dbname2
SELECT @msg = @jobname + ': Checking existance of ' + @dbname2 + ' destination DATABASE backup directory...'
PRINT @msg
SELECT @command = 'dir ' + @database_dir
EXECUTE @result = @cmdshell @command, NO_OUTPUT
IF (@result <> 0)
BEGIN
SELECT @errmsg = @jobname + ': ' + @dbname2 + ' destination DATABASE backup directory does not exist.'
RAISERROR(@errmsg, -1, -1)
SELECT @command = 'mkdir ' + @database_dir
EXECUTE @result = @cmdshell @command, NO_OUTPUT
IF (@result = 0)
BEGIN
SELECT @msg = @jobname + ': DATABASE directory ' + @database_dir + ' created.'
PRINT @msg
END
ELSE
BEGIN
SELECT @msg = @jobname + ': DATABASE Directory ' + @database_dir + ' could not be created.'
PRINT @msg
END
END
END
/* TRANSLOG directory */
SELECT @translog_dir = @bkup_dir + '\Translog\' +@dbname2
SELECT @msg = @jobname + ': Checking existance of ' + @dbname2 + ' destination TRANSLOG backup directory...'
PRINT @msg
SELECT @command = 'dir ' + @translog_dir
EXECUTE @result = @cmdshell @command, NO_OUTPUT
IF (@result <> 0)
BEGIN
SELECT @errmsg = @jobname + ': ' + @dbname2 + ' destination TRANSLOG backup directory does not exist.'
RAISERROR(@errmsg, -1, -1)
SELECT @command = 'mkdir ' + @translog_dir
EXECUTE @result = @cmdshell @command, NO_OUTPUT
IF (@result = 0)
BEGIN
SELECT @msg = @jobname + ': TRANSLOG directory ' + @translog_dir + ' created.'
PRINT @msg
END
ELSE
BEGIN
SELECT @msg = @jobname + ': TRANSLOG Directory ' + @translog_dir + ' could not be created.'
PRINT @msg
END
END
/* BKUPLOGS directory */
SELECT @bkuplogs_dir = @bkup_dir + '\Bkuplogs\' +@dbname2
SELECT @msg = @jobname + ': Checking existance of ' + @dbname2 + ' destination BKUPLOGS backup directory...'
PRINT @msg
SELECT @command = 'dir ' + @bkuplogs_dir
EXECUTE @result = @cmdshell @command, NO_OUTPUT
IF (@result <> 0)
BEGIN
SELECT @errmsg = @jobname + ': ' + @dbname2 + ' destination BKUPLOGS backup directory does not exist.'
RAISERROR(@errmsg, -1, -1)
SELECT @command = 'mkdir ' + @bkuplogs_dir
EXECUTE @result = @cmdshell @command, NO_OUTPUT
IF (@result = 0)
BEGIN
SELECT @msg = @jobname + ': BKUPLOGS directory ' + @bkuplogs_dir + ' created.'
PRINT @msg
END
ELSE
BEGIN
SELECT @msg = @jobname + ': BKUPLOGS Directory ' + @bkuplogs_dir + ' could not be created.'
PRINT @msg
END
END
IF (@bkup_type = 'DATABASE' OR @bkup_type = 'TRANSLOG')
BEGIN
/* Check syslogs does exists in its own segment. If true backup tlog.*/
IF EXISTS (SELECT a.* FROM sysdatabases a, sysusages b, spt_values c
WHERE a.dbid = b.dbid
AND c.number = b.segmap
AND c.type = 'S'
AND b.segmap = 4
AND a.status NOT IN (4, 8)
AND a.name LIKE @dbname2)
BEGIN
SELECT @msg = @jobname + ': Transaction log on seperate device. Backing up transaction log for ' + @dbname2 + '...'
PRINT @msg
SELECT @command = 'sqlmaint.exe -D ' + @dbname2 + ' -BkUpLog ' + @translog_dir + ' -BkUpMedia DISK -Rpt ' + @bkuplogs_dir + '\' + @dbname2 +'_log.log' --+ ''''
EXECUTE @result = @cmdshell @command, NO_OUTPUT
IF (@result <> 0)
BEGIN
SELECT @errmsg = @jobname + ': Error backing up transaction log for ' + @dbname2 + '.'
PRINT @errmsg
END
ELSE
BEGIN
SELECT @msg = @jobname + ': Transaction log for ' + @dbname2 + ' backed up successfully.'
PRINT @msg
END
END
ELSE
BEGIN
SELECT @msg = @jobname + ': Transaction log not on seperate device. Cannot backup transaction log for ' + @dbname2 + '.'
PRINT @msg
END
END
IF (@bkup_type = 'DATABASE')
BEGIN
/* Truncate transaction log for database */
SELECT @msg = @jobname + ': Truncating transaction log for ' + @dbname2 + '...'
PRINT @msg
SELECT @command = 'DUMP TRANSACTION ' + @dbname2 + ' WITH TRUNCATE_ONLY'
EXECUTE (@command)
/* Delete old database backups */
SELECT @msg = @jobname + ': Deleting old database backup(s) for ' + @dbname2 + '...'
PRINT @msg
SELECT @command = 'del ' + @database_dir + '\*.* /Q'
EXECUTE @result = @cmdshell @command --, NO_OUTPUT
IF (@result <> 0)
BEGIN
SELECT @errmsg = @jobname + ': Error deleting old database backup file(s) for ' + @dbname2 + '.'
PRINT @errmsg
END
ELSE
BEGIN
SELECT @msg = @jobname + ': Old database backup file(s) for ' + @dbname2 + ' deleted successfully.'
PRINT @msg
END
/* Backup database */
SELECT @msg = @jobname + ': Backing up database ' + @dbname2 + '...'
PRINT @msg
SELECT @command = 'sqlmaint.exe -D ' +@dbname2 + ' -BkUpDB ' + @database_dir + ' -BkUpMedia DISK -Rpt ' + @bkuplogs_dir + '\'+ @dbname2 +'_db.log' --+ ''''
EXECUTE @result = @cmdshell @command, NO_OUTPUT
IF (@result <> 0)
BEGIN
SELECT @errmsg = @jobname + ': Error backing up database for ' + @dbname2 + '.'
PRINT @errmsg
END
ELSE
BEGIN
SELECT @msg = @jobname + ': Database ' + @dbname2 + ' backed up successfully.'
PRINT @msg
END
/* Delete old transaction logs */
SELECT @msg = @jobname + ': Deleting old transaction log(s) for ' + @dbname2 + '...'
PRINT @msg
SELECT @command = 'del ' + @translog_dir + '\*.* /Q'
EXECUTE @result = @cmdshell @command --, NO_OUTPUT
IF (@result <> 0)
BEGIN
SELECT @errmsg = @jobname + ': Error deleting transaction log(s) for ' + @dbname2 + '.'
PRINT @errmsg
END
ELSE
BEGIN
SELECT @msg = @jobname + ': Transaction log(s) for database ' + @dbname2 + ' deleted successfully.'
PRINT @msg
END
/* DBCC checks */
IF (@dbcc_run = 'Y')
BEGIN
PRINT " "
SELECT @msg = @jobname + ': Starting post database backup checks for ' + @dbname2 + '...'
PRINT @msg
PRINT " "
execute @usp_dbccrun @dbname2, @database_dir
PRINT " "
SELECT @msg = @jobname + ': Post database backup checks for ' + @dbname2 + ' completed at ' + SUBSTRING(CONVERT(VARCHAR, GETDATE(),113),12,13)
PRINT @msg
END
ELSE
BEGIN
SELECT @msg = @jobname + ': No post database backup checks to run for ' + @dbname2 + '.'
PRINT @msg
END
END
FETCH NEXT FROM c_dbname INTO @dbname2
END
CLOSE c_dbname
DEALLOCATE c_dbname
PRINT " "
SELECT @msg = @jobname + ': Backup process completed at ' + SUBSTRING(CONVERT(VARCHAR, GETDATE(),113),12,13) + '...'
PRINT @msg
IF (@bkup_to_tape = 'Y')
BEGIN
PRINT " "
SELECT @msg = @jobname + ': Starting tape backup...'
PRINT @msg
PRINT " "
/* Get path for backing up */
IF (@dbname1 = '%')
SELECT @bkup_dir = @bkup_dir + '\' + @bkup_type
ELSE
SELECT @bkup_dir = @bkup_dir + '\' + @bkup_type + '\' + @dbname1
--IF (@bkup_type = 'DATABASE')
-- SELECT @bkup_dir = @bkup_dir + '\DATABASE'
--IF (@bkup_type = 'TRANSLOG')
-- SELECT @bkup_dir = @bkup_dir + '\TRANSLOG'
EXECUTE usp_ntbackup @bkup_dir = @bkup_dir, @bkup_to_tape = @bkup_to_tape, @owrite_tape = @owrite_tape, @bkup_type = @bkup_type
SELECT @msg = @jobname + ': Tape backup completed at ' + SUBSTRING(CONVERT(VARCHAR, GETDATE(),113),12,13)
PRINT @msg
END
END
PRINT " "
SELECT @msg = @jobname + ': Procedure completed on '
+ SUBSTRING(CONVERT(VARCHAR, GETDATE(),103),1 ,10)
+ ' at ' + SUBSTRING(CONVERT(VARCHAR, GETDATE(),113),12,13)
PRINT @msg
GO