Автоматично виконувати збережену процедуру після будь-якої події RESTORE DATABASE


9

Чи можливо мати стандарт SQL Server 2008 R2 автоматично виконувати збережену процедуру в будь-якій заданій базі даних, яка відновлюється або приєднується до екземпляра?

Я наблизився до рішення, створивши тригер рівня сервера, який виконує збережену процедуру в заданій базі даних після події DDL CREATE_DATABASEабо ALTER_DATABASEїї звільнення. На жаль, це не працює для відновлення резервного копіювання даних.

Для розробки ми маємо «очистити» збережену процедуру, яка існує у кожній базі даних, яку ми відновлюємо, і я шукаю спосіб автоматичного виконання цього завдання, коли резервна копія буде відновлена ​​до екземпляра.

Гуглінг вказав мені на налаштування або аудитів, або політик у SQL Server, щоб отримати цю функціональність, але ці функції на перший погляд є досить переважними, тому я не можу сказати, чи аудит чи поліси - це шлях для початку розслідування.

Відповіді:


10

Чи потрібно це виконати відразу після завершення відновлення, чи можна ненадовго затримати? Однією з ідей у ​​мене було - мати роботу, яка працює щохвилини, і перевіряє, чи немає Audit Backup/Restore Eventу сліді за замовчуванням.

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

Ви можете зберігати очищення, які ви вже зробили на основі StartTime, і навіть обмежувати запит на слід, який виконується щохвилини (або будь-який прийнятний поріг затримки), щоб переглянути лише значення StartTime, що перевищують останній рядок, який ви витягнули, або останній час виконання роботи, залежно від того, що менше.


1
Дуже струнка, гарна думка. +1
Томас Стрінгер

Невелика затримка була б прийнятною. Я спробую це спробувати.
Меттью Растон

1
Зауважте, що я не підтвердив, що у всіх випадках подія фактично закінчується до того, як буде записано рядок слідів. Я підозрюю, що це написання після події, але я підозрілий лише тому, що EndTimeніколи не здається заселеним. Можливо, вам слід спробувати підключитися до бази даних і, якщо ви не можете, пропустити її та не документувати цю подію відновлення, але спробуйте ще раз наступного разу, коли робота запуститься. Я б спробував і перевірити, але для моїх локальних віртуальних машин у мене є тільки SSD, але у них немає місця на диску, щоб зробити резервну копію достатньо довго, щоб точно спостерігати за поведінкою. :-)
Аарон Бертран

6

database_started Розширена Подія викликається після відновлення бази даних.

Створіть сеанс події, який захоплює database_idполе з присудком, який шукає %RESTORE%в sql_textполі (зверніть увагу: я вважаю, що цього достатньо - ви хочете перевірити на собі).

Я недостатньо знайомий із розширеними подіями, щоб сказати вам найкращий спосіб реагування на подію. Було б добре, якби ви могли запустити збережену процедуру безпосередньо; Я не знаю, чи можливо це можливо. Ви, звичайно, можете опитувати буфер подій, і це бажано для сканування трасування за замовчуванням - не тільки з міркувань продуктивності, але якщо сервер дуже зайнятий і інтервал опитування занадто довгий, ви можете закінчити відсутні події прямо. За допомогою методу Extended Events пропустити подію було б малоймовірним.


4

Як видно зі списку подій DDL, тригер DDL не може бути достатньо явним для вашої вимоги.

Я рекомендую написати сценарій PowerShell для відновлення або вкладення, а потім виконати збережену процедуру негайно. Зауважте, ваш магазин повинен буде доручити використовувати це замість типового відновлення чи вкладення.

На жаль, я не вірю, що існує вбудований спосіб досягти цього.


4

Як ви запускаєте резервні копії? Якщо ви просто хочете запустити SP після створення резервної копії, ви можете встановити його як інше завдання в роботі, якщо ви їх використовуєте, або план обслуговування.

Таким чином, ви можете налаштувати аудит для запису в журнал подій, а потім створити попередження, яке виконує завдання. Це здається переплутаним, але воно зробить те, що ви просите.

Погляньте на наступний код:

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

Робота з відновлення, яка фіксує це, є хорошою ідеєю. Однак мені цікаво, чи це повне рішення з огляду на те, що ОП хоче зафіксувати будь-яку подію відновлення.
Нік Чаммас

Нам потрібно виконати довільну збережену процедуру після завершення будь-якої події відновлення. Проте дійсна пропозиція.
Меттью Растон

Я видалив свою другу відповідь і відредагував вище, щоб включити інформацію. Дякую @Shark за пораду щодо цього. Повністю не думав про це.
jgardner04

0

Як ви запускаєте резервні копії? За допомогою Commvault ви можете налаштувати автоматизоване завдання відновлення та запустити його до і після скриптів відновлення, які можуть бути SQL або повноцінними оболонками. Я роблю це весь час для запуску DDL для відмінностей у версіях та для резервного копіювання та відновлення дозволів під час відновлення між середовищами.

Я вважаю, що Netbackup може мати інші продукти подібними функціоналами

Якщо ви використовуєте SQL, просто додайте його як крок до завдання, що відновлює базу даних

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.