In Repair a
SQL Server database using a transaction log explorer, I showed how to use ApexSQL Log, a
SQL Server transaction log viewer, to recover a
SQL Server database after a disaster. In this blog, I’ll show you how to use another
SQL Server disaster recovery tool from ApexSQL in a situation when data is accidentally deleted. You can download ApexSQL Recover here, install,
and play along.
With a good
SQL Server disaster recovery strategy, data recovery is not a problem. You have a reliable full database backup with valid data, a full database backup
and subsequent differential database backups, or a full database backup
and a chain of transaction log backups. But not all situations are ideal. Here we’ll address some sub-optimal scenarios, where you can still successfully recover data.
If you have only a full database backup
This is
the least optimal
SQL Server disaster recovery strategy, as it doesn’t ensure minimal data loss.
For example, data was deleted on Wednesday. Your last full database backup was created on Sunday, three days before
the records were deleted. By using
the full database backup created on Sunday, you will be able to recover
SQL database records that existed in
the table on Sunday. If there were any records inserted into
the table on Monday or Tuesday, they will be lost forever.
The same goes for records modified in this period. This method will not bring back modified records, only
the old records that existed on Sunday.
If you restore this full database backup, all your changes (intentional
and accidental) will be lost
and the database will be reverted to
the state it had on Sunday. What you have to do is compare
the records that were in
the table on Sunday to
the records on Wednesday, create a synchronization script,
and execute it against
the Wednesday database.
If you have a full database backup followed by differential database backups
Let’s say
the situation is
the same as in
the example above, only you create a differential database backup every night.
Use
the full database backup created on Sunday,
and the last differential database backup (created on Tuesday). In this scenario, you will lose only
the data inserted
and updated after
the differential backup created on Tuesday.
If you have a full database backup
and a chain of transaction log backups
This is
the SQL Server disaster recovery strategy that provides minimal data loss. With a full chain of transaction logs, you can recover
the SQL database to an exact point in time.
To provide optimal results, you have to know exactly when
the records were deleted, because restoring to a later point will not bring back
the records.
This method requires restoring
the full database backup first. If you have any differential log backup created after
the last full database backup, restore
the most recent one. Then, restore transaction log backups, one by one, it
the order they were created starting with
the first created after
the restored differential database backup.
Now,
the table will be in
the state before
the records were deleted. You have to identify
the deleted records, script them
and run
the script against
the original database.
Although this method is reliable, it is time-consuming
and requires a lot of space on disk.
How to easily recover deleted records?
The following solution enables you to recover
SQL database records even if you have no full or differential database backups
and no transaction log backups.
To understand how ApexSQL Recover works, I’ll explain what happens when table data is deleted.
Table data is stored in data pages. When you delete table records, they are not immediately deleted from
the data pages, but marked to be overwritten by new records. Such records are not shown as existing anymore, but ApexSQL Recover can read them
and create undo script for them.
How long will deleted records stay in
the MDF file? It depends on many factors, as time passes it’s less likely that
the records will not be overwritten.
The more transactions occur after
the deletion,
the more chances
the records will be overwritten
and permanently lost.
Therefore, it’s recommended to create a copy of
the database MDF
and LDF files immediately (if you cannot take your database offline until
the issue is solved)
and run ApexSQL Recover on them. Note that a full database backup will not help here, as
the records marked for overwriting are not included in
the backup.
First, I’ll delete some records from
the Person.EmailAddress table in
the AdventureWorks database.
I can delete these records in
SQL Server Management Studio, or execute a script such as
DELETE FROM Person.EmailAddress
WHERE BusinessEntityID BETWEEN 70
AND 80
Then, I’ll start ApexSQL Recover
and select From DELETE operation in
the Recovery tab.
In
the Select
the database to recover step, first select
the SQL Server instance. If it’s not shown in
the drop-down list, click
the Server icon right to
the Server drop-down list
and browse for
the SQL Server instance, or type
the instance name manually.
Specify
the authentication type
and select
the database in
the Database drop-down list.
In
the next step, you’re prompted to add additional data sources. As this can be a tricky step, especially for new users, ApexSQL Recover offers help via
the Help me decide option.
The Help me decide option guides you through a series of questions about
the database transaction log
and advises what files to add.
If you know that you have no transaction log backups or detached transaction logs, or
the online transaction log file has been truncated after
the data was deleted, select No additional transaction logs are available.
If you know that you have transaction log backups that contain
the delete transactions you want to recover, click Add transaction logs.
The online transaction log is listed
and selected automatically.
Click Add if to add transaction log backups. It would be best if you have a full transaction log chain, as explained above.
The next step for this option is to specify
the time range.
Selecting a small time range for
the time of deletion will create
the recovery script just for
the accidentally deleted records. A wide time range might script
the records deleted on purpose,
and you don’t want that. If needed, you can check
the script generated
and manually remove such records.
After that, for all data sources options,
the next step is to select
the tables. Be careful here, if you deleted some data from other tables on purpose,
and don’t want to recover them, don’t select all tables, as ApexSQL Recover will create
the INSERT script for them too.
The next step offers two options: to create a recovery script that will insert
the deleted records back into
the Person.EmailAddress table, or to create a new database, create
the Person.EmailAddress table in it,
and insert
the deleted records. I’ll select
the first one.
The recovery process is completed
and 11 records are found
and scripted, as expected.
To see
the script, click View script. ApexSQL Recover has its own script editor, where you can review, modify,
and execute
the recovery script.
The insert into statements look like:
INSERT INTO Person.EmailAddress( BusinessEntityID,
EmailAddressID,
EmailAddress,
rowguid,
ModifiedDate)
VALUES( 70,
70,
N'
[email protected]' COLLATE SQL_Latin1_General_CP1_CI_AS,
'd62c5b4e-c91f-403f-b630-7b7e0fda70ce',
'20030109 00:00:00.000' );
To execute
the script, click Execute in
the menu.
If you want to check whether
the records are really back, execute
SELECT * FROM Person.EmailAddress
WHERE BusinessEntityID BETWEEN 70
AND 80
As shown, ApexSQL Recover recovers
SQL database data after accidental deletes even without
the database backup that contains
the deleted data
and relevant transaction log backups. ApexSQL Recover reads
the deleted data from
the database data file, so this method can be used even for databases in
the Simple recovery model.
Besides recovering
SQL database records from a DELETE statement, ApexSQL Recover can help when
the records are lost due to a DROP TABLE, or TRUNCATE statement, as well as repair a corrupted MDF file that cannot be attached to as
SQL Server instance.
You can find more information about how to recover
SQL database lost data
and repair a
SQL Server database on ApexSQL Solution center. There are solutions for various situations when data needs to be recovered.
Reference: Pinal Dave (http://blog.sqlauthority.com)Filed under: PostADay,
SQL,
SQL Authority,
SQL Backup
and Restore,
SQL Query,
SQL Server,
SQL Tips
and Tricks, T SQL