SQL SERVER – A Quick Script for Point in Time Recovery – Back Up and Restore

Blogging is like writing a big novel in parts. It has its own mood and it has its own colors. Someday I feel like writing philosophy and some day I like writing theory and some day just a script. Today is one of the day when I just feel like providing working script for user requested frequently. Here is one of the script which I refer whenever I faced situation about restoring the database at point in time. It walks through point in time recovery in three steps.

SQL SERVER - A Quick Script for Point in Time Recovery - Back Up and Restore

In this demo we will see three step operations:

  1. Set up script and backup database
  2. Restore the database in point in time
  3. Clean up database

Let us see each step with simple script:

1. Set up Script and backup database

------------------------------------------------
-- Creating environment
------------------------------------------------
-- Create Database
CREATE DATABASE SQLAuthority
GO
-- Make sure database is in full recovery
ALTER DATABASE SQLAuthority
SET RECOVERY FULL
GO
USE SQLAuthority
GO
-- Create Table
CREATE TABLE TestTable (ID INT)
GO
-- Taking full backup
BACKUP DATABASE [SQLAuthority]
TO DISK = N'D:\SQLAuthority.bak'
GO
INSERT INTO TestTable (ID)
VALUES (1)
GO
-- Selecting the data from TestTable
SELECT *
FROM TestTable
GO
INSERT INTO TestTable (ID)
VALUES (2)
GO
-- Taking log backup
BACKUP LOG [SQLAuthority] TO
DISK = N'D:\SQLAuthority1.trn'
GO
INSERT INTO TestTable (ID)
VALUES (3)
GO
INSERT INTO TestTable (ID)
VALUES (4)
GO
BACKUP LOG [SQLAuthority] TO
DISK = N'D:\SQLAuthority2.trn'
GO
-- Selecting the data from TestTable
SELECT *
FROM TestTable
GO
INSERT INTO TestTable (ID)
VALUES (5)
GO
-- Selecting the data from TestTable
SELECT *
FROM TestTable
GO
INSERT INTO TestTable (ID)
VALUES (6)
GO
-- Selecting the data from TestTable
SELECT *
FROM TestTable
GO
INSERT INTO TestTable (ID)
VALUES (7)
GO
-- Selecting the data from TestTable
SELECT *
FROM TestTable
GO
INSERT INTO TestTable (ID)
VALUES (8)
GO
-- Marking Time Stamp
SELECT GETDATE() BeforeTruncateTime;
-- Selecting the data from TestTable
SELECT *
FROM TestTable
GO
-- Quick Delay before Truncate
WAITFOR DELAY '00:00:01'
GO
TRUNCATE TABLE TestTable
GO
-- Quick Delay after Truncate
WAITFOR DELAY '00:00:01'
GO
-- Marking Time Stamp
SELECT GETDATE() AfterTruncateTime;
-- Selecting the data from TestTable
SELECT *
FROM TestTable
GO
INSERT INTO TestTable (ID)
VALUES (9)
GO
-- Taking log backup
BACKUP LOG [SQLAuthority] TO
DISK = N'D:\SQLAuthority3.trn'
GO
-- Marking Time Stamp
SELECT GETDATE() CurrentTime;
-- Selecting the data from TestTable
SELECT *
FROM TestTable
GO
USE MASTER
GO

2. Restore the database in point in time

-----------------------------------------------
-- Restoring Database
------------------------------------------------
USE [master]
GO
-- Taking tail log
BACKUP LOG [SQLAuthority] TO
DISK = N'D:\SQLAuthority5.trn'
WITH NORECOVERY
GO
-- Restore full backup
RESTORE DATABASE [SQLAuthority]
FROM DISK = N'D:\SQLAuthority.bak'
WITH
STANDBY = N'D:\SQLAuthority11.bak'
GO
-- Restore transaction backup
RESTORE LOG [SQLAuthority]
FROM DISK = N'D:\SQLAuthority1.trn'
WITH STANDBY = N'D:\SQLAuthority11.trn'
GO
-- Selecting the data from TestTable
SELECT *
FROM SQLAuthority.dbo.TestTable
GO
-- Restore transaction backup
RESTORE LOG [SQLAuthority]
FROM DISK = N'D:\SQLAuthority2.trn'
WITH STANDBY = N'D:\SQLAuthority21.trn'
GO
-- Selecting the data from TestTable
SELECT *
FROM SQLAuthority.dbo.TestTable
GO
-- Restore transaction backup
RESTORE LOG [SQLAuthority]
FROM DISK = N'D:\SQLAuthority3.trn'
WITH STOPAT = '2011-12-21 11:12:18.797', -- Insert Your Time
STANDBY = N'D:\SQLAuthority33.trn'
GO
-- Rolling database forward
RESTORE LOG [SQLAuthority]
WITH RECOVERY
GO
-- Selecting the data from TestTable
SELECT *
FROM SQLAuthority.dbo.TestTable
GO

3. Clean up database

------------------------------------------------
-- Clean up
------------------------------------------------
USE MASTER
GO
ALTER DATABASE [SQLAuthority]
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
DROP DATABASE [SQLAuthority]
GO

Few quick points to note: Database has to be either in full recovery or bulk recovery mode. While restoring the database it should be done either WITH NORECOVERY (Leave the database non-operational, and do not roll back the uncommitted transactions. Additional transaction logs can be restored) or WITH STANDBY (Leave the database in read-only mode. Undo uncommitted transactions, but save the undo actions in a standby file so that recovery effects can be reverted).

Watch a 60 second video on this subject

Lots of scripts today but if you are in need of Point in Time Recovery script, this script is for you. I am open for suggestion, enhancements etc. Let me know your comments.

Published by Pinal Dave on SQLAuthority. More of my work at pinaldave.com.


Discover more from SQL Authority with Pinal Dave

Subscribe to get the latest posts sent to your email.

SQL Backup and Restore, SQL Scripts
Previous Post
Watermarks for Incremental Extracts
Next Post
Counting Users, Roles and Orphans in Every Database

Related Posts

18 Comments. Leave new

  • Awesome Pinal. This is a great info. I have never done all these things through commands but have done it only through UI. Thank you so much for Your superb lessons SQL Guru…

    Reply
  • Is there any other way that we can roll back implicit transaction in SQL SERVER ? with out using log recovery ? Just like Undo !

    Reply
  • Thanks Sir,
    Really informative post for me as I learned some new things from this post about backup and restore.
    Please describe the restore statement of “D:SQLAuthority3.trn”. After executing this restore command, I got four rows in TestTable having IDs (1,2,3,4). which i don’t understand. because at the time of doing log backup in SQLAuthority3.trn file, TestTable has only one row having ID=9.

    Regards,
    Ashish Jain

    Reply
  • Hi Pinal,

    Thanks for for your valuable script,i reduced my time to backup and restore database.

    Thanks,
    Prasad.

    Reply
  • Hi Pinal,

    Do you best thing about your articles, its simply, easy to understand every setup and most import, it’s not a theory. It’s completely based on real life problems which we faced in our day by day work.

    Thanks a lots.

    Vinay Kumar

    Reply
  • Hello Pinal,

    Thank you so much for providing this information. I have learned several new topics from your blog.

    Thanks

    Reply
  • hi to all,

    i am happy for the really a basic useful tutorial. most of the time , i got errors and deletes the bak n log files so i got problem my database always in stanb by mode . how to recover database if i loss bak n log files.

    Reply
  • Hi pinal,

    i am very happy for the really help for me. your are sql master.this is very use full for me.

    thanks a lot .

    Reply
  • Hi Pinal
    U r a genius man. U r my god. I have improved a lot in database knowledge only because of you. I am a die hard fan of u Pinal.

    Reply
  • Dear Sir I want to know ,

    How to generate outomatically scripts …in sql server

    Reply
  • Really a useful script…

    Reply
  • One of my team-members may have messed up while performing a restore to the point in time i had asked him to. Now he is unavailable and i need to check if the database he restored he used the correct point in time. Is there anyway i can find this information from the SQL Server restore logs. I may end up restoring a multi TB database and cause a lot of disruption to users if this information cannot be determined. Any help will be greatly appreciated.

    Reply
  • Hi Pinal,

    Could you please let me know, Is it possible to find what was the STOPAT time used in Point in Time restore??

    Thank you Sir.

    Reply
  • Hi Pinal,

    What is that standby file name ?

    Thanks.

    Reply
  • Hi Pinal, Thanks for the nice post about point in time recovery. I would like to know if there is some way to verify the point in time restore? I can verify the restore from a specific file based on timestamp of backup start and stop from restorehistory.

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *

Fill out this field
Fill out this field
Please enter a valid email address.