Olá pessoal!
Neste post vamos falar um pouco sobre como criar agendamento de rotinas de backup em um SQL Server 2016 Express + Task Scheduler do Windows + arquivos .bat.
Para criar esse tipo de agendamento, geralmente utilizamos o próprio Agent do SQL Server. Porém, como estamos falando de um Express, este é muito restrito. Devido a essa restrição, não há algumas features disponíveis¸tais como SQL Server Agent, backup compression, etc. Para verificar todas restrições e comparações com outras edições do SQL Server, segue link de referência: https://docs.microsoft.com/en-us/sql/sql-server/editions-and-components-of-sql-server-2016?view=sql-server-ver15.
Por isso, para esse tipo de trabalho no SQL Server Express, podemos utilizar o Task Scheduler (Agendador de tarefas)do Windows.
Assim, vamos começar criando uma tarefa no Task Scheduler. Abra-o como administrador.
Com o botão direito, selecione a opção Create Task:
Escolha um nome para a task e marque a opção “Run whether use ris logged on or not” para salvar a autenticação.
Na aba Triggers, faça o agendamento conforme for necessário para o seu ambiente. Por ser agendamento de um backup full, pode ser agendado semanalmente (caso tenha programado agendamento de backups diferenciais diários e transacionais a cada 1h, por exemplo) ou até mesmo diário.
Na aba Actions, selecione qual ação o agendamento irá tomar. No nosso caso, executará um arquivo .bat com as instruções de backup.
Nesse diretório, vamos criar um arquivo .bat com o seguinte comando:
cd \
sqlcmd -S".\SQLEXPRESS2016" -E -dBackupDemo -Q"execute [dbo].[stp_Demo_BackupFull] 'BackupDemo', 'C:\BackupTest\'"
Sobre os parâmetros de conexão, consultar o seguinte link: https://docs.microsoft.com/en-us/sql/tools/sqlcmd-utility?view=sql-server-ver15.
Por questões de preferência e organização, preferimos criar uma procedure que faz o processo de backup e por último faz a validação do backup:
USE [BackupDemo]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Create procedure [dbo].[stp_Demo_BackupFull](
@pNmBanco sysname,
@pDsCaminho varchar(200)
)
as
begin
Declare @NmBD varchar(200);
Declare @NmBackup varchar(200);
set @NmBD = @pDsCaminho + 'FULL_' + + @pNmBanco + '_' + convert(char(8), getdate(),112) + '_' + REPLACE(CONVERT(nvarchar, GETDATE(), 8), ':', '') + '.bak';
set @NmBackup = 'Backup Full do ' + @pNmBanco
BACKUP DATABASE @pNmBanco TO disk = @NmBD WITH NOFORMAT, NOINIT,
NAME = @NmBackup, SKIP, NOREWIND, NOUNLOAD, STATS = 10, CHECKSUM
--------------------------------
-- Verificação do backup executado
Declare @DsMsg varchar(200);
set @DsMsg = 'A verificação falhou, o backup do banco de dados ' + @pNmBanco + ' não existe';
RESTORE VERIFYONLY FROM DISK = @NmBD WITH FILE = 1, NOUNLOAD, NOREWIND
end
Na aba Conditions, você poderá escolher as configurações caso necessário, respeitando algumas condições. No nosso caso, deixamos padrão.
Na aba Settings, há mais algumas configurações que podem ser definidas, como desabilitar a tarefa caso fique em execução há mais de x dias, entre outras. Nesse caso, deixamos padrão devido a fins de teste.
Na aba History, você pode acompanhar o histórico de execuções e depurar caso ocorra algum erro durante alguma execução.
Quando for executar a tarefa, ele irá criar um arquivo no padrão abaixo:
“TIPODEBACKUP_BANCODEDADOS_ANOMESDIA_HORAMINUTOSEGUNDO.bak”
Pronto! Agora temos nosso agendamento de backup full do banco de dados. Para o agendamento de backups diferenciais e transacionais, basta trocar o tipo de backup no script e o agendamento segue a mesma lógica para criação.
Abraço e até a próxima!