SQL Server 로그에 커밋되지 않은 작업이 기록됩니까?


12

나는 종종 모든 트랜잭션과 opeation마다 SQL Server 로그 레코드와 같은 문장을 봅니다.

그러나 트랜잭션이 결국 롤백 될 때 어떤 일이 발생하는지 혼동 됩니다 .

말 명시 적 트랜잭션은 3 문이있다 : statement A, statement B, statement C, 그리고 마지막으로 rollback statement D.

이제 실행이에 도달하지 않으면 rollback statement D수정 결과 statements A through C가 SQL Server 로그에 기록됩니까?

이해 1 :

문 A부터 D까지 모두 기록됩니다. SQL Server는 무엇이든 관계없이 모든 것을 기록합니다.

이해 2 : 수정 사항은 메모리 어딘가에 만 저장되며 SQL Server가 commit명령문을 볼 때만 기록됩니다 . rollback명령문 으로 판명 되면 SQL Server는 단순히 트랜잭션을 무시합니다. 목적에 맞지 않기 때문에 로그에 쓰지 않습니다. 있을 때 즉, SQL Server는 로그 그물 결과를 이전이후 거래.

둘 다 논리적으로 보이지만 적어도 나에게는 맞지 않을 수 있습니다. 도움을 주셔서 감사합니다.


안녕하세요. [ systoolsgroup.com/sql-log-analyzer.html](SQL Log Analyzer)을 사용해 로그 파일에서 발생하는 일을 분석하십시오. SQL 로그 데이터 미리보기 전용 으로 SysTools SQL Log Analyzer 무료 버전을 사용해 볼 수 있습니다 . 이것이 효과가 있기를 바랍니다.
Rylan08

답변:


13

1을 이해하는 것이 맞습니다. SQL Server는 데이터를 트랜잭션 로그로 변경하는 모든 작업을 기록합니다. 롤백은 데이터에 대한 변경이므로 트랜잭션 로그에도 기록됩니다. 명령문 A를 실행하면 트랜잭션 로그에 데이터를 쓰고 명령문 A를 롤백해야하는 경우 트랜잭션 로그에 데이터를 예약합니다. B와 C의 경우에도 마찬가지입니다. 트랜잭션을 롤백 할 때 더 많은 정보가 로그에 기록됩니다.

아래에서 간단한 데모를 볼 수 있습니다. 다음은 로그에 작성된 내용을 확인하는 데 사용할 쿼리입니다.

SELECT 
  COUNT(*) transaction_count
, SUM(database_transaction_log_bytes_used) used_bytes
, SUM(database_transaction_log_bytes_reserved) reserved_bytes
FROM sys.dm_tran_database_transactions
where database_id = 10;

내 테이블 :

create table TLOGDEMO (FLUFF VARCHAR(1000));

BEGIN TRANSACTION

쿼리 A는 최소 로깅을 사용합니다.

INSERT INTO TLOGDEMO WITH (TABLOCK)
SELECT REPLICATE('A', 1000)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;

A 후 :

╔═══════════════════╦════════════╦════════════════╗
 transaction_count  used_bytes  reserved_bytes 
╠═══════════════════╬════════════╬════════════════╣
                 1    24006640       175429451 
╚═══════════════════╩════════════╩════════════════╝

쿼리 B는 최소 로깅을 사용하지 않습니다.

INSERT INTO TLOGDEMO
SELECT REPLICATE('B', 1000)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;

B 이후 :

╔═══════════════════╦════════════╦════════════════╗
 transaction_count  used_bytes  reserved_bytes 
╠═══════════════════╬════════════╬════════════════╣
                 1  7352935708      1613986255 
╚═══════════════════╩════════════╩════════════════╝

쿼리 C는 적은 데이터를 변경합니다.

INSERT INTO TLOGDEMO
SELECT REPLICATE('C', 1000)
FROM master..spt_values c;

C 이후 :

╔═══════════════════╦════════════╦════════════════╗
 transaction_count  used_bytes  reserved_bytes 
╠═══════════════════╬════════════╬════════════════╣
                 1  7355821748      1614545331 
╚═══════════════════╩════════════╩════════════════╝

이제 ROLLBACK롤백이 발생하는 동안 a를 발행 하고 DMV를 쿼리합니다. 다음은 몇 가지 스냅 샷 표입니다.

╔═══════════════════╦════════════╦════════════════╗
 transaction_count  used_bytes  reserved_bytes 
╠═══════════════════╬════════════╬════════════════╣
 1                  7393305528  1573797677     
 1                  7458767420  1502635737     
 1                  7682482356  1259440979     
 1                  7803881368  1127471233     
 ...                ...         ...            
╚═══════════════════╩════════════╩════════════════╝

동안 ROLLBACK사용 된 바이트 수가 증가하고 예약 된 바이트 수가 줄어 듭니다. SQL Server가 트랜잭션을 실행 취소하기 위해 따로 설정 한 공간을 사용하고 있기 때문입니다. 트랜잭션을 취소하려면 더 많은 데이터를 로그에 쓰도록 데이터를 변경해야합니다.


8

데이터베이스 테이블에 대한 수정 사항은 먼저 로그 파일에 기록 된 다음 테이블 자체에 먼저 메모리에 기록 된 다음 비동기 프로세스 인 CHECKPOINT디스크에 기록됩니다. 이 메커니즘을 WAL (Write-Ahead Logging)이라고 하며 모든 관계형 데이터베이스에 공통입니다.

로그 자체는 먼저 메모리 (정확히 로그 버퍼에)에 기록 된 다음 디스크에 기록되지만 로그가 디스크에 기록 될 때까지 데이터베이스 테이블에는 아무런 영향이 없습니다.

이 메커니즘을 사용하면 복구 프로세스 중에 커밋 된 트랜잭션을 롤 포워드하고 커밋되지 않은 트랜잭션을 롤백 할 수 있습니다. 뭔가 나쁜 이후에 발생하는 경우, 귀하의 예제에 대해서는 statement C당신이 한 commit대신의를 rollback각각의 트랜잭션의 모든 단계를 저장하지 않고, (사전에이를 알 수 없다)의 RDBMS는 일관성있는 데이터베이스를 복구 할 방법이 없습니다 와 거래가에서 D(내구성)을 충족하지 않습니다 ACID.

일부 작업이 롤백 되면 로그 파일이 아닌 순 변경 사항 (을 통해 ) 을받는 데이터 파일입니다 CHECKPOINT.


5

1을 이해하는 것이 정확하며, 스파게티 바와 조는 좋은 설명을합니다.

테스트 인스턴스에서 직접 테스트하고 싶다면 아래 스크립트를 사용하십시오.

--create a database and table for testing
USE master
GO
CREATE DATABASE tranlogtest
GO
USE tranlogtest
GO
CREATE TABLE t1
(junk char(1))

CHECKPOINT
GO

BEGIN TRAN
INSERT t1 VALUES ('a')
INSERT t1 VALUES ('b')
INSERT t1 VALUES ('c')

ROLLBACK
INSERT t1 VALUES ('d')

SELECT *
FROM fn_dblog(NULL,NULL)

SQL Server는 작업을 실행 취소하기 위해 취한 단계까지 모든 것을 기록합니다.

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