Reading the transaction log in SQL Server

To see transactions for inserted rows

SELECT [Current LSN],
		Context, 
		[Transaction ID], 
		[Begin time]
		[Operation],
		[Transaction Name],
		[Transaction SID],
		[SPID],
		[Begin Time]
		[AllocUnitName],
		[Page ID],
		[Slot ID],
		[End Time],
		[Number of Locks],
		[Lock Information]
   FROM sys.fn_dblog(NULL, NULL)
  WHERE operation IN('LOP_INSERT_ROWS');
-- OR
WHERE Operation IN('LOP_INSERT_ROWS','LOP_MODIFY_ROW',<br>'LOP_DELETE_ROWS','LOP_BEGIN_XACT','LOP_COMMIT_XACT')
-- Or for a split page
WHERE [Transaction Name]='SplitPage'
-- To see transacctions for deleted rows
SELECT [begin time], 
       [rowlog contents 1], 
       [Transaction Name], 
       Operation
  FROM sys.fn_dblog(NULL, NULL)
  WHERE operation IN('LOP_DELETE_ROWS');
-- To read ncative transaction log backups   
SELECT [Current LSN], Context, [transaction name]
, Operation, [Transaction ID], Description
FROM fn_dump_dblog(NULL,NULL,N'DISK',1
,N' F:\Mybackups\InventoryDatabase_4589725r.trn', 
DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT
,DEFAULT,DEFAULT,DEFAULT,DEFAULT, 
DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT
,DEFAULT,DEFAULT,DEFAULT,DEFAULT,
DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT
,DEFAULT,DEFAULT,DEFAULT,DEFAULT,
DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT
,DEFAULT,DEFAULT,DEFAULT,DEFAULT,
DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT
,DEFAULT,DEFAULT,DEFAULT,DEFAULT,
DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT
,DEFAULT,DEFAULT,DEFAULT,DEFAULT,
DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT
,DEFAULT,DEFAULT,DEFAULT, 
DEFAULT);
--can recover the dropped object from SQL Server log 
Select Convert(varchar(Max),Substring([RowLog Contents 0]
,33
,LEN([RowLog Contents 0]))) as [Script]
from fn_dblog(NULL,NULL)
Where [Operation]='LOP_DELETE_ROWS' And [Context]='LCX_MARK_AS_GHOST'
And [AllocUnitName]='sys.sysobjvalues.clst'


Select Convert(varchar(Max),Substring([RowLog Contents 0],33,LEN([RowLog Contents 0]))) as [Script]
from fn_dblog(NULL,NULL)
Where [Operation]='LOP_DELETE_ROWS' And [Context]='LCX_MARK_AS_GHOST'
And [AllocUnitName]='sys.sysobjvalues.clst'
AND [TRANSACTION ID] IN (SELECT DISTINCT [TRANSACTION ID] FROM    sys.fn_dblog(NULL, NULL) 
WHERE Context IN ('LCX_NULL') 
AND Operation in ('LOP_BEGIN_XACT')  
And [Transaction Name]='DROPOBJ'
And  CONVERT(NVARCHAR(11),[Begin Time]) BETWEEN @Date_From AND @Date_To)
GO

--Restore log with LSN number
RESTORE LOG InventoryDatabase
	FROM DISK = N' F:\Mybackups\InventoryDatabase_4589725r.trn'
	WITH STOPBEFOREMARK = 'lsn:112000000001700001',
    NORECOVERY;
--returns the names of the databases with more than 100 VLFs.
SELECT [name], COUNT(l.database_id) AS 'vlf_count'
FROM sys.databases s
CROSS APPLY sys.dm_db_log_info(s.database_id) l
GROUP BY [name]
HAVING COUNT(l.database_id) > 100;	
	
Spread the love

Leave a Comment