Como posso agendar um backup diário com o SQL Server Express? [duplicado]

[[2] esta pergunta já tem uma resposta aqui:

estou a executar uma pequena aplicação web com o SQL server express (2005) como infra-estrutura. Eu posso criar um backup com um script SQL, no entanto, eu gostaria de agendar isso em uma base diária. Como opção extra (should-have) eu gostaria de manter apenas o últimas cópias de segurança do X (por razões de poupança de espaço, obviamente) algum indicador?

[editar] o agente do servidor SQL está indisponível no SQL server express...

Author: Jon Seigel, 2009-01-28

6 answers

Não pode usar o agente do servidor SQL no SQL Server Express. A maneira que eu fiz antes é criar um Script SQL, e então executá-lo como uma tarefa agendada a cada dia, você poderia ter várias tarefas agendadas para se encaixar com o seu cronograma de backup/retenção. O comando que uso na tarefa agendada é:

"C:\Program Files\Microsoft SQL Server\90\Tools\Binn\SQLCMD.EXE "- i"c:\path\to\sqlbackupScript.sql "

 49
Author: Sam Cogan, 2009-01-28 14:03:31
Eduardo Molteni tinha uma grande resposta:

Usar As Tarefas Agendadas Do Windows:

No ficheiro em lote

"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE" -S 
(local)\SQLExpress -i D:\dbbackups\SQLExpressBackups.sql

Em SQLExpressBackups.sql

BACKUP DATABASE MyDataBase1 TO  DISK = N'D:\DBbackups\MyDataBase1.bak' 
WITH NOFORMAT, INIT,  NAME = N'MyDataBase1 Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

BACKUP DATABASE MyDataBase2 TO  DISK = N'D:\DBbackups\MyDataBase2.bak' 
WITH NOFORMAT, INIT,  NAME = N'MyDataBase2 Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

GO
 49
Author: JohnB, 2017-05-23 12:26:20

Basta usar este programa para salvaguardar dinamicamente todas as bases de dados do servidor. Em seguida, criar arquivo em lote de acordo com o artigo. É usefull para criar dois arquivos de lote, um para backup completo a e um para backup de diff. Em seguida, criar duas tarefas no Escalonador de Tarefas, uma para cheio e uma para diff.

-- // Copyright © Microsoft Corporation.  All Rights Reserved.
-- // This code released under the terms of the
-- // Microsoft Public License (MS-PL, http://opensource.org/licenses/ms-pl.html.)
USE [master] 
GO 
/****** Object:  StoredProcedure [dbo].[sp_BackupDatabases] ******/ 
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
-- =============================================

CREATE PROCEDURE [dbo].[sp_BackupDatabases]  
            @databaseName sysname = null,
            @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','Northwind','pubs','AdventureWorks')
                  END
            ELSE IF @backupType='D'
                  BEGIN
                  DELETE @DBs where DBNAME IN ('tempdb','Northwind','pubs','master','AdventureWorks')
                  END
            ELSE IF @backupType='L'
                  BEGIN
                  DELETE @DBs where DBNAME IN ('tempdb','Northwind','pubs','master','AdventureWorks')
                  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

E o ficheiro em lote pode ser assim:

sqlcmd -S localhost\myDB -Q "EXEC sp_BackupDatabases @backupLocation='c:\Dropbox\backup\DB\', @backupType='F'"  >> c:\Dropbox\backup\DB\full.log 2>&1

E

sqlcmd -S localhost\myDB -Q "EXEC sp_BackupDatabases @backupLocation='c:\Dropbox\backup\DB\', @backupType='D'"  >> c:\Dropbox\backup\DB\diff.log 2>&1

A vantagem deste método é que você não precisa mudar nada se você adicionar uma nova base de dados ou apague uma base de dados, você nem precisa listar as bases de dados no script. A resposta de JohnB é melhor / mais simples para servidor com um banco de dados, esta abordagem é mais adequada para servidores multi banco de dados.

 6
Author: qub1n, 2015-05-27 20:34:52

As pessoas no MSSQLTips têm alguns artigos muito úteis, o mais relevante para isso é " automatizar o servidor SQL 2005 expressar cópias de segurança e remoção de arquivos de Backup mais antigos"

A abordagem básica é configurar duas tarefas usando o escalonador de Tarefas do Windows. Uma tarefa executa um programa TSQL que gera ficheiros de cópia de segurança separados para todas as bases de dados MSSQL (excepto o TEMPDB) com o nome da base de dados e um carimbo de data/hora no nome do ficheiro para uma pasta específica. A segunda tarefa é Script VBScript que passa por esse diretório e apaga todos os arquivos com um .BAK extensão que são mais de 3 dias de idade.

Ambos os programas requerem uma pequena edição para o seu ambiente (localizações, quanto tempo para manter os ficheiros de dados), mas estão muito perto do drop-in-and-run.

Note que existem possíveis implicações de segurança se você for desleixado com estas ou com permissões de Diretório, uma vez que eles são Arquivos de texto simples que terão de ser executados com algum nível de privilégio. Nao sê desleixado.

 4
Author: fencepost, 2009-12-04 17:53:17

Usámos a combinação de:

  1. Cópia de segurança Cobian para agendamento/manutenção

  2. ExpressMaint para cópia de segurança

Ambos são livres. O processo é script ExpressMaint para tomar um backup como um evento Cobian "antes do Backup". Normalmente deixo isto sobrepor o ficheiro de backup anterior. Cobian, em seguida, tira um zip/7zip para fora disto e arquivá-los para a pasta de backup. Em Cobian você pode especificar o número completo cópias para manter, fazer vários ciclos de backup, etc.

Exemplo de sintaxe do comando ExpressMaint:

expressmaint -S HOST\SQLEXPRESS -D ALL_USER -T DB -R logpath -RU WEEKS -RV 1 -B backuppath -BU HOURS -BV 3 
 3
Author: mika, 2009-01-28 16:21:03

Você pode criar um dispositivo de backup no objeto do servidor, deixe-nos dizer

BDTEST

E depois criar um ficheiro em lote contém o seguinte comando

sqlcmd -S 192.168.1.25 -E -Q "BACKUP DATABASE dbtest TO BDTEST"
Digamos com nome

Apoio.bat

Depois, podes ligar para o 112.

Apoio.bat

No escalonador de tarefas de acordo com a sua conveniência

 0
Author: Susheel Kumar, 2017-03-27 06:56:09