SQL Server 트랜잭션 로그 백업 : 테일 로그가 마지막으로 알려진 로그 백업을 따르는 지 테스트


11

전체 복구 모드에서 SQL Server를 사용하고 있습니다. 전체 백업과 일련의 로그 백업이 제공되면 마지막 전체 백업에서 현재 테일 로그까지 로그 체인이 완전한지 확인할 수 있습니다. 실제로 백업을 복원하지 않고 백업의 일관성을 테스트하는 것이 목적입니다.

기존 백업에 대해이 작업을 수행하는 방법을 이미 알고 있습니다. RESTORE HEADERONLY를 사용하면 모든 파일의 FirstLSN 및 LastLSN을 가져와 연속 파일과 비교하여 호환되는지 여부를 확인할 수 있습니다.

그러나 꼬리 로그가 마지막 로그 백업을 따르는 지 확인하는 방법을 모르겠습니다.

테일 로그의 FirstLSN이 있으면 마지막 로그 백업의 LastLSN과 비교할 수 있습니다. 그러나 꼬리 로그의 FirstLSN을 어떻게 얻을 수 있습니까?

SQL Server 2005 이상에서 이상적으로 작동하는 솔루션이 필요합니다 (이상적으로 t-sql 사용). 지금까지 나는 아무 소용이없는 구글을 검색했다. Btw. 나는 이것을 stackoverflow에 처음 게시했다. 주제에서 벗어난 것으로 표시되었으므로 여기로 마이그레이션했습니다.

편집하다

작은 예제 (SQL Server 2005, 9.0.5057)에서 두 가지 솔루션을 시도했습니다.

BACKUP DATABASE TestDb TO DISK = 'C:\temp\backup test\Full.bak' 

-- fire some update queries

BACKUP LOG TestDb TO DISK =  'C:\temp\backup test\Log1.bak' 

-- fire both queries from the provided answers: 
-- Martin Smith's answer yields: 838886656088920652852608
-- Shawn Melton's answer yields: 46000000267600001

RESTORE HEADERONLY FROM DISK = 'C:\temp\backup test\Log1.bak'  
-- yields: 46000000267600001

그래서 첫 번째 것은 몇 자릿수 정도 떨어져 있습니다.

그런 다음 SQL 2008 SP1 (10.00.2531)에서 동일한 테스트를 수행하여 두 쿼리 모두 정답을 얻었습니다.


흥미로운 질문이기 때문에 몇 가지 연구를 해왔지만 멀지 않았습니다. SQL이 이것을 즉시 지원하는지 확실하지 않습니다.
캐서린 빌리 드

1
이것을 확인하는 방법이 있다고 확신합니다 .LSN을 사용하는 것이 방법이 아닐 수도 있습니다. 몇 시간 후에 질문에 현상금을 넣을 것입니다.이 질문에는 더 많은 견해가 필요합니다.

답변:


12

SQL Server 2008 Internals 사본을 보았고 다음 로그 백업의 첫 번째 LSN을 찾기 위해 DMV sys.database_recovery_status 가 지적되었습니다. BOL은 어떤 열을 last_log_backup_lsn제공 합니까?

가장 최근의 로그 백업의 로그 시퀀스 번호입니다. 이것이 이전 로그 백업의 마지막 LSN이고 다음 로그 백업의 시작 LSN입니다.
NULL = 로그 백업이 없습니다. 데이터베이스가 오프라인이거나 데이터베이스가 시작되지 않습니다.

또한 Kalen은 데이터베이스가 SIMPLE 복구 모드 (자동 잘라 내기 모드)에 있거나 로그 백업이없는 경우 NULL 값을 얻을 수 있다는 점을 언급합니다.

그러나 꼬리 로그의 FirstLSN을 어떻게 얻을 수 있습니까?

실제로 데이터베이스의 테일 로그를 백업하지 않고 (이를 시도 할 테스트 인스턴스가 없음) 언급 된 열에 반환 된 값이 다음 로그 백업의 첫 번째 LSN이라고 논리적으로 결론 지을 수 있습니다. 꼬리.

따라서 다음을 실행하면 찾고 있다고 생각하는 값이 반환됩니다.


SELECT 
   last_log_backup_lsn
FROM 
   sys.database_recovery_status
WHERE 
   databse_id = DB_ID('MyDb')

이 DMV는 SQL 2005부터 사용할 수 있습니다.

편집
BOL 링크를 읽지 않으면이 DMV는 온라인이거나 BOL이 참조하는대로 열린 데이터베이스에만 값을 반환합니다. 데이터베이스의 테일 로그 백업을 수행해야하는 장애가 발생하면 데이터베이스에 액세스 할 수 없으면 위의 코드를 통해이 값을 확인할 수 없습니다. 실패하면 아마 아닐 것입니다.


이 쿼리의 결과가 올바른 것 같습니다.
Andreas

확실히 나에게 옳아 보인다. last_log_backup_lsn은 로그 꼬리의 first_lsn과 같습니다. 따라서 Shawn의 코드에서 last_lsn과 last_log_backup_lsn과 동일한 로그 파일을 복원 할 경우 테일 로그까지 백업이 있음을 알 수 있습니다. (물론 쿼리 시점에서만 사실이 보장됩니다. 다음 순간에 새 로그 백업을 시작할 수 있습니다.)
RLF

@RLF는 데이터베이스에 액세스 할 수없는 경우에도 마찬가지이므로 추가 메모를 추가했습니다. 재해 복구 계획을 구현해야 할 때 실제로 사용 가능한 솔루션은 아닙니다. 탁상 연습이나 계획 테스트에 적합합니다.

6

다음과 같은 것이해야합니다.

WITH LSN_CTE
AS
(
SELECT TOP 1
       LEFT( LogRecords.[Current LSN], 8 )          AS Part1,
       SUBSTRING( LogRecords.[Current LSN], 10, 8 ) AS Part2,
       RIGHT( LogRecords.[Current LSN], 4 )         AS Part3
FROM   sys.fn_dblog(NULL,NULL) AS LogRecords
ORDER BY [Current LSN]
)
SELECT CAST( CAST( CONVERT( varbinary, Part1, 2 ) AS int ) AS varchar ) +
       RIGHT( '0000000000' + CAST( CAST( CONVERT( varbinary, Part2, 2 ) AS int ) AS varchar ), 10 ) +
       RIGHT( '00000'      + CAST( CAST( CONVERT( varbinary, Part3, 2 ) AS int ) AS varchar ), 5 ) AS [Converted LSN]
FROM   LSN_CTE

이 기사 에서 십진수로 변환 코드 사용 .

ORDER BY [Current LSN]물론 완전히 불필요한 오버 헤드 일 수있다. 잘 모르겠습니다. 이 함수의 결과는 항상 LSN 순서 인 것처럼 보이며 로그를 순차적으로 읽지 만 경우에 따라 ...


@ MartinSmith : fn_dblog잘 문서화되지 않은 것 같습니다. WHERE DbName = 'XXX'스 니펫에 없기 때문에 결과가 항상 현재 데이터베이스에 대해 유지된다고 가정 합니까?
Andreas

@Andreas-예. 문서화되지 않았습니다. 그리고 예, 현재 데이터베이스의 로그에서 정보를 반환합니다.
Martin Smith

원래 질문에 대한 편집 내용을 참조하십시오. 스 니펫이 리턴 한 수는 동일한 DB에 대한 최근 백업의 LSN보다 훨씬 큽니다.
Andreas

@Andreas-이상합니다. 하나의 테스트 DB에서만 시도했지만 올바르게 작동했습니다. 오류가 어디에 있는지 확실하지 않습니다. 어떤 버전의 SQL Server를 실행하고 있습니까? CONVERT스타일 매개 변수는 2문제가 될 수 있습니다.
Martin Smith

(하지만 어쨌든 Shawn의 대답은이 방법보다 훨씬 선호되는 것 같습니다)
Martin Smith
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.