Como posso agendar um backup diário com o SQL Server Express? [duplicado]
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...
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 "
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
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.
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.
Usámos a combinação de:
Cópia de segurança Cobian para agendamento/manutenção
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
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
Depois, podes ligar para o 112.Apoio.bat
Apoio.bat
No escalonador de tarefas de acordo com a sua conveniência