Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come migrare i processi di SQL Server da un'istanza di SQL Server a un'altra

Introduzione

In un precedente articolo, abbiamo evidenziato che il database msdb memorizza praticamente tutti gli oggetti relativi all'automazione. In questo articolo esamineremo il caso di spostamento di processi e oggetti tra le istanze di SQL Server.

Iniziamo con l'elenco degli oggetti archiviati in msdb su questa istanza di SQL Server.

Abbiamo diversi lavori creati con un piano di manutenzione (vedere l'articolo Creazione di piani di manutenzione in SQL Server). Abbiamo anche due avvisi e un operatore. Msdb memorizza anche gli avvisi e gli operatori (vedere la figura 1). Elimineremo questi oggetti e poi li recupereremo ripristinando un backup del database msdb.

Visualizzazione di oggetti archiviati in msdb

Se interroghiamo oggetti di sistema rilevanti, vediamo anche questi oggetti restituiti come set di risultati. (Vedi Listato 1, Figura 2). Msdb archivia anche i cataloghi di sistema con record di lavori, registri di backup, operatori, luoghi di manutenzione, posta del database e altri elementi relativi all'automazione.

-- Listing 1: Check List of Jobs in the Instance
use msdb
go
select @@SERVERNAME as ServerName
select name from sysjobs;

Backup msdb

Per illustrare il concetto per una singola istanza di SQL Server, eseguiamo prima un backup del database msdb. Negli scenari di produzione, backup regolari dei database di sistema dovrebbero far parte della tua strategia. Di solito sono abbastanza piccoli da adattarsi comodamente a un programma di backup completo giornaliero.

Naturalmente, quando mi riferisco a un database di sistema, questo non include tempdb necessario. Inoltre, potrebbe non essere necessario nemmeno un backup giornaliero per un database modello:è sufficiente un backup settimanale. Per i backup giornalieri completi, considera master e msdb.

Usando il semplice codice nel Listato 2, eseguiamo un backup del database msdb.

-- Listing 2: Backup msdb Database 
backup database msdb to disk = 'E:\DriveF\msdb_18072020.bak';

Lavori dismessi

Una volta che il backup è pronto, eliminiamo i lavori sull'istanza. Si noti che l'eliminazione dei lavori creati da un piano di manutenzione richiede l'eliminazione dei piani di manutenzione che li hanno creati (vedere la figura 3).

I lavori regolari possono essere rimossi eliminandoli con la GUI. Un altro modo è eseguire il codice del Listato 3, seguito dal codice del Listato 4.

Il Listato 3 genera l'insieme di script necessari per eliminare i lavori. Quindi, nel Listato 4, eseguiamo gli script generati nel Listato 3.

Puoi utilizzare questo approccio anche se i nomi dei lavori nella tua istanza sono probabilmente diversi dai miei.

-- 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

Dopo aver abbandonato i lavori, possiamo verificare che non siano rimasti lavori. Usa lo stesso script, come mostrato nel Listato 1. Consideriamo due modi per lo scenario:

  1. Qualcuno ha eliminato accidentalmente lavori e oggetti simili in un'istanza.
  2. Vogliamo importare lavori da un'istanza a un'altra.

Ripristino di msdb

Iniziamo l'operazione di ripristino utilizzando lo script del Listato 5. In quello script, iniziamo impostando il database in modalità utente_singolo. Poiché qualcuno o qualcosa (account SQL Agent?) potrebbe essere connesso a questo database, è necessario.

Quindi, emettiamo il comando "restore" e impostiamo il nuovo database msdb su multi_user. Si noti che abbiamo utilizzato l'opzione REPLACE nell'istruzione di ripristino. Se stai migrando msdb a una nuova istanza, sarà necessaria la clausola REPLACE. Senza di essa, SQL Server potrebbe restituire un errore relativo al set di backup che non appartiene al database msdb nell'istanza.

-- 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

Una volta completata l'operazione di ripristino, i lavori mancanti e gli altri oggetti vengono ripristinati. Vengono forniti completi delle rispettive storie di lavoro. Tutte le relazioni tra i lavori con i database e altri oggetti sono intatte. I lavori funzionano come se nessuno e niente li cancellasse.

Conclusione

Possiamo facilmente migrare lavori e oggetti simili da un'istanza di SQL Server a un'altra. Per questo, abbiamo bisogno di un processo di backup e ripristino di msdb. Allo stesso modo, possiamo recuperare questi oggetti su un'istanza di SQL Server se persa per qualche motivo.