Esegui automaticamente la stored procedure dopo qualsiasi evento RESTORE DATABASE


9

È possibile che SQL Server 2008 R2 Standard esegua automaticamente una procedura memorizzata in un determinato database ripristinato o collegato all'istanza?

Mi sono avvicinato a una soluzione creando un trigger a livello di server che esegue una procedura memorizzata in un determinato database dopo l'evento DDL CREATE_DATABASEo ALTER_DATABASEviene attivato . Sfortunatamente, questo non funziona per i ripristini di backup del databack.

Per elaborare, abbiamo una procedura memorizzata 'clean up' che esiste in ogni database che ripristiniamo e sto cercando un modo per farlo eseguire automaticamente ogni volta che un backup viene ripristinato nell'istanza.

Googling mi ha indicato di configurare Audit o Politiche in SQL Server per ottenere questa funzionalità, ma queste funzionalità sono alquanto travolgenti a prima vista, quindi non posso dire se Audit o Politiche sono la strada da cui iniziare le indagini.

Risposte:


10

Deve essere eseguito immediatamente dopo il completamento del ripristino o può essere ritardato brevemente? Un'idea che ho avuto è quella di avere un lavoro che viene eseguito ogni minuto e controlla Audit Backup/Restore Eventla traccia predefinita.

DECLARE @fn VARCHAR(MAX);

SELECT @fn = SUBSTRING([path], 0, LEN([path])-CHARINDEX(CHAR(92), REVERSE([path]))+1) 
  + CHAR(92) + 'Log.trc'  
FROM sys.traces   
WHERE is_default = 1;  

SELECT 
    DatabaseName,
    StartTime, 
    TextData
FROM sys.fn_trace_gettable(@fn, DEFAULT)  
WHERE EventClass = 115
AND TextData LIKE '%RESTORE%'; -- since can't differentiate between backup/restore

Potresti archiviare le pulizie che hai già fatto in base a StartTime e persino limitare la query di traccia che viene eseguita ogni minuto (o qualunque sia la tua soglia di ritardo accettabile) per guardare solo i valori StartTime maggiori dell'ultima riga che hai estratto o dell'ultima tempo di esecuzione del lavoro, a seconda di quale dei due è inferiore.


1
Molto lucido, buon pensiero. +1
Thomas Stringer,

Un leggero ritardo sarebbe accettabile. Lo proverò.
Matthew Ruston,

1
Si noti che non ho confermato che in tutti i casi l'evento sia effettivamente terminato prima della scrittura della riga di traccia. Ho il sospetto che si tratti di una scrittura post-evento ma sono sospettoso solo perché EndTimenon sembra mai essere popolato. È possibile che si debba provare a connettersi al database e, se non è possibile, ignorarlo e non documentare questo evento di ripristino, ma riprovare alla successiva esecuzione del processo. Proverei a convalidare ma sulle mie VM locali ho solo SSD ma non hanno lo spazio su disco per fare un backup abbastanza lungo da osservare il comportamento con precisione. :-)
Aaron Bertrand

6

L' database_started evento esteso viene generato dopo il ripristino di un database.

Crea una sessione di eventi che catturi il database_idcampo con un predicato che cerchi %RESTORE%nel sql_textcampo (nota: credo che questo sia sufficiente - ti consigliamo di testare tu stesso).

Non ho abbastanza familiarità con gli Eventi estesi per dirti il ​​modo migliore di rispondere all'evento. Sarebbe bello se si potesse attivare direttamente una procedura memorizzata; Non so se sia possibile, però. Tuttavia, puoi sicuramente eseguire il polling del buffer degli eventi e ciò è preferibile alla scansione della traccia predefinita, non solo per motivi di prestazioni, ma se il server è molto occupato e l'intervallo di polling è troppo lungo, potresti finire per perdere completamente gli eventi mancanti. Con il metodo degli eventi estesi, perdere un evento sarebbe molto improbabile.


4

Come puoi vedere dall'elenco degli eventi DDL , un trigger DDL non può essere abbastanza esplicito per le tue esigenze.

Consiglio di scrivere uno script PowerShell per eseguire il ripristino o il collegamento e quindi eseguire la procedura memorizzata immediatamente successiva. Intendiamoci, il tuo negozio dovrà essere istruito a utilizzare questo invece di un tipico ripristino o collegamento.

Sfortunatamente non credo che ci sia un modo integrato per raggiungere questo obiettivo.


4

Come stai eseguendo i tuoi backup? Se stai solo cercando di eseguire SP dopo il backup, puoi configurarlo come un'altra attività nel processo, se li stai utilizzando o in un piano di manutenzione.

Quindi è possibile impostare il controllo per scrivere nel registro eventi e quindi creare un avviso che eseguirà un lavoro. Sembra contorto ma farà quello che stai chiedendo.

Dai un'occhiata al seguente codice:

--Create the Server Audit
USE master
GO
CREATE SERVER AUDIT BackupTrap
TO APPLICATION_LOG
WITH (QUEUE_DELAY = 0, ON_FAILURE = CONTINUE)
GO

--Turn the Audit On
ALTER SERVER AUDIT BackupTrap
WITH (STATE = ON)
GO

--Create the Database Audit Specification
USE AdventureWorks2012
GO
CREATE DATABASE AUDIT SPECIFICATION BackupTrapAdventureWorks
FOR SERVER AUDIT BackupTrap
    ADD (BACKUP_RESTORE_GROUP)
WITH (STATE = ON)
GO

--Create the job to run
USE msdb
GO
EXECUTE dbo.sp_add_job
    @job_name = N'BackupAlertJob'
GO

EXECUTE dbo.sp_add_jobserver
    @job_name = N'BackupAlertJob'
GO

EXECUTE dbo.sp_add_jobstep
    @job_name = N'BackupAlertJob',
    @step_name = N'RunSP',
    @subsystem = N'TSQL',
    @command = N'EXECUTE dbo.MyStoredProcedure',
    @database_name = N'AdventureWorks2012'
GO

Un processo di ripristino che cattura questo è una buona idea. Tuttavia, mi chiedo se questa sia una soluzione completa dato che l'OP vuole catturare "qualsiasi" evento di ripristino.
Nick Chammas,

Essere in grado di eseguire una stored procedure arbitraria dopo il completamento di qualsiasi evento di ripristino è ciò che stiamo cercando. Un suggerimento valido comunque.
Matthew Ruston,

Ho rimosso la mia seconda risposta e modificato quanto sopra per includere le informazioni. Grazie @Shark per il suggerimento su quello. Totalmente non ci ho pensato.
jgardner04,

0

Come stai eseguendo i tuoi backup? Con Commvault è possibile impostare un processo di ripristino automatizzato e farlo eseguire script pre e post ripristino che possono essere SQL o PowerShell. Lo faccio sempre per eseguire DDL per le differenze di versione e per eseguire il backup e il ripristino delle autorizzazioni durante il ripristino tra ambienti.

Credo che Netbackup possa altri prodotti avere funzionalità simili

Se si utilizza SQL, è sufficiente aggiungerlo come passaggio al processo che ripristina il database

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.