Hi,
I tried to repro a scenario for log-clearing the log in SIMPLE recovery model. I know if there is an ACTIVE TXN, and if we issue a CHECKPOINT in SIMPLE recovery model, nothing happens i.e. 0 VLFs gets cleared in my below scenario. But i commited my explicit transaction, still log_reuse_wait_Desc is showing ACTIVE TRANSACTION and log is not getting cleared. I repro'd the same scenario by inserting records using a WHILE-Loop and it works as expected but when I use GO <n-times> to insert records, the txn is still open. Can anyone figure-out why log is not getting cleared or do i missing something over here ???
My SQL Server details
=============Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64)
Below is my repro steps. Pl don't go with the output values as I have done multiple times but no use. Log doesn't get cleared. Just follow my steps/cmds and you should be able to reproduce the same.
USE [master]
GO
CREATE DATABASE [db1]
ON PRIMARY
( NAME = N'db1',
FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\db1.mdf' ,
SIZE = 10MB ,
MAXSIZE = UNLIMITED,
FILEGROWTH = 1MB )
LOG ON
( NAME = N'db1_log',
FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\db1_log.LDF',
SIZE = 3MB , ---4 VLFs since size < 64mb
FILEGROWTH = 1MB)
GO
ALTER DATABASE db1 SET RECOVERY SIMPLE;
GO
DBCC LOGINFO(db1)
GO
/*
FileId FileSize StartOffset FSeqNo Status Parity CreateLSN
2 720896 8192 22 2 64 0
2 720896 729088 0 0 0 0
2 720896 1449984 0 0 0 0
2 974848 2170880 0 0 0 0
*/
USE db1
GO
CREATE TABLE t1
(C1 INT IDENTITY,
C2 CHAR (8000) DEFAULT 'a' --- char datatype takes all the size even 1 char is inserted. use DATALENGTH() Function
);
GO
-- i opened a new session/window/spid in the ssms and started the below explicit transaction
BEGIN TRAN
INSERT INTO t1 DEFAULT VALUES
GO 600
-- I came back to original window where i created the database
dbcc loginfo(db1);
select recovery_model_desc,log_reuse_wait_desc
from sys.databases
where name = 'db1' ;
/*
recovery_model_desc log_reuse_wait_desc
SIMPLE ACTIVE_TRANSACTION
*/
dbcc opentran(db1);
/*
Transaction information for database 'db1'.
Oldest active transaction:
SPID (server process ID): 57
UID (user ID) : -1
Name : user_transaction
LSN : (22:63:2)
Start time : Aug 19 2013 9:54:32:103PM
SID : 0x0105000000000005150000007a6fe3176386abd260a96a96e8030000
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
*/
-- I confirmed from log there is 1 Active txn
Select [Current LSN],[Operation],
[Num Transactions]
from fn_dblog(null,null)
where Operation in ('LOP_XACT_CKPT','LOP_XACT_CKPT','LOP_END_CKPT')
/*
Current LSN Operation Num Transactions
00000016:0000002e:0001 LOP_XACT_CKPT 1
00000016:0000002e:0002 LOP_END_CKPT NULL
*/
-- i went to new window and committed the explcit transaction
COMMIT;
-- Came back to old window
CHECKPOINT; --to clear the log
dbcc loginfo(db1);
-- All are active (Status=2). none of the VLFs have been made inactive
select recovery_model_desc,log_reuse_wait_desc
from sys.databases
where name = 'db1';
/*
SIMPLE ACTIVE_TRANSACTION
*/
dbcc opentran(db1);
/*
Transaction information for database 'db1'.
Oldest active transaction:
SPID (server process ID): 57
UID (user ID) : -1
Name : user_transaction
LSN : (22:63:2)
Start time : Aug 19 2013 9:54:32:103PM
*/
checkpoint;
go
Select [Current LSN],[Operation],
[Num Transactions]
from fn_dblog(null,null)
where Operation in ('LOP_XACT_CKPT','LOP_XACT_CKPT','LOP_END_CKPT')
go
/*
Current LSN Operation Num Transactions
00000022:000001af:0001 LOP_XACT_CKPT 1
00000022:000001af:0002 LOP_END_CKPT NULL
00000022:000001b1:0001 LOP_XACT_CKPT 1
00000022:000001b1:0002 LOP_END_CKPT NULL
*/
-- Though i committed the Explicit open txn, why is it still Active and not allowing VLF's to clear.
Can anyone pl let me know what is that I am missing here?
Thanks in advance.