天天看點

資料誤操作,教你使用ApexSQLLog工具從 SQLServer日志恢複資料!

前幾天同僚不小心誤操作,将SQLServer庫的一張表的一個狀态字段給刷成了一個統一狀态,由于是update執行是以原來的相關狀态無法确定。發生這種事情的時候我的小夥伴背後 一涼。

資料誤操作,教你使用ApexSQLLog工具從 SQLServer日志恢複資料!

由于是在開發試運作中的項目,還沒來得及進行備份處理,是以從備份恢複宣告失敗。就算有備份那麼恢複的也是備份時間節點的資料,意味着使用平台做的資料需要從備份時間重新做過,而且有可能有遺漏。

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

ApexSQLLog2014

提取碼: np4f

  • 首先建一個測試庫,和一張測試表。

    測試庫ApexSQLLogTest和測試用的表TestUser,然後我手動編輯了三條資料進去,儲存編輯的資料。

資料誤操作,教你使用ApexSQLLog工具從 SQLServer日志恢複資料!
  • 用ApexSQLLog打開測試庫日志

    選擇要連接配接的資料庫,也可以從最近的session中打開,打開篩選過的記錄可以儲存未session。

    然後選中要篩選的日志檔案,如果有備份資料庫檔案也會自動查找到并在這裡羅列出來,自己按情況選擇。

資料誤操作,教你使用ApexSQLLog工具從 SQLServer日志恢複資料!
資料誤操作,教你使用ApexSQLLog工具從 SQLServer日志恢複資料!
  • 條件篩選

    我們選擇日志檔案後就進入到篩選條件選擇,可以在篩選條件裡面自由組合。

    可以選擇時間段(Time range)、操作(operations)、表(tables)。

資料誤操作,教你使用ApexSQLLog工具從 SQLServer日志恢複資料!
資料誤操作,教你使用ApexSQLLog工具從 SQLServer日志恢複資料!

進階選項(advanced options)裡面還有使用者、字段條件等可以選擇。

資料誤操作,教你使用ApexSQLLog工具從 SQLServer日志恢複資料!
  • 檢視日志資料

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

資料誤操作,教你使用ApexSQLLog工具從 SQLServer日志恢複資料!

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

資料誤操作,教你使用ApexSQLLog工具從 SQLServer日志恢複資料!
資料誤操作,教你使用ApexSQLLog工具從 SQLServer日志恢複資料!
  • 恢複資料測試。

    我們使用update語句将Status狀态全都重置為3。

update TestUser set Status=3            

複制

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

資料誤操作,教你使用ApexSQLLog工具從 SQLServer日志恢複資料!

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

資料誤操作,教你使用ApexSQLLog工具從 SQLServer日志恢複資料!
--	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如下,會提示沒有主鍵。

資料誤操作,教你使用ApexSQLLog工具從 SQLServer日志恢複資料!

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