Avatar billede misbruger Nybegynder
05. december 2002 - 12:17 Der er 6 kommentarer og
1 løsning

SP der laver backup af databasen?

I Enterprise Manager kan man under all tasks vælge Backup database..."

Kan man lave en Stored Procedure der laver samme backup eller en lignede backup af databasen?
Avatar billede ocp Nybegynder
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 ] ]
]
Avatar billede misbruger Nybegynder
05. december 2002 - 12:34 #2
Det ser sku meget godt ud, men jeg er skal nok bede om en mere uddybene forklaring!
Avatar billede jwi Nybegynder
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
Avatar billede misbruger Nybegynder
05. december 2002 - 13:01 #4
Good damn!

Er det ikke lidt af et overkill?

Jeg skal bare lave en enkelt backup af en enkelt database i min SQL server instans.
Jeg er overbevist om (håber) at SQL 2K har en funktion der kan gøre det lidt lettere end en 200 liniers stored procedure....

ocp -> dit eksemple se mere overskueligt ud, hvor kan jeg få en lidt mere uddybene forklaring af hvad der skal til for at effektuere det?
Avatar billede jwi Nybegynder
05. december 2002 - 13:13 #5
Then use a Database Maintainance Plan.
Avatar billede ocp Nybegynder
05. december 2002 - 13:18 #6
Således:

USE master
-- Tilføj en backup device, "MyNwind_1", som er en fil ("disk") med navnet MyNwind_1.dat
EXEC sp_addumpdevice 'disk', 'MyNwind_1', DISK ='c:\Program Files\Microsoft SQL Server\MSSQL\BACKUP\MyNwind_1.dat'

-- Back up the full MyNwind database.
BACKUP DATABASE MyNwind TO MyNwind_1
Avatar billede misbruger Nybegynder
05. december 2002 - 13:23 #7
Takker den er i vinkel!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester