Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como migrar trabalhos do SQL Server de uma instância do SQL Server para outra

Introdução


Em artigo anterior, destacamos que o banco de dados msdb armazena praticamente todos os objetos relacionados à automação. Neste artigo, analisaremos o caso de mover trabalhos e objetos entre as instâncias do SQL Server.

Vamos começar com a lista de objetos armazenados em msdb nesta instância do SQL Server.

Temos vários jobs criados com plano de manutenção (veja o artigo Criando Planos de Manutenção no SQL Server). Também temos dois alertas e um operador. O Msdb também armazena alertas e operadores (veja a Figura 1). Devemos excluir esses objetos e depois recuperá-los restaurando um backup do banco de dados msdb.

Visualizando objetos armazenados no msdb


Se consultarmos objetos relevantes do sistema, também veremos esses objetos retornados como o conjunto de resultados. (Consulte a Listagem 1, Figura 2). O Msdb também armazena os catálogos do sistema com registros de trabalhos, logs de backup, operadores, locais de manutenção, correio de banco de dados e outros itens relacionados à automação.
-- Listing 1: Check List of Jobs in the Instance
use msdb
go
select @@SERVERNAME as ServerName
select name from sysjobs;

Backup do msdb


Para ilustrar o conceito de uma única instância do SQL Server, primeiro fazemos um backup do banco de dados msdb. Em cenários de produção, backups regulares dos bancos de dados do sistema devem fazer parte de sua estratégia. Eles geralmente são pequenos o suficiente para caber confortavelmente em uma programação diária de backup completo.

Claro, quando me refiro a um banco de dados do sistema, isso não inclui tempdb necessário. Além disso, um backup diário para um banco de dados modelo também pode não ser necessário – um backup semanal é suficiente. Para os backups diários completos, considere master e msdb.

Usando o código simples da Listagem 2, fazemos um backup do banco de dados msdb.
-- Listing 2: Backup msdb Database 
backup database msdb to disk = 'E:\DriveF\msdb_18072020.bak';

Deixando empregos


Quando o backup estiver pronto, descartamos os trabalhos na instância. Observe que descartar os trabalhos criados por um plano de manutenção requer a exclusão dos planos de manutenção que os criaram (consulte a Figura 3).

Os trabalhos regulares podem ser removidos excluindo-os com a GUI. Outra maneira é executar o código da Listagem 3, seguido pelo código da Listagem 4.

A Listagem 3 gera o conjunto de scripts necessários para eliminar os trabalhos. Em seguida, na Listagem 4, executamos os scripts gerados na Listagem 3.

Você pode usar essa abordagem mesmo que os nomes de tarefas em sua instância sejam provavelmente diferentes dos meus.
-- Listing 3: Generate Script to Drop Jobs
USE [msdb]
GO
select 'EXEC msdb.dbo.sp_delete_job @job_name=N''' + [name] + ''', @delete_unused_schedule=1' from sysjobs;
GO
-- Listing 4: Drop SQL Agent Jobs
EXEC msdb.dbo.sp_delete_job @job_name=N'DB1_BackupTransactionLog', @delete_unused_schedule=1
EXEC msdb.dbo.sp_delete_job @job_name=N'syspolicy_purge_history', @delete_unused_schedule=1

Depois de descartar os trabalhos, podemos verificar se não há trabalhos restantes. Use o mesmo script, conforme mostrado na Listagem 1. Consideramos duas formas para o cenário:
  1. Alguém excluiu acidentalmente jobs e objetos semelhantes em uma instância.
  2. Queremos importar jobs de uma instância para outra.

Restaurando msdb


Iniciamos a operação de restauração usando o script da Listagem 5. Nesse script, começamos configurando o banco de dados para o modo single_user. Como alguém ou alguma coisa (conta do SQL Agent?) pode estar logado neste banco de dados, é necessário.

Em seguida, emitimos o comando “restore” e definimos o novo banco de dados msdb para multi_user. Observe que usamos a opção REPLACE na instrução de restauração. Se você estiver migrando o msdb para uma nova instância, a cláusula REPLACE será necessária. Sem ele, o SQL Server pode retornar um erro sobre o conjunto de backup não pertencer ao banco de dados msdb na instância.
-- Listing 5: Restore msdb database
use master
go
alter database msdb set single_user with rollback immediate;
GO
restore database msdb from disk = 'E:\DriveG\msdb_18072020.bak'
with replace;
GO
alter database msdb set multi_user;
GO

Quando a operação de restauração for concluída, as tarefas ausentes e outros objetos estarão de volta. Eles vêm completos com seus respectivos históricos de trabalho. Todos os relacionamentos entre os trabalhos com bancos de dados e outros objetos estão intactos. Os trabalhos funcionam como se ninguém e nada os excluísse.

Conclusão


Podemos migrar facilmente trabalhos e objetos semelhantes de uma instância do SQL Server para outra. Para isso, precisamos de um processo de backup e restauração do msdb. Da mesma forma, podemos recuperar esses objetos em uma instância do SQL Server se perdidos por algum motivo.