今天想查看一个LSN是否包含在日志备份,但是发现restore headeronly里面的LSN格式跟fn_dblog的不同,不过可以通过下面的方法转化。
CreateDatabaseTestLSN;
Go
-- Make sure it is simple recovery
AlterDatabaseTestLSNSetRecoveryfull;
Go
UseTestLSN;
Go
createtabletest(testvarchar(10))
-- Create a marked transaction
BEGINTRANTran1WithMARK'Tran 1';
insertintotestvalues ('10')
--Commit
Go
-- Find the LSN in the log
Select[Current LSN],[Previous LSN],Operation,Context,[Transaction Name]
Fromfn_dblog(null,null)
Where[Transaction Name]='Tran1';
这里我查到当前的LSN值为:00000021:00000120:0001
backupdatabasetestlsntodisk='d:\testlsn.bak'
backuplogtestlsntodisk='d:\teslsn.trn'
restoreheaderonlyfromdisk='d:\teslsn.trn'
获得的最小LSN为:33000000028800001
转换16进制的Current LSN:、
-- Convert LSN from hexadecimal string to decimal string
Declare@LSNvarchar(22),
@LSN1varchar(11),
@LSN2varchar(10),
@LSN3varchar(5),
@NewLSNvarchar(26)
-- LSN to be converted to decimal
Set@LSN='00000021:00000120:0001';
-- Split LSN into segments at colon
Set@LSN1=LEFT(@LSN, 8);
Set@LSN2=SUBSTRING(@LSN, 10, 8);
Set@LSN3=RIGHT(@LSN, 4);
-- Convert to binary style 1 -> int
Set@LSN1=CAST(CONVERT(VARBINARY,'0x'+
RIGHT(REPLICATE('0', 8)+@LSN1, 8), 1)Asint);
Set@LSN2=CAST(CONVERT(VARBINARY,'0x'+
RIGHT(REPLICATE('0', 8)+@LSN2, 8), 1)Asint);
Set@LSN3=CAST(CONVERT(VARBINARY,'0x'+
RIGHT(REPLICATE('0', 8)+@LSN3, 8), 1)Asint);
-- Add padded 0's to 2nd and 3rd string
SelectCAST(@LSN1asvarchar(8))+
CAST(RIGHT(REPLICATE('0', 10)+@LSN2, 10)asvarchar(10))+
CAST(RIGHT(REPLICATE('0', 5)+@LSN3, 5)asvarchar(5));
得到值为:33000000028800001
可以看到这两个LSN是一样的,所以可以确定LSN包含在当前日志备份文件。