Automatycznie wykonaj zapisaną procedurę po każdym zdarzeniu PRZYWRÓĆ BAZY DANYCH

9

Czy jest możliwe, aby SQL Server 2008 R2 Standard automatycznie wykonywał procedurę przechowywaną w dowolnej bazie danych, która jest przywracana lub dołączana do instancji?

Znalazłem rozwiązanie, tworząc wyzwalacz na poziomie serwera, który wykonuje procedurę przechowywaną w danej bazie danych po zdarzeniu DDL CREATE_DATABASElub ALTER_DATABASEzostał zwolniony. Niestety nie działa to w przypadku przywracania kopii zapasowej bazy danych.

Aby to rozwinąć, mamy procedurę przechowywaną „czyszczenia”, która istnieje w każdej przywracanej bazie danych, i szukam sposobu na automatyczne wykonanie tego zadania przy każdym przywróceniu kopii zapasowej w instancji.

Googling wskazał mi na skonfigurowanie Audytu lub Polityki w SQL Server, aby uzyskać tę funkcjonalność, ale te funkcje są na pierwszy rzut oka przytłaczające, więc nie mogę powiedzieć, czy Audyty lub zasady są drogą do rozpoczęcia dochodzenia.

Matthew Ruston
źródło

Odpowiedzi:

10

Czy musi zostać wykonane natychmiast po zakończeniu przywracania, czy może zostać na krótko opóźnione? Jednym z moich pomysłów jest zadanie uruchamiane co minutę i sprawdzanie Audit Backup/Restore Eventdomyślnego śledzenia.

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

Możesz przechowywać wyczyszczenia, które już wykonałeś na podstawie StartTime, a nawet ograniczyć zapytanie śledzenia, które jest uruchamiane co minutę (lub niezależnie od akceptowalnego progu opóźnienia), aby patrzeć tylko na wartości StartTime większe niż ostatni pobrany wiersz lub ostatni czas wykonywania pracy, w zależności od tego, co jest mniejsze.

Aaron Bertrand
źródło
1
Bardzo zręczne, dobre myślenie. +1
Thomas Stringer
Niewielkie opóźnienie byłoby do przyjęcia. Spróbuję tego.
Matthew Ruston
1
Zauważ, że nie potwierdziłem, że we wszystkich przypadkach zdarzenie jest faktycznie zakończone przed zapisaniem wiersza śledzenia. Podejrzewam, że jest to zapis po zdarzeniu, ale jestem podejrzliwy tylko dlatego, że EndTimenigdy nie wydaje się być zaludniony. Może się zdarzyć, że powinieneś spróbować połączyć się z bazą danych, a jeśli nie możesz, pomiń ją i nie dokumentuj tego zdarzenia przywracania, ale spróbuj ponownie przy następnym uruchomieniu zadania. Spróbuję zweryfikować, ale na moich lokalnych maszynach wirtualnych mam tylko dyski SSD, ale nie mają one miejsca na dysku, aby wykonanie kopii zapasowej trwało wystarczająco długo, aby dokładnie obserwować zachowanie. :-)
Aaron Bertrand
6

database_started Rozszerzone zdarzenia jest zwolniony po przywróceniu bazy danych.

Utwórz sesję zdarzenia, która przechwytuje database_idpole z predykatem, który szuka %RESTORE%w sql_textpolu (uwaga: uważam, że to wystarczy - będziesz chciał przetestować sam).

Nie znam się na rozszerzonych wydarzeniach, aby powiedzieć ci, jak najlepiej zareagować na zdarzenie. Byłoby miło, gdybyś mógł bezpośrednio uruchomić procedurę przechowywaną; Nie wiem jednak, czy to możliwe. Z pewnością możesz sondować bufor zdarzeń, a to jest lepsze niż skanowanie domyślnego śledzenia - nie tylko ze względu na wydajność, ale jeśli serwer jest bardzo zajęty, a interwał sondowania jest zbyt długi, możesz skończyć z brakiem zdarzeń. W metodzie Extended Events pominięcie zdarzenia byłoby bardzo mało prawdopodobne.

Jon Seigel
źródło
4

Jak widać na liście zdarzeń DDL, wyzwalacz DDL nie może być wystarczająco wyraźny dla twojego wymagania.

Polecam napisanie skryptu PowerShell, aby wykonać przywracanie lub dołączyć, a następnie wykonać procedurę przechowywaną bezpośrednio po. Pamiętaj, że Twój sklep będzie musiał zostać poinstruowany, aby użyć tego zamiast typowego przywracania lub dołączania.

Niestety nie wierzę, że istnieje wbudowany sposób na osiągnięcie tego.

Thomas Stringer
źródło
4

Jak przebiegają kopie zapasowe? Jeśli chcesz tylko uruchomić SP po utworzeniu kopii zapasowej, możesz ustawić to jako inne zadanie w zadaniu, jeśli ich używasz lub plan konserwacji.

Dzięki temu możesz skonfigurować inspekcję do zapisywania w dzienniku zdarzeń, a następnie utworzyć alert, który wykona zadanie. Wygląda na zawiłe, ale zrobi to, o co prosisz.

Spójrz na następujący kod:

--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
jgardner04
źródło
Zadanie przywracania, które to wychwytuje, jest dobrym pomysłem. Zastanawiam się jednak, czy jest to kompletne rozwiązanie, biorąc pod uwagę, że OP chce uchwycić „dowolne” zdarzenie przywracania.
Nick Chammas
Możliwość wykonania dowolnej procedury przechowywanej po zakończeniu dowolnego zdarzenia przywracania jest naprawdę tym, czego szukamy. Niemniej jednak ważna sugestia.
Matthew Ruston
Usunąłem drugą odpowiedź i edytuję powyższe, aby uwzględnić informacje. Dzięki @Shark za wskazówkę na ten temat. Zupełnie nie myślałem o tym.
jgardner04
0

Jak przebiegają kopie zapasowe? Za pomocą Commvault możesz skonfigurować automatyczne zadanie przywracania i uruchamiać skrypty przed i po przywracaniu, które mogą być SQL lub PowerShell. Robię to przez cały czas, aby uruchamiać DDL dla różnic wersji oraz tworzyć kopie zapasowe i przywracać uprawnienia podczas przywracania między środowiskami.

Wierzę, że Netbackup może mieć inne produkty o podobnej funkcjonalności

Jeśli używasz SQL, po prostu dodaj go jako krok do zadania, które przywraca bazę danych

Alen
źródło