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.