資料誤操作,刪庫跑路?教你使用ApexSQLLog工具從 SQLServer日誌恢復資料!

Spring2Sun發表於2020-06-10

前幾天同事不小心誤操作,將SQLServer庫的一張表的一個狀態欄位給刷成了一個統一狀態,由於是update執行所以原來的相關狀態無法確定。發生這種事情的時候我的小夥伴背後 一涼,估計心裡裡面想這怕是要刪庫跑路了。

由於是在開發試執行中的專案,還沒來得及進行備份處理,所以從備份恢復宣告失敗。就算有備份那麼恢復的也是備份時間節點的資料,意味著使用平臺做的資料需要從備份時間重新做過,而且有可能有遺漏。

小夥伴問我這咋辦,首先沒有備份,那麼只有從資料庫日誌查詢,然後看能不能通過日誌找回之前的資料,再還原到刷狀態之前的資料。然後就找到了ApexSQLLog工具,接下來我介紹下這款工具的使用和如何恢復資料。ApexSQLLog有幾個版本,我是用的是ApexSQLLog2014支援SqlServer更高的版本,資料庫使用的是SqlSerVer2014。

ApexSQLLog2014
提取碼: np4f

  • 首先建一個測試庫,和一張測試表。
    測試庫ApexSQLLogTest和測試用的表TestUser,然後我手動編輯了三條資料進去,儲存編輯的資料。

  • 用ApexSQLLog開啟測試庫日誌
    選擇要連線的資料庫,也可以從最近的session中開啟,開啟篩選過的記錄可以儲存未session。
    然後選中要篩選的日誌檔案,如果有備份資料庫檔案也會自動查詢到並在這裡羅列出來,自己按情況選擇。

  • 條件篩選
    我們選擇日誌檔案後就進入到篩選條件選擇,可以在篩選條件裡面自由組合。
    可以選擇時間段(Time range)、操作(operations)、表(tables)。


    高階選項(advanced options)裡面還有使用者、欄位條件等可以選擇。

  • 檢視日誌資料
    當我們組合完篩選條件後,就進入到日誌分析介面,可以看到我們之前手動插入的三條資料實際已經在日誌裡面了,分成了三條insert語句。在選中其中一條日誌的時候在下面可以看到執行的各欄位值的修改情況。

    可以點選 下面的Row history檢視記錄,Redo script可以生成執行的操作, Undo script可以還原到之前的資料。我們恢復資料就是使用Undo script。

  • 恢復資料測試。
    我們使用update語句將Status狀態全都重置為3。

update TestUser set Status=3 

然後重新整理下日誌,會看到多出了三條Update日誌記錄,點選第一條看到下面的Status欄位從0變為了3。

我們選中這三條記錄右鍵或者上面的選單欄功能,用create undo script 生成恢復sql。

--	This UNDO script was generated with ApexSQL Log 2014.04.1133 on 2020-06-10 11:18:47.601
--	NOTE: Operations in UNDO scripts are always output in descending order.
--	SERVER VIP-966\SQLEXPRESS
--	DATABASE ApexSQLLogTest

--	UPDATE (00000024:000000A0:0004) done at 2020-06-10 11:09:36.293 by VIP-966\Administrator in transaction 0000:0000034B (Committed)
BEGIN TRANSACTION 
UPDATE [dbo].[TestUser] SET [Status] = 2 WHERE [Id] = 3
IF @@ROWCOUNT <= 1 COMMIT TRANSACTION ELSE BEGIN ROLLBACK TRANSACTION; PRINT 'ERROR: STATEMENT AFFECTED MORE THAN ONE ROW. ALL THE CHANGES WERE ROLLED BACK.' END
--	UPDATE (00000024:000000A0:0003) done at 2020-06-10 11:09:36.293 by VIP-966\Administrator in transaction 0000:0000034B (Committed)
BEGIN TRANSACTION 
UPDATE [dbo].[TestUser] SET [Status] = 1 WHERE [Id] = 2
IF @@ROWCOUNT <= 1 COMMIT TRANSACTION ELSE BEGIN ROLLBACK TRANSACTION; PRINT 'ERROR: STATEMENT AFFECTED MORE THAN ONE ROW. ALL THE CHANGES WERE ROLLED BACK.' END
--	UPDATE (00000024:000000A0:0002) done at 2020-06-10 11:09:36.293 by VIP-966\Administrator in transaction 0000:0000034B (Committed)
BEGIN TRANSACTION 
UPDATE [dbo].[TestUser] SET [Status] = 0 WHERE [Id] = 1
IF @@ROWCOUNT <= 1 COMMIT TRANSACTION ELSE BEGIN ROLLBACK TRANSACTION; PRINT 'ERROR: STATEMENT AFFECTED MORE THAN ONE ROW. ALL THE CHANGES WERE ROLLED BACK.' END
GO

--	FINISHED ON 2020-06-10 11:18:47.697
--	TOTAL OPERATIONS PROCESSED 3
--	END OF FILE

最後我們就可以使用這個指令碼去恢復資料了。

注意

我們在使用日誌恢復的時候如果表有主鍵會根據主鍵生成sql,如上圖sql中 where後面的條件。如果表沒有主鍵那麼生成的sql後面的where條件會帶上所有的欄位。在我幫小夥伴恢復資料的時候發現他的表沒有設定主鍵,而且欄位有20多個,3萬多條資料生成的sql都是100多M,還要拆分執行。
比如我把Id主鍵去了再更新下Status狀態到4,生成的sql如下,會提示沒有主鍵。

以上就是一次資料恢復的分享,如果下次你也遇到這種情況希望能幫到你,不妨來個推薦,讓更多人別再刪庫跑路。

相關文章