>

데이터베이스를 단순으로 변경 한 다음 전체 또는 대량 로그 복구 모델로 되 돌린 인스턴스를 해결하고 싶습니다. 분명히 다음 로그/차등 백업이 실패하므로 백업 유지 관리 계획을위한 것입니다. 복구 모델 변경을 모니터링 할 수있는 DMO가 있습니까?

  • 답변 # 1

    이 정보는 SQL Server 로그에서 볼 수 있습니다. 이 링크에는 특정 항목을 검색하는 예제를 보여주는 쿼리 텍스트가 있습니다.

    https : //www.sqlrx. com/find-out-who-changed-the-database-recovery-model/

    여러분의 편의를 위해 위 링크에 스크립트를 포함 시켰습니다. 이것은 내 스크립트가 아니라 위의 사이트에서 제공 한 것으로 일부 형식이 수정되었습니다.

    DECLARE @tracefile VARCHAR(500);
    DECLARE @ProcessInfoSPID VARCHAR(20);
    CREATE TABLE [dbo].[#SQLerrorlog]
        (
            [LogDate] DATETIME NULL
            , [ProcessInfo] VARCHAR(10) NULL
            , [Text] VARCHAR(MAX) NULL
        );
    /*
    Valid parameters for sp_readerrorlog
    1 – Error log: 0 = current, 1 = Archive #1, 2 = Archive #2, etc…
    2 – Log file type: 1 or NULL = error log, 2 = SQL Agent log
    3 – Search string 1
    4 – Search string 2
    
    Change parameters to meet your needs
    */
    --Read error log looking for the words RECOVERY
    --and either FULL, SIMPLE or BULK_LOGGED indicating a change from prior state
    INSERT INTO #SQLerrorlog
    EXEC sp_readerrorlog 0, 1, 'RECOVERY', 'FULL';
    INSERT INTO #SQLerrorlog
    EXEC sp_readerrorlog 0, 1, 'RECOVERY', 'SIMPLE';
    INSERT INTO #SQLerrorlog
    EXEC sp_readerrorlog 0, 1, 'RECOVERY', 'BULK_LOGGED';
    UPDATE #SQLerrorlog
    SET ProcessInfo = SUBSTRING(ProcessInfo, 5, 20)
    FROM #SQLerrorlog
    WHERE ProcessInfo LIKE 'spid%';
    -- Get path of default trace file
    SELECT @tracefile = CAST(value AS VARCHAR(500))
    FROM sys.fn_trace_getinfo(DEFAULT)
    WHERE traceid = 1
        AND property = 2;
    -- Get objects altered from the default trace
    SELECT IDENTITY(INT, 1, 1) AS RowNumber
           , *
    INTO #temp_trc
    FROM sys.fn_trace_gettable(@tracefile, DEFAULT) g -- default = read all trace files
    WHERE g.EventClass = 164;
    SELECT t.DatabaseID
           , t.DatabaseName
           , t.NTUserName
           , t.NTDomainName
           , t.HostName
           , t.ApplicationName
           , t.LoginName
           , t.SPID
           , t.StartTime
           , l.Text
    FROM #temp_trc t
        JOIN #SQLerrorlog l ON t.SPID = l.ProcessInfo
    WHERE t.StartTime > GETDATE() - 1 -- filter by time within the last 24 hours
    ORDER BY t.StartTime DESC;
    DROP TABLE #temp_trc;
    DROP TABLE #SQLerrorlog;
    GO
    
    

  • 답변 # 2

    하나의 옵션은 SQL Server SERVER TRIGGER 를 사용하는 것입니다 . 다음은 EVENT 를 심문하는 예입니다.  복구 모델 변경에 대해 경고하기 위해 데이터 및 전송 및 이메일.

    USE [master]
    GO
    create TRIGGER [SCUTILITY_DDL_ALTER_DB] 
    ON ALL SERVER 
    FOR ALTER_DATABASE as
    declare @text nvarchar(max)
    declare @login varchar(128)
    declare @recovery smallint
    declare @body nvarchar(max)
    SET @text = EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)') 
    SET @login = EVENTDATA().value('(/EVENT_INSTANCE/LoginName)[1]' ,'varchar(128)') 
    SET @recovery = PATINDEX('%RECOVERY%',@text) 
    SET @body = 'Login=' + @login + char(10) + 'Event=' + @text
    IF @recovery>0
    BEGIN 
    EXEC msdb.dbo.sp_send_dbmail
        @profile_name = 'SqlServerEmailProfile',
        @recipients = '<YourEmailAddress>',
        @body = @body,
        @body_format = 'text',
        @subject = 'Alter database - Recovery model changed!',
        @importance = 'High';
    END 
    
    GO
    ENABLE TRIGGER [SCUTILITY_DDL_ALTER_DB] ON ALL SERVER
    GO
    
    

  • 이전 postgresql - DB 하이브가 이미 존재하는지 확인하는 방법
  • 다음 postgresql - 중복 행이없는 왼쪽 조인