RESTORE DATABASE 이벤트 후 저장 프로 시저 자동 실행


9

그것은 가질 수 있습니다 SQL 서버 2008 R2 표준이 자동으로되는 특정 데이터베이스의 저장 프로 시저 실행 복원 또는 attachced 인스턴스에를?

DDL 이벤트 이후 CREATE_DATABASE또는 주어진 데이터베이스에서 저장 프로 시저를 실행하는 서버 수준 트리거를 생성하여 솔루션에 가까워졌습니다 ALTER_DATABASE. 불행하게도, 이것은 데이터 백 백업 복원에는 작동하지 않습니다.

더 자세히 설명하자면, 우리는 복원하는 모든 데이터베이스에 존재하는 '정리'저장 프로 시저를 보유하고 있으며 백업이 인스턴스로 복원 될 때마다이를 자동으로 실행하는 방법을 찾고 있습니다.

인터넷 검색 을 통해 SQL Server에서 감사 또는 정책 을 구성 하여이 기능을 사용할 수 있었지만 이러한 기능은 언뜻보기에 압도적이므로 감사 또는 경찰이 조사를 시작할 수 있는지 알 수 없습니다.

답변:


10

복원이 완료된 직후에 실행해야합니까 아니면 잠시 지연 될 수 있습니까? 내가 가진 한 가지 아이디어는 1 분마다 실행되는 작업을 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을 기반으로 이미 수행 한 정리를 저장하고, 1 분마다 (또는 허용 가능한 지연 임계 값이 무엇이든) 실행 한 추적 쿼리를 마지막 행 또는 마지막 행보다 큰 StartTime 값만 보도록 제한 할 수도 있습니다. 작업이 실행 된 시간 중 더 적은 시간


1
매우 매끄럽고 좋은 생각입니다. +1
Thomas Stringer

약간의 지연이 허용됩니다. 나는 이것을 시도 할 것입니다.
Matthew Ruston

1
모든 경우에 추적 행이 작성되기 전에 실제로 이벤트가 완료되었음을 확인하지는 않았습니다. 나는 그것이 사건 이후의 글이라고 생각하지만 EndTime결코 채워지지 않는 것처럼 보이기 때문에 의심 스럽다 . 데이터베이스에 연결하려고 시도 할 수 있으며,이를 수행 할 수 없으면 건너 뛰고이 복원 이벤트를 문서화하지 말고 다음에 작업이 실행될 때 다시 시도하십시오. 시도하고 유효성을 검사하려고하지만 로컬 VM에는 SSD 만 있지만 동작을 정확하게 관찰하는 데 시간이 오래 걸리는 디스크 공간이 없습니다. :-)
Aaron Bertrand

6

database_started 확장 이벤트는 데이터베이스가 복원 된 후 발생합니다.

database_id필드 %RESTORE%에서 찾는 술어를 사용 하여 필드 를 캡처하는 이벤트 세션을 작성하십시오 sql_text(참고 : 이것으로 충분하다고 생각합니다. 직접 테스트하고 싶을 것입니다).

이벤트에 응답하는 가장 좋은 방법을 알려주는 확장 이벤트에 익숙하지 않습니다. 저장 프로 시저를 직접 실행할 수 있다면 좋을 것입니다. 그래도 가능한지 모르겠습니다. 그러나 확실히 이벤트 버퍼를 폴링 할 수 있으며 이는 성능상의 이유로뿐만 아니라 서버가 매우 바쁘고 폴링 간격이 너무 길면 누락 된 이벤트를 완전히 종료 할 수 있습니다. 확장 이벤트 방법을 사용하면 이벤트가 누락 될 가능성이 거의 없습니다.


4

DDL 이벤트 목록에서 볼 수 있듯이 DDL 트리거는 요구 사항에 대해 충분히 명시 적으로 표현할 수 없습니다.

복원 또는 첨부를 수행 한 다음 즉시 저장 프로 시저를 실행하기 위해 PowerShell 스크립트를 작성하는 것이 좋습니다 . 상점에서 일반적인 복원 또는 연결 대신이를 사용하도록 지시해야합니다.

불행히도 나는 이것을 달성하기위한 내장 방법이 없다고 생각합니다.


4

백업은 어떻게 진행하고 있습니까? 백업 후 SP를 실행하려는 경우 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

이를 캡처하는 복원 작업은 좋은 생각입니다. 그러나 OP가 "임의"복원 이벤트를 캡처하려는 경우 완벽한 솔루션인지 궁금합니다.
Nick Chammas

복원 이벤트가 완료된 후 임의의 저장 프로 시저를 실행할 수 있다는 것은 실제로 우리가 추구하는 것입니다. 그럼에도 불구하고 유효한 제안입니다.
Matthew Ruston

두 번째 답변을 제거하고 정보를 포함하도록 위의 내용을 편집했습니다. 그 팁에 대한 @Shark 감사합니다. 완전히 그렇게 생각하지 않았습니다.
jgardner04

0

백업은 어떻게 진행하고 있습니까? Commvault를 사용하면 자동 복원 작업을 설정하고 SQL 또는 powershell 일 수있는 사전 및 사후 복원 스크립트를 실행할 수 있습니다. 버전 간 차이를 위해 DDL을 실행하고 환경간에 복원 할 때 권한을 백업 및 복원하기 위해 항상이 작업을 수행합니다.

Netbackup은 다른 제품과 비슷한 기능을 할 수 있다고 생각합니다.

SQL을 사용하는 경우 데이터베이스를 복원하는 작업에 단계로 추가하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.