不過,在我們進(jìn)行更加深入的討論之前,讓我先澄清有些讓人混淆的概念。每個(gè)編程人員都熟悉另一種日志記錄-應(yīng)用使用syslog或者log4j可能寫入到本地文件里的沒有結(jié)構(gòu)的錯(cuò)誤信息或者追蹤信息。為了區(qū)分開來,我們把這種情形的日志記錄稱為“應(yīng)用日志記錄”。應(yīng)用日志記錄是我在這兒所說的日志的一種低級的變種。最大的區(qū)別是:文本日志意味著主要用來方便人們閱讀,而我所說明的“日志”或者“數(shù)據(jù)日志”的建立是方便程序訪問。
(實(shí)際上,如果你對它進(jìn)行深入的思考,那么人們讀取某個(gè)機(jī)器上的日志這種理念有些不順應(yīng)時(shí)代潮流。當(dāng)涉及到許多服務(wù)和服務(wù)器的時(shí)候,這種方法很快就變成一個(gè)難于管理的方式,而且為了認(rèn)識多個(gè)機(jī)器的行為,日志的目標(biāo)很快就變成查詢和圖形化這些行為的輸入了-對多個(gè)機(jī)器的某些行為而言,文件里的英文形式的文本同這兒所描述的這種結(jié)構(gòu)化的日志相比幾乎就不適合了。)
數(shù)據(jù)庫日志
我不知道日志概念起源于何處-可能它就像二進(jìn)制搜索一樣:發(fā)明者認(rèn)為它太簡單而不能當(dāng)作一項(xiàng)發(fā)明。它早在IBM的系統(tǒng)R出現(xiàn)時(shí)候就出現(xiàn)了。數(shù)據(jù)庫里的用法是在崩潰的時(shí)候用它來同步各種數(shù)據(jù)結(jié)構(gòu)和索引。為了保證操作的原子性和持久性,在對數(shù)據(jù)庫維護(hù)的所有各種數(shù)據(jù)結(jié)構(gòu)做更改之前,數(shù)據(jù)庫把即將修改的信息謄寫到日志里。日志記錄了發(fā)生了什么,而且其中的每個(gè)表或者索引都是一些數(shù)據(jù)結(jié)構(gòu)或者索引的歷史映射。由于日志是即刻永久化的,可以把它當(dāng)作崩潰發(fā)生時(shí)用來恢復(fù)其他所有永久性結(jié)構(gòu)的可信賴數(shù)據(jù)源。
隨著時(shí)間的推移,日志的用途從實(shí)現(xiàn)ACID細(xì)節(jié)成長為數(shù)據(jù)庫間復(fù)制數(shù)據(jù)的一種方法。利用日志的結(jié)果就是發(fā)生在數(shù)據(jù)庫上的更改順序與遠(yuǎn)端復(fù)制數(shù)據(jù)庫上的更改順序需要保持完全同步。