더 자세한 트랜잭션 로그 파일 내용


11

트랜잭션 로그에 관한 질문이 있습니다 (간단히 LDF라고 부릅니다). 전체 복구 모델이있는 데이터베이스를 가정하고 있습니다.

LDF 파일에 데이터베이스에 대한 모든 작업 (로그)이 포함되어 있다는 것을 읽었습니다 (즉, 전체 복구 모드에 있음). 로깅과 다른 점은 BEGIN TRAN; COMMAND(s); COMMIT무엇입니까? 분명히 트랜잭션을 롤백 할 수 있기 때문에 묻고 있지만 표준 명령을 롤백 할 수는 없습니다 (전체 복구 모드에서).

트랜잭션 중에 LDF 파일에 기록되는 내용이 일반 전체 복구 로깅과 다릅니다. 맞습니까? 어떻게 다릅니 까? 각 작업에 대해 "실행 취소"작업 만 포함됩니까?

관련 참고 사항에 따르면 전체 복구 LDF 파일을 사용하여 표준 쿼리를 "롤백 / 실행 취소"할 수있는 상용 도구가 있다고 들었습니다. 그들은 그걸 어떻게 햇어? 그들은 LDF 내용을 분석하고 역 / 취소 작업을 시작하려고합니까?


답변:


11

차이점은 "표준 명령"은 암시 적 트랜잭션 ( "명시 적"이 아닌 다른 의미를 가진 실제 암시 적 트랜잭션이 아님)을 가지므로 INSERT명시 적 트랜잭션없이 명령 을 실행할 때마다 트랜잭션이 열립니다. 데이터를 삽입하고 자동 커밋합니다. 이를 자동 커밋 트랜잭션이라고합니다.

이것이 또한 롤백 할 수없는 이유 INSERT입니다. 이미 커밋되었습니다. 따라서이 규칙은 명시 적 트랜잭션과 동일합니다. 일단 커밋 된 후에는 롤백 할 수 없습니다 .

SQL Server 내부에서 직접 의미하는 것을 볼 수 있습니다.

Microsoft sys.fn_dblog는 주어진 데이터베이스의 트랜잭션 로그를 살펴볼 수 있는 DMF라는 SQL Server를 제공합니다.

이 간단한 실험을 위해 AdventureWorks 데이터베이스를 사용하겠습니다.

USE AdventureWorks2008;
GO

SELECT TOP 10 *
FROM dbo.Person;
GO

INSERT INTO dbo.Person (FirstName, MiddleName, LastName, Gender, Date)
VALUES ('Never', 'Stop', 'Learning', 'M', GETDATE());
COMMIT;

BEGIN TRAN;
INSERT INTO dbo.Person (FirstName, MiddleName, LastName, Gender, Date)
VALUES ('Never', 'Stop', 'Learning', 'M', GETDATE());
COMMIT;
GO

SELECT *
FROM sys.fn_dblog(NULL, NULL);
GO

여기서는 두 가지 삽입 작업을 수행합니다. 하나는 명시 적 트랜잭션이 있거나없는 것입니다.

로그 파일에서이 둘 사이에는 전혀 차이가 없음을 알 수 있습니다.

자동 커밋과 명시 적 트랜잭션

빨간색 INSERT트랜잭션은 자동 커밋 트랜잭션 내에 있고 파란색 INSERT트랜잭션은 명시 적 트랜잭션입니다.

언급 한 타사 도구의 경우 데이터베이스 로그를 분석하고 작업을 "실행 취소"하거나 "다시 실행"하는 일반적인 T-SQL 코드를 생성합니다. 일반적으로 로그 파일에있는 것과 정확히 반대의 효과를주는 스크립트를 생성하는 것 외에는 특별한 작업을 수행하지 않습니다.


7

ApexSQL 로그 예제에서 상용 도구의 작동 방식을 설명하겠습니다.

관련 참고 사항에 따르면 전체 복구 LDF 파일을 사용하여 표준 쿼리를 "롤백 / 실행 취소"할 수있는 상용 도구가 있다고 들었습니다. 그들은 그걸 어떻게 햇어? 그들은 LDF 내용을 분석하고 역 / 취소 작업을 시작하려고합니까?

예. LDF 파일 (온라인 또는 분리)과 trn 파일 (트랜잭션 로그 백업)을 읽고 어떤 트랜잭션이 발생했는지 확인하고 동일하거나 그 반대로 수행 할 스크립트를 만듭니다.

그러나 실행 취소 및 재실행 스크립트는 실행 된 스크립트와 정확히 동일 할 필요는 없지만 효과는 동일합니다.

예를 들어, 실행 된 스크립트가 다음과 같은 경우

DELETE FROM [Person].[AddressType] WHERE Name  = 'New Loc22'

트랜잭션 로그는 열 값이 9, 'New Loc22', '41BC2FF6-F0FC-475F-8EB9-CEC1805AA0F6'및 '2002/06/01 00 : 00 : 00.000'인 테이블의 행이 삭제되었음을 기록합니다. 테이블 구조에서 도구는 기본 키가 AddressType 열임을 읽고 다음 리두 스크립트를 작성합니다.

DELETE FROM [Person].[AddressType] WHERE [AddressTypeID] = 9

트랜잭션은 원래 where 절에 사용 된 열이 아니라 기본 키 열에 연결되어 있습니다. 마찬가지로 실행 취소 스크립트는 다음과 같습니다.

INSERT INTO [Person].[AddressType] ([AddressTypeID], [Name], [rowguid], [ModifiedDate]) VALUES (9, N'New loc22' COLLATE SQL_Latin1_General_CP1_CI_AS, '41bc2ff6-f0fc-475f-8eb9-cec1805aa0f6', '20020601 00:00:00.000')

여기에 이미지 설명을 입력하십시오

면책 조항 : ApexSQL에서 지원 엔지니어로 일하고 있습니다.

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