none
Dúvida referente a backups diários. RRS feed

  • Pergunta

  • Boa tarde a todos. Tenho a seguinte dúvida. Estou utilizando o SQL Server Express 2014. Sei que, por ser uma versão "Free", ele não possui o sistema de backup próprio.

    Então para fazer esses backups utilizo uma stored procedure, um bat para executar e o Agendador de tarefas para executar esse bat e efetuar o backup. 

    Todo dia em determinado horário ele faz o backup do banco, normalmente, só que faz o backup de todo o banco (FULL). Porém surgiu a necessidade de fazer o backup somente com os dados gravados no dia, ou seja backup diários, somente com os dados do dia corrente. Gostaria de saber se é possível fazer isso utilizando o SQL Express, ou seja por meio da stored procedure em questão, ou se é possivel fazer com o SQL Standart. 

    Deixo aqui minha Stored procedure utilizada: 

    USE [G_Jaiba]
    GO
    /****** Object:  StoredProcedure [dbo].[sp_BackupDatabases]    Script Date: 09/08/2018 12:06:34 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
     
    -- ============================================= 
    -- Author: Microsoft 
    -- Create date: 2010-02-06
    -- Description: Backup Databases for SQLExpress
    -- Parameter1: databaseName 
    -- Parameter2: backupType F=full, D=differential, L=log
    -- Parameter3: backup file location
    -- =============================================
     
    ALTER PROCEDURE [dbo].[sp_BackupDatabases]  
                @databaseName sysname = 'G_Jaiba',
                @backupType CHAR(1),
                @backupLocation nvarchar(200) 
    AS 
     
           SET NOCOUNT ON; 
               
                DECLARE @DBs TABLE
                (
                      ID int IDENTITY PRIMARY KEY,
                      DBNAME nvarchar(500)
                )
               
                 -- Pick out only databases which are online in case ALL databases are chosen to be backed up
                 -- If specific database is chosen to be backed up only pick that out from @DBs
                INSERT INTO @DBs (DBNAME)
                SELECT Name FROM master.sys.databases
                where state=0
                AND name=@DatabaseName
                OR @DatabaseName IS NULL
                ORDER BY Name
               
                -- Filter out databases which do not need to backed up
                IF @backupType='F'
                      BEGIN
                      DELETE @DBs where DBNAME IN 
    ('tempdb','master','model','msdb' )
                      END
                ELSE IF @backupType='D'
                      BEGIN
                      DELETE @DBs where DBNAME IN 
    ('tempdb','master','model','msdb' )
                      END
                ELSE IF @backupType='L'
                      BEGIN
                      DELETE @DBs where DBNAME IN 
    ('tempdb','master','model','msdb' )
                      END
                ELSE
                      BEGIN
                      RETURN
                      END
               
                -- Declare variables
                DECLARE @BackupName varchar(100)
                DECLARE @BackupFile varchar(100)
                DECLARE @DBNAME varchar(300)
                DECLARE @sqlCommand NVARCHAR(1000) 
            DECLARE @dateTime NVARCHAR(20)
                DECLARE @Loop int                  
                           
                -- Loop through the databases one by one
                SELECT @Loop = min(ID) FROM @DBs
     
          WHILE @Loop IS NOT NULL
          BEGIN
     
    -- Database Names have to be in [dbname] format since some have - or _ in their name
          SET @DBNAME = '['+(SELECT DBNAME FROM @DBs WHERE ID = @Loop)+']'
     
    -- Set the current date and time n yyyyhhmmss format
          SET @dateTime = REPLACE(CONVERT(VARCHAR, GETDATE(),101),'/','') + '_' +  REPLACE(CONVERT(VARCHAR, GETDATE(),108),':','')  
     
    -- Create backup filename in path\filename.extension format for full,diff and log backups
          IF @backupType = 'F'
                SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_FULL_'+ @dateTime+ '.BAK'
          ELSE IF @backupType = 'D'
                SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_DIFF_'+ @dateTime+ '.BAK'
          ELSE IF @backupType = 'L'
                SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_LOG_'+ @dateTime+ '.TRN'
     
    -- Provide the backup a name for storing in the media
          IF @backupType = 'F'
                SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' full backup for '+ @dateTime
          IF @backupType = 'D'
                SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' differential backup for '+ @dateTime
          IF @backupType = 'L'
                SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' log backup for '+ @dateTime
     
    -- Generate the dynamic SQL command to be executed
     
           IF @backupType = 'F' 
                      BEGIN
                   SET @sqlCommand = 'BACKUP DATABASE ' +@DBNAME+  ' TO DISK = '''+@BackupFile+ ''' WITH INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT'
                      END
           IF @backupType = 'D'
                      BEGIN
                   SET @sqlCommand = 'BACKUP DATABASE ' +@DBNAME+  ' TO DISK = '''+@BackupFile+ ''' WITH DIFFERENTIAL, INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT'        
                      END
           IF @backupType = 'L' 
                      BEGIN
                   SET @sqlCommand = 'BACKUP LOG ' +@DBNAME+  ' TO DISK = '''+@BackupFile+ ''' WITH INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT'        
                      END
     
    -- Execute the generated SQL command
           EXEC(@sqlCommand)
     
    -- Goto the next database
    SELECT @Loop = min(ID) FROM @DBs where ID>@Loop
     
    END
    

    O meu bat está com o seguinte comando: 

    sqlcmd -S .\SQLEXPRESS -E -Q "EXEC sp_BackupDatabases @backupLocation='E:\Backup\Automatic SQL Backup\', @backupType='F'" 

    Agradeço imensamente quem puder colaborar com essa dúvida, caso não fui muito claro, não exitem em perguntar.

    Att.

    quinta-feira, 9 de agosto de 2018 15:21

Respostas

  • William,

    Sim, você consegui, mas não diretamente, o SQL Server Express não possui suporte ao SQL Server Agent(Agendador de Tarefas do SQL Server), neste caso, você teria que usar o Agendador de tarefas do Windows, para executar esta tarefas.

    Por outro lado, existe uma ferramenta chamada Backup Free que tem justamente esta capacidade de automatizar os backups do SQL Server Express.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    terça-feira, 21 de agosto de 2018 01:22
    Moderador

Todas as Respostas

  • William, 

    Na verdade delimitar o período de dados que deverá ser adicionado ao backup não é bem assim, independente da edição do SQL Server, esta não é uma capacidade do comando de backup e sim do comando de restore.

    Para que isso possa realmente ser implementado, será sempre necessário fazer um backup Full, pois somente após o processamento do backup full o Log de transações é zerado e preparado para um novo conjunto, neste caso, o que você poderia fazer é realizar um Backup Full no começo do dia ou no final justamente para zerar o log e ai fazer um backup diferencial diário com base no último backup full.

    Talvez pensar um estratégias de backups diferenciais ou backups de log podem ser algo mais próximo a sua necessidade.



    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    terça-feira, 14 de agosto de 2018 13:03
    Moderador
  • Obrigado Junior Galvão pela resposta. Minha dúvida é o seguinte, eu consigo fazer isso com o SQL Server Express? Pois no meu caso eu preciso automatizar isso para pegar o backup diário. Hoje eu só consigo pegar o backup full todos os dias usando o agendador de tarefas do Windows, todos os dias eu tenho um arquivo .bak no final do dia, porém esse arquivo vai aumentando gradativamente pois ele pega todo banco. Ou eu preciso do SQL Server Standart?
    segunda-feira, 20 de agosto de 2018 12:39
  • William,

    Sim, você consegui, mas não diretamente, o SQL Server Express não possui suporte ao SQL Server Agent(Agendador de Tarefas do SQL Server), neste caso, você teria que usar o Agendador de tarefas do Windows, para executar esta tarefas.

    Por outro lado, existe uma ferramenta chamada Backup Free que tem justamente esta capacidade de automatizar os backups do SQL Server Express.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    terça-feira, 21 de agosto de 2018 01:22
    Moderador