This post provide some documentation for the fn_dblog() function.
Key Points:
* view transaction log of a database (if you want to view the transaction log of a log backup, use fn_dump_dblog function instead.)
* useful for:
> restore database to a certain point in time
> find out when an operation (page split, table delete, table truncate...).
* take 2 parameters, start time and end time.
* It's not recommended use this function to scan the transaction log of a production database because it can reduce performance due to increase disk I/O.
-- get fn_dblog() definition sp_helptext 'sys.fn_dblog'; --result create function sys.fn_dblog ( @start nvarchar (25) = NULL, @end nvarchar (25) = NULL ) returns table as return select * from OpenRowset (DBLog, @start, @end, NULL, 1, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL )
-- get table result definition. sp_help 'sys.fn_dblog';Result.
| Column_name | Type | Length | Prec | Scale | Nullable |
| Current LSN | nvarchar | 46 | no | ||
| Operation | nvarchar | 62 | no | ||
| Context | nvarchar | 62 | no | ||
| Transaction ID | nvarchar | 28 | no | ||
| LogBlockGeneration | bigint | 8 | 19 | 0 | no |
| Tag Bits | binary | 2 | no | ||
| Log Record Fixed Length | smallint | 2 | 5 | 0 | no |
| Log Record Length | smallint | 2 | 5 | 0 | no |
| Previous LSN | nvarchar | 46 | no | ||
| Flag Bits | binary | 2 | no | ||
| Log Reserve | int | 4 | 10 | 0 | no |
| AllocUnitId | bigint | 8 | 19 | 0 | yes |
| AllocUnitName | nvarchar | 774 | yes | ||
| Page ID | nvarchar | 28 | yes | ||
| Slot ID | int | 4 | 10 | 0 | yes |
| Previous Page LSN | nvarchar | 46 | yes | ||
| PartitionId | bigint | 8 | 19 | 0 | yes |
| RowFlags | smallint | 2 | 5 | 0 | yes |
| Num Elements | smallint | 2 | 5 | 0 | yes |
| Offset in Row | smallint | 2 | 5 | 0 | yes |
| Modify Size | smallint | 2 | 5 | 0 | yes |
| Checkpoint Begin | nvarchar | 48 | yes | ||
| CHKPT Begin DB Version | smallint | 2 | 5 | 0 | yes |
| Max XDESID | nvarchar | 28 | yes | ||
| Num Transactions | smallint | 2 | 5 | 0 | yes |
| Checkpoint End | nvarchar | 48 | yes | ||
| CHKPT End DB Version | smallint | 2 | 5 | 0 | yes |
| Minimum LSN | nvarchar | 46 | yes | ||
| Dirty Pages | int | 4 | 10 | 0 | yes |
| Oldest Replicated Begin LSN | nvarchar | 46 | yes | ||
| Next Replicated End LSN | nvarchar | 46 | yes | ||
| Last Distributed Backup End LSN | nvarchar | 46 | yes | ||
| Last Distributed End LSN | nvarchar | 46 | yes | ||
| Server UID | int | 4 | 10 | 0 | yes |
| SPID | int | 4 | 10 | 0 | yes |
| Beginlog Status | binary | 4 | yes | ||
| Xact Type | int | 4 | 10 | 0 | yes |
| Begin Time | nvarchar | 48 | yes | ||
| Transaction Name | nvarchar | 66 | yes | ||
| Transaction SID | varbinary | 85 | yes | ||
| Xact ID | bigint | 8 | 19 | 0 | yes |
| Xact Node ID | int | 4 | 10 | 0 | yes |
| Xact Node Local ID | int | 4 | 10 | 0 | yes |
| End Time | nvarchar | 48 | yes | ||
| Transaction Begin | nvarchar | 46 | yes | ||
| Replicated Records | int | 4 | 10 | 0 | yes |
| Oldest Active LSN | nvarchar | 46 | yes | ||
| Server Name | nvarchar | 258 | yes | ||
| Database Name | nvarchar | 258 | yes | ||
| Mark Name | nvarchar | 66 | yes | ||
| Master XDESID | nvarchar | 28 | yes | ||
| Master DBID | int | 4 | 10 | 0 | yes |
| Preplog Begin LSN | nvarchar | 46 | yes | ||
| Prepare Time | nvarchar | 48 | yes | ||
| Virtual Clock | bigint | 8 | 19 | 0 | yes |
| Previous Savepoint | nvarchar | 46 | yes | ||
| Savepoint Name | nvarchar | 66 | yes | ||
| Rowbits First Bit | smallint | 2 | 5 | 0 | yes |
| Rowbits Bit Count | smallint | 2 | 5 | 0 | yes |
| Rowbits Bit Value | binary | 1 | yes | ||
| Number of Locks | smallint | 2 | 5 | 0 | yes |
| Lock Information | nvarchar | 512 | yes | ||
| LSN before writes | nvarchar | 46 | yes | ||
| Pages Written | smallint | 2 | 5 | 0 | yes |
| Data Pages Delta | int | 4 | 10 | 0 | yes |
| Reserved Pages Delta | int | 4 | 10 | 0 | yes |
| Used Pages Delta | int | 4 | 10 | 0 | yes |
| Data Rows Delta | bigint | 8 | 19 | 0 | yes |
| Command Type | int | 4 | 10 | 0 | yes |
| Publication ID | int | 4 | 10 | 0 | yes |
| Article ID | int | 4 | 10 | 0 | yes |
| Partial Status | int | 4 | 10 | 0 | yes |
| Command | nvarchar | 52 | yes | ||
| Byte Offset | smallint | 2 | 5 | 0 | yes |
| New Value | binary | 1 | yes | ||
| Old Value | binary | 1 | yes | ||
| New Split Page | nvarchar | 28 | yes | ||
| Rows Deleted | smallint | 2 | 5 | 0 | yes |
| Bytes Freed | smallint | 2 | 5 | 0 | yes |
| CI Table Id | int | 4 | 10 | 0 | yes |
| CI Index Id | smallint | 2 | 5 | 0 | yes |
| NewAllocUnitId | bigint | 8 | 19 | 0 | yes |
| FileGroup ID | smallint | 2 | 5 | 0 | yes |
| Meta Status | binary | 4 | yes | ||
| File Status | binary | 4 | yes | ||
| File ID | smallint | 2 | 5 | 0 | yes |
| Physical Name | nvarchar | 522 | yes | ||
| Logical Name | nvarchar | 258 | yes | ||
| Format LSN | nvarchar | 46 | yes | ||
| RowsetId | bigint | 8 | 19 | 0 | yes |
| TextPtr | binary | 16 | yes | ||
| Column Offset | int | 4 | 10 | 0 | yes |
| Flags | int | 4 | 10 | 0 | yes |
| Text Size | bigint | 8 | 19 | 0 | yes |
| Offset | bigint | 8 | 19 | 0 | yes |
| Old Size | bigint | 8 | 19 | 0 | yes |
| New Size | bigint | 8 | 19 | 0 | yes |
| Description | nvarchar | 512 | no | ||
| Bulk allocated extent count | int | 4 | 10 | 0 | yes |
| Bulk RowsetId | bigint | 8 | 19 | 0 | yes |
| Bulk AllocUnitId | bigint | 8 | 19 | 0 | yes |
| Bulk allocation first IAM Page ID | nvarchar | 28 | yes | ||
| Bulk allocated extent ids | nvarchar | 1922 | yes | ||
| RowLog Contents 0 | varbinary | 8000 | yes | ||
| RowLog Contents 1 | varbinary | 8000 | yes | ||
| RowLog Contents 2 | varbinary | 8000 | yes | ||
| RowLog Contents 3 | varbinary | 8000 | yes | ||
| RowLog Contents 4 | varbinary | 8000 | yes | ||
| Compression Log Type | smallint | 2 | 5 | 0 | yes |
| Compression Info | varbinary | 8000 | yes | ||
| PageFormat PageType | smallint | 2 | 5 | 0 | yes |
| PageFormat PageFlags | smallint | 2 | 5 | 0 | yes |
| PageFormat PageLevel | smallint | 2 | 5 | 0 | yes |
| PageFormat PageStat | smallint | 2 | 5 | 0 | yes |
| PageFormat FormatOption | smallint | 2 | 5 | 0 | yes |
| Log Record | varbinary | 8000 | no |
As you can see there're many columns the fn_dblog() returns.
We won't likely need all of them.
--An example how to use sys.fn_dblog function SELECT [Current LSN], [Previous LSN], Operation, Context, [Transaction ID], [Transaction Name], [Transaction SID], [Transaction Begin], [Begin Time], [End Time], [Log Record], [Minimum LSN], [Checkpoint Begin], [Checkpoint End], Description, [Page ID], [Dirty Pages] AS dirty_page_number, [New Split Page], [Pages Written], [Used Pages Delta], [Lock Information], [Number of Locks] FROM sys.fn_dblog(NULL, NULL);
Paul Randal has a blog post about fn_dblog() and provide some detailed example. You can read it here.
Credits:
http://www.sqlskills.com/blogs/paul/using-fn_dblog-fn_dump_dblog-and-restoring-with-stopbeforemark-to-an-lsn/#comment-7872
http://sqlblog.com/blogs/kalen_delaney/archive/2011/03/08/what-gets-logged-for-index-rebuilds.aspx
http://stevestedman.com/tag/fn_dblog
No comments:
Post a Comment