Sql-Server-2016

從每天發生的表中恢復已刪除的數據

  • August 1, 2018

我不確定這是否是可能的恢復數據方案。設想:

我有一張表,每天插入幾條數據進入表中。所以沒有具體的時間刪除發生。我們在一周後(昨天)發現了這一點,我為該表添加了一個刪除觸發器並將數據儲存到另一個表中。

問題是如何恢復過去一周刪除的數據。我有每隔一小時進行一次的事務日誌備份。在不知道數據被刪除的具體時間的情況下,我該如何進行時間點恢復。任何恢復策略。?

這將是一個艱鉅的過程,但您也許可以使用RESTORE WITH STANDBY不同的實例。每條日誌恢復後,就可以讀取數據庫中的數據了。不能保證您正在查找的行沒有在同一個事務日誌備份中添加和刪除。

RESTORE 語句

STANDBY =standby_file_name 指定一個允許恢復效果被撤銷的備用文件。STANDBY 選項允許離線恢復(包括部分恢復)。不允許該選項用於線上還原。嘗試為聯機還原操作指定 STANDBY 選項會導致還原操作失敗。當需要升級數據庫時,也不允許使用 STANDBY。

備用文件用於為在 RESTORE WITH STANDBY 的撤消過程中修改的頁面保留“寫入時複製”預映像。備用文件允許在事務日誌恢復之間啟動數據庫以進行只讀訪問,並且可以與熱備用伺服器情況或特殊恢復情況一起使用,在這些情況下,在日誌恢復之間檢查數據庫很有用。

附帶說明(參考您關於每小時事務日誌備份的聲明),這種情況是我喜歡每分鐘備份事務日誌的原因之一。對真的。對於我的關鍵數據庫。


下面是一個使用的例子WITH STANDBY

/* Create our test database.  You may need to change the file paths for your environment. */
CREATE DATABASE [StandbyTest] ON  PRIMARY 
( NAME = N'StandbyTest', FILENAME = N'C:\StandbyTest\StandbyTest.mdf' , SIZE = 3072KB , FILEGROWTH = 1024KB )

LOG ON 

( NAME = N'StandbyTest_log', FILENAME = N'C:\StandbyTest\StandbyTest_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%)
GO
ALTER DATABASE [StandbyTest] SET RECOVERY FULL 
GO
USE [StandbyTest]
GO

/* Create some dummy data */
CREATE TABLE dbo.Customers (CustomerID INT, CustomerName VARCHAR(50))
GO
INSERT INTO dbo.Customers (CustomerID, CustomerName)

VALUES (1, 'Bill Gates')

INSERT INTO dbo.Customers (CustomerID, CustomerName)

VALUES (2, 'Steve Ballmer')

GO

/* Do a full backup of the database */
BACKUP DATABASE [StandbyTest] TO  DISK = N'C:\StandbyTest\StandbyTest.bak' 
WITH FORMAT, INIT,  
NAME = N'StandbyTest-Full Database Backup', 
SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO

/* Add some more dummy data */
INSERT INTO dbo.Customers (CustomerID, CustomerName)

VALUES (3, 'Donald Farmer')


/* Do a transaction log backup */
BACKUP LOG [StandbyTest] TO  DISK = N'C:\StandbyTest\StandbyTest.trn' 
WITH FORMAT, INIT,  
NAME = N'StandbyTest-Transaction Log  Backup', 
SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO

/* Pretend we're a developer */
DROP TABLE dbo.Customers
GO

/* DISASTER!  We need to go back in time! */
USE master
GO
RESTORE DATABASE [StandbyTest] 

FROM  DISK = N'c:\StandbyTest\StandbyTest.bak' 
WITH  FILE = 1,
REPLACE,
STANDBY = N'C:\StandbyTest\ROLLBACK_UNDO_StandbyTest.BAK'

GO

/* Test to see if we can read records */
SELECT * FROM StandbyTest.dbo.Customers
/* Notice that we only got 2 customers, because we haven't restored the t-log yet. */

RESTORE LOG [StandbyTest] 

FROM  DISK = N'C:\StandbyTest\StandbyTest.trn' WITH  FILE = 1,  NOUNLOAD,  STATS = 10

GO

/* Test to see if we can read records */
SELECT * FROM StandbyTest.dbo.Customers

引用自:https://dba.stackexchange.com/questions/213215