Перейти к содержимому

Как мониторить цепочку lsn лог шипинга ( log shipping ) на разрыв.

Задача мониторить цепочку lsn при работе лог шипинга. Скрипт смотрит в папку куда бэкапятся trn  берет из них данные и сравнивает их. если есть разрыв оповещает пользователей

DECLARE @path NVARCHAR(255)
DECLARE @temp NVARCHAR(255)
DECLARE @trn NVARCHAR(MAX)
SET @path = N'\\ho_report\h$\trn бэкап\' -- сетевой путь папки с трнками
IF OBJECT_ID('tempdb..#x') IS NOT NULL
    DROP TABLE #x;
CREATE TABLE 	
				#x
(
				NAME        NVARCHAR(255) NOT NULL
                ,depth      INT NOT NULL
                ,IsFile     BIT NULL
) 
IF OBJECT_ID('tempdb..#y') IS NOT NULL
    DROP TABLE #y;
----Создаем временную таблицу для команды RESTORE HEADERONLY в курсоре. Внимание!!!! только для sql 2005, в 2012 добавленно еще одно поле и в столбце Compressed тип данных BYTE(1)-------
---Важно, какой версии инстанс выполняет запрос, а не откуда----
CREATE TABLE 	
				#y
(
				BackupName                  NVARCHAR(128)
                ,BackupDescription          NVARCHAR(255)
                ,BackupType                 SMALLINT
                ,ExpirationDate             DATETIME
                ,Compressed                 TINYINT
                ,Position                   SMALLINT
                ,DeviceType                 TINYINT
                ,UserName                   NVARCHAR(128)
                ,ServerName                 NVARCHAR(128)
                ,DatabaseName               NVARCHAR(128)
                ,DatabaseVersion            INT
                ,DatabaseCreationDate       DATETIME
                ,BackupSize                 NUMERIC(20 ,0)
                ,FirstLSN                   NUMERIC(25 ,0)
                ,LastLSN                    NUMERIC(25 ,0)
                ,CheckpointLSN              NUMERIC(25 ,0)
                ,DatabaseBackupLSN          NUMERIC(25 ,0)
                ,BackupStartDate            DATETIME
                ,BackupFinishDate           DATETIME
                ,SortOrder                  SMALLINT
                ,[CodePage]                 SMALLINT
                ,UnicodeLocaleId            INT
                ,UnicodeComparisonStyle     INT
                ,CompatibilityLevel         TINYINT
                ,SoftwareVendorId           INT
                ,SoftwareVersionMajor       INT
                ,SoftwareVersionMinor       INT
                ,SoftwareVersionBuild       INT
                ,MachineName                NVARCHAR(128)
                ,Flags                      INT
                ,BindingID                  UNIQUEIDENTIFIER
                ,RecoveryForkID             UNIQUEIDENTIFIER
                ,Collation                  NVARCHAR(128)
                ,FamilyGUID                 UNIQUEIDENTIFIER
                ,HasBulkLoggedData          BIT
                ,IsSnapshot                 BIT
                ,IsReadOnly                 BIT
                ,IsSingleUser               BIT
                ,HasBackupChecksums         BIT
                ,IsDamaged                  BIT
                ,BeginsLogChain             BIT
                ,HasIncompleteMetaData      BIT
                ,IsForceOffline             BIT
                ,IsCopyOnly                 BIT
                ,FirstRecoveryForkID        UNIQUEIDENTIFIER
                ,ForkPointLSN               NUMERIC(25 ,0)
                ,RecoveryModel              NVARCHAR(60)
                ,DifferentialBaseLSN        NUMERIC(25 ,0)
                ,DifferentialBaseGUID       UNIQUEIDENTIFIER
                ,BackupTypeDescription      NVARCHAR(60)
                ,BackupSetGUID              UNIQUEIDENTIFIER
)
INSERT #x
EXECUTE MASTER.dbo.xp_dirtree @path
       ,1
       ,1

DECLARE @cur_1 CURSOR 
SET @cur_1 =  CURSOR FORWARD_ONLY
FOR 
SELECT 		
			[NAME]
FROM   
			#x AS x
ORDER BY
       		x.Name

OPEN @cur_1 
FETCH NEXT FROM @cur_1 INTO @temp
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @trn = 'RESTORE HEADERONLY FROM DISK =''' + @path + @temp + ''' WITH NOUNLOAD'
    INSERT INTO #y
    EXEC 
    		(@trn)
    
    FETCH NEXT FROM @cur_1 INTO @temp
END
CLOSE @cur_1
DEALLOCATE @cur_1
GO
DECLARE @templsn NUMERIC(25 ,0)
DECLARE @lastlsn NUMERIC(25 ,0)
DECLARE @firstlsn NUMERIC(25 ,0)
DECLARE @cur_2 CURSOR 
SET @cur_2 =  CURSOR FORWARD_ONLY
FOR 
SELECT 		
			y.FirstLSN
           ,y.LastLSN
FROM   
			#y AS y
ORDER BY
       		y.BackupStartDate

OPEN @cur_2
FETCH NEXT FROM @cur_2 INTO @firstlsn, @lastlsn
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @templsn = (
            SELECT 		
            			@lastlsn
        )
    
    FETCH NEXT FROM @cur_2 INTO @firstlsn, @lastlsn
    IF @@FETCH_STATUS <> 0
    BEGIN
        PRINT N'последняя запись' 
        BREAK
    END
    
    IF @templsn != @firstlsn
    BEGIN
        PRINT N'Бляя!!!' -- сюда вставить оповещение
        BREAK
    END
    ELSE
        PRINT N'norm'
END
CLOSE @cur_2
DEALLOCATE @cur_2

--SELECT * FROM #y AS y
--SELECT @templsn

 

Similar Posts:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *