今天同事忘了下where條件
不小心誤更新了四千多筆的資料表
一時間協助查詢解決方法,畢竟不是dba
操作實務不足,也不敢馬上給指令
深怕把資料庫搞壞,連現行資料都弄不回來
事後,經過比較各個blog,MSDN,還有跟同事的討論後,實證驗正過以下做法可行,足以做為SOP
也同時花了點時間理解原理

發現原來我認知的誤區就是我以為資料庫靠transaction log就可以rollback回去過去時間點(減法)
但其實關鍵點反而是用加法在還原時間點加回來交易紀錄,見上圖所示,我寫在黑板記錄一下
看參考部落格時還想說為啥要先restore 資料..後來才想通
因此語法真的誤刪(人人似乎都有這個黑歷史)的話,別緊張,Follow以下SOP,應該可以救的回來,前提是資料庫是在完整模式下

範例資料:
USE [DBName]
GO
/****** Object: Table [dbo].[Test] Script Date: 2020/4/28 上午 08:54:31 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Test](
[a] [nvarchar](50) NULL,
[b] [nvarchar](50) NULL
) ON [PRIMARY]
GO
INSERT [dbo].[Test] ([a], [b]) VALUES (N'1', N'2')
GO
INSERT [dbo].[Test] ([a], [b]) VALUES (N'4', N'3')
GO
INSERT [dbo].[Test] ([a], [b]) VALUES (N'5', N'6')
GO
INSERT [dbo].[Test] ([a], [b]) VALUES (N'8', N'7')
GO
INSERT [dbo].[Test] ([a], [b]) VALUES (N'9', N'10')
GO
INSERT [dbo].[Test] ([a], [b]) VALUES (N'11', N'12')
GO
原本的資料

不小心誤刪了或漏下了where條件


這個時候,不要緊張,先找到上一次完整備份的時間點
以我的範例是8:55分

Step 0.網站停機或下線 (注意,千萬不能第一時間又做了一次完整備份)
避免寫入更多資料,複原時會遺失更多資料
Step1.切換單人模式並重新離線上線(確保資料庫是無人連線)
ALTER DATABASE DBName
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
Step 1.進行完整的交易記錄備份 (ex.9:00分當下)



這時,你的DB應該會是在還原模式下:

Step2.還原上一次的資料備份檔案(記得要比欲複原的時間點更早,ex:AM 08:55那一版本的Bak)

注意:還原計畫只能包含資料,不能勾選到剛剛的交易記錄

還原完整備份的bak時,復原狀態要選擇Restore With No Recovery
Step3.還原交易記錄,並指定還原時間點(ex:8:56分)


還原成功後,再進行將資料庫切回多人模式
ALTER DATABASE DBName
SET Multi_User
檢查資料,已經回復了,可喜可賀

想法有誤的話,歡迎大家回饋指教
參考blog:
https://kknews.cc/zh-tw/code/q4lj5x8.html
https://blog.miniasp.com/post/2010/04/21/SQL-Server-Full-Differential-Transaction-Backup