數據誤操作,教你使用ApexSQLLog工具從 SQLServer日志恢復數據!


前幾天同事不小心誤操作,將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如下,會提示沒有主鍵。

以上就是一次數據恢復的分享,如果下次你也遇到這種情況希望能幫到你。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM