Sql-Server-2016
從每天發生的表中恢復已刪除的數據
我不確定這是否是可能的恢復數據方案。設想:
我有一張表,每天插入幾條數據進入表中。所以沒有具體的時間刪除發生。我們在一周後(昨天)發現了這一點,我為該表添加了一個刪除觸發器並將數據儲存到另一個表中。
問題是如何恢復過去一周刪除的數據。我有每隔一小時進行一次的事務日誌備份。在不知道數據被刪除的具體時間的情況下,我該如何進行時間點恢復。任何恢復策略。?
這將是一個艱鉅的過程,但您也許可以使用
RESTORE WITH STANDBY
不同的實例。每條日誌恢復後,就可以讀取數據庫中的數據了。不能保證您正在查找的行沒有在同一個事務日誌備份中添加和刪除。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