與往常一樣,這不會太深入談到技術點。數據庫日志最好的學習是,讀Oracle 8/9的日志原理。
所有的系統都是程序員寫出來的,因此,所有的IT系統,都是源於生活。
我接觸最早的是Dbase II,那時是單文件版本,單用戶操作。到后來FoxPro 2 時結合NetWare386+DOS無盤站,就變成多用戶系統(可參考當時訂單處理系統,出入庫系統等,證券網點大廳也有應用),那時有兩個痛點:1,某個用戶電腦忽然斷電,數據寫入不完整,導致大家都不能用了;2、多個用戶對同一條記錄進行寫操作,或讀與寫不致,或ID增量重號。
現在的數據庫系統(Oracel、DB2、MS sql、Mysql等)都支持多用戶,所有的數據庫系統(包括Exchange),都是把數據先寫到日志中,等某個時機(比如:確認commit)后再寫到數據庫記錄中,日志是數據庫最重要的數據之一,理解日志是相當重要的。為什么要用日志呢?就是要解決Foxfro多用戶的痛點一啊。
日志一般分成Undo與Redo:Undo一般用於事務的取消與回滾,記錄的是數據被修改前的值,Redo一般用於恢復已確認但未寫入數據庫的數據,記錄的是數據修改后的值,例如:數據庫忽然斷電重啟,數據庫啟動時一般要做一致性檢查,會把已寫到Redo的數據但未寫入數據庫的數據重做一遍。
數據庫系統如何來確認哪些數據需要redo或undo呢?那就需要一個檢查點(checkpoint),在系統中一般有一個表或一個控制文件來記錄檢查點,日志是按順序一直寫下去的,檢查點設置后,只需要比對檢查點之后的數據就可以了。
源於生活就是這樣,讓我們想如何這個問題?估計也就是用這種日志方式,具體操作時加上一個檢查點。
日志明白了之后,有什么用呢?
備份,知道如何設置備份的粒度。
數據恢復,當出問題時,知道需要找到哪些文件可以恢復數據。例如,讓你恢復3個月前的一筆交易,只要日志備份的足夠長,還是有辦法的。
引申:
MS SQL 中日志設置分成三種,簡單、大容量、完成,有什么區別?
MS SQL用戶進行錯誤操作后,如何查日志?APEX SQL Log是一個好工具。