11月19日,21點,小編正六指霸屏,決賽圈1V4,忽然,電話響了,這種感覺很熟悉,不錯,上次差點推掉對面水晶的那一幕又上演了……作為一名美創的員工,客戶才是第一位,我毫不猶豫的摁下了接聽鍵。
XXX嗎?我資料庫有人篡改了某張表,我一聽,這個問題應該難度不大(自信ing!),趕緊回應客戶:
您資料庫有保留最近一次完整備份以及之後的完整日誌嗎?
1、有的話可以用完整備份恢復+日誌備份(誤操作前的LSN恢復)
2、也可以通過sys.fn_dblog()獲取二進位日誌,再解析出來誤操作的語句進行恢復
結果客戶的需求並不是該操作如何恢復,而是想確定這個篡改表的始作俑者,以及如何去記錄以後資料庫這種類似的情況。我很清楚的告訴客戶,再沒部署任何監控記錄的基礎上,解析日誌也只能獲取相關的數據記錄,無法獲取更過的信息(當然,不排除某種高端工具可能會獲取)。
至於以後如何防患,如何記錄,這個可以通過SQL server觸發器或者審計功能來實現,而本文,將著重介紹DML觸發器以及它如何實現客戶的需求,請看下文。
DML觸發器是一種特殊類型的存儲過程,它在指定的表中的數據發生變化時自動生效。喚醒調用觸發器以響應 INSERT、UPDATE 或 DELETE 語句。
可見,因為觸發器的緣故,不滿足要求的數據無法插入(這裡的age>=100雖有悖常理,實則祝大家都長命百歲,哈哈)
回到我們的主旨,這種觸發器雖然能起到防患的作用,但是依舊無法達到我們預期的效果,我們不僅要防患於未然,更要能事事追蹤溯源,話不多說,請看下文,也是我們這篇文章最最重要的乾貨!!!
實現原理:
DML操作記錄,簡單的說,就是日誌類觸發器,也就是儘量全面地反映資料庫表所進行的insert、update、delete操作,便於日後翻閱。
5、用hostname\administrator執行DML操作:
顯而易見,剛才的6次insert,2次update(一次update對應兩條記錄,因為分別記錄了name的更改前後的值—),以及2次delete,都清楚的記錄在該表內。
眼尖的網友可能要問,USERID和HOSTNAME很清楚,最後這兩列有什麼特殊的含義嗎?
我們的觸發器日誌表如果僅僅記錄一些基礎的信息,還遠遠不夠,我們還要將更改的數據挖掘出來,以便在需要的時候進行逆向DML。
那麼,我們是不是也可以修改日誌表,添加更多我們需要捕獲的信息呢,答案是肯定的,不過這個就交給廣大網友去探索、去更改了……
8、truncate 掉test表,再查看DML日誌表:
可以看到,依舊只有12條記錄,這是為什麼呢?明明test的表都被刪乾淨了啊???
莫慌莫慌,大家都知道,truncate和delete不同,它屬於DDL語句,所以,關於DDL的觸發器,且看下回分解,不要走開哦。
美創運維中心資料庫服務團隊擁有Oracle ACE 1人、OCM 10餘人、數十名Oracle OCP、MySQL OCP、紅帽RHCA、中間件weblogic、tuxedo認證、達夢工程師 ,著有《Oracle DBA實戰攻略》,《Oracle資料庫性能優化方法和最佳實踐》,《Oracle內核技術揭秘》等多本數據運維優化書籍。目前運維各類資料庫合計2000餘套,精通Oracle、MySQL、SQLServer、DB2、PostgreSQL、達夢等主流商業和開源資料庫。並成為首批國內達夢戰略合作夥伴之一,擁有海量經驗和完善的人員培養體系。並同時提供超融合,私有雲整體解決方案。