Quantcast
Channel: CodeSection,代码区,SQL Server(mssql)数据库 技术分享 - CodeSec
Viewing all articles
Browse latest Browse all 3160

SQL Server Restore to LSN

$
0
0

For this post I want to show you how I recovered to a LSN where I did do this on a server where I wanted to go back to a time just before a delete occurred.

This is my setup.

ALTER DATABASE [AdventureWorks2014] SET RECOVERY FULL GO BACKUP DATABASE [AdventureWorks2014] TO DISK = 'C:\SQLSERVER\backups\AdventureWorks2014.bak'WITH COMPRESSION BACKUP LOG [AdventureWorks2014] TO DISK = 'C:\SQLSERVER\backups\AdventureWorks2014LOG1.bak' -- DELETE occurred (BAD USER) DELETE FROM [Person].[Password] WHERE BusinessEntityID = 2 BACKUP LOG [AdventureWorks2014] TO DISK = 'C:\SQLSERVER\backups\AdventureWorks2014LOG2.bak'

Lets gain some insight into the transaction log.

SELECT * FROM fn_dblog (NULL, NULL)
SQL Server Restore to LSN

0000002e:00000348:0002 is The LSN where the transaction begins LOP_BEGIN_XACT for transaction ID 0000:000015dd

This will be my recovery point. This LSN will be the STOPBEFOREMARK clause in my RESTORE code.

RESTORE DATABASE [AdventureWorks2014DR] FROM DISK = 'C:\SQLSERVER\backups\AdventureWorks2014.BAK' WITH MOVE N'AdventureWorks2014_Data' TO N'C:\SQLSERVER\AdventureWorks2014_Data2.mdf', MOVE N'AdventureWorks2014_Log' TO N'C:\SQLSERVER\AdventureWorks2014_log2.ldf', NORECOVERY GO RESTORE LOG [AdventureWorks2014DR] FROM DISK = 'C:\SQLSERVER\backups\AdventureWorks2014LOG1.bak' WITH NORECOVERY; RESTORE LOG [AdventureWorks2014DR] FROM DISK = 'C:\SQLSERVER\backups\AdventureWorks2014LOG2.bak' WITH STOPBEFOREMARK = 'lsn:0x0000002e:00000348:0002', NORECOVERY; GO RESTORE DATABASE [AdventureWorks2014DR] WITH RECOVERY; GO SELECT * FROM [Person].[Password]

Yes I have my delete back.


SQL Server Restore to LSN

Let’s prove a point and go too far ahead. I will go past the commit; we wouldn’t expect it to be recovered right?

So let’s recover to LSN 0000002e:00000358:0001 (after the commit)

RESTORE DATABASE [AdventureWorks2014DR] FROM DISK = 'C:\SQLSERVER\backups\AdventureWorks2014.BAK' WITH MOVE N'AdventureWorks2014_Data' TO N'C:\SQLSERVER\AdventureWorks2014_Data2.mdf', MOVE N'AdventureWorks2014_Log' TO N'C:\SQLSERVER\AdventureWorks2014_log2.ldf', NORECOVERY GO RESTORE LOG [AdventureWorks2014DR] FROM DISK = 'C:\SQLSERVER\backups\AdventureWorks2014LOG1.bak' WITH NORECOVERY; RESTORE LOG [AdventureWorks2014DR] FROM DISK = 'C:\SQLSERVER\backups\AdventureWorks2014LOG2.bak' WITH STOPBEFOREMARK = 'lsn:0x0000002e:00000358:0001', NORECOVERY; GO RESTORE DATABASE [AdventureWorks2014DR] WITH RECOVERY; GO USE [AdventureWorks2014DR] go SELECT * FROM [Person].[Password]

Nope, it’s too far ahead.


SQL Server Restore to LSN

Who did it?

Quite simply look for the Transaction SID for your Current LSN of interest.

SELECT SUSER_SNAME(0x01050000000000051500000011C35F73E7CBDD7DA837D665F7620000) AS [WhoDidIt];

Viewing all articles
Browse latest Browse all 3160

Latest Images

Trending Articles