建站學(xué)院(LieHuo.Net)數(shù)據(jù)庫(kù)綜合 Oracle和微軟都是數(shù)據(jù)庫(kù)方面的大廠商,采用兩家的產(chǎn)品的企業(yè)也不少。今天這篇文章為大家對(duì)比Oracle和SQLServer的鏡像。
標(biāo)簽:Oracle SQL Server 鏡像
數(shù)據(jù)庫(kù)鏡像是將數(shù)據(jù)庫(kù)事務(wù)處理從一個(gè)數(shù)據(jù)庫(kù)移動(dòng)到不同環(huán)境中的另一個(gè)數(shù)據(jù)庫(kù)中。鏡像的拷貝是一個(gè)備用的拷貝,不能直接訪問(wèn),它只用在錯(cuò)誤恢復(fù)的情況下。Oracle數(shù)據(jù)庫(kù)與MSSQL數(shù)據(jù)操作上有很大的不同,但是,在鏡像操作方面有類比的地方。這篇文章關(guān)于MSSQL數(shù)據(jù)庫(kù)鏡像在Oracle數(shù)據(jù)庫(kù)中是如何實(shí)現(xiàn)的,它們之間存在哪些差異呢。
首先,微軟SQL數(shù)據(jù)庫(kù)中的鏡像數(shù)據(jù)庫(kù)類似于Oracle數(shù)據(jù)庫(kù)中的備用數(shù)據(jù)庫(kù)。我說(shuō)的只是類似,確切的說(shuō),我們需要考慮不同數(shù)據(jù)庫(kù)在自己體系中的差異。MSSQL作為一個(gè)實(shí)例來(lái)操作,一個(gè)實(shí)例包含幾個(gè)數(shù)據(jù)庫(kù),你首先要登錄一個(gè)實(shí)例,然后選擇哪個(gè)數(shù)據(jù)庫(kù)作用于該實(shí)例。而在Oracle數(shù)據(jù)庫(kù)中,簡(jiǎn)單模式(忽略RAC)就只有一個(gè)數(shù)據(jù)庫(kù)與一個(gè)實(shí)例相聯(lián)系。因此,可以這么說(shuō),在Oracle數(shù)據(jù)庫(kù)中,備份數(shù)據(jù)庫(kù)(standby database)就完全是主數(shù)據(jù)庫(kù)的快照。而在MSSQL中,鏡像數(shù)據(jù)庫(kù)僅僅是選擇的那個(gè)數(shù)據(jù)庫(kù)的備份,但沒有包括代理,登錄,任務(wù)(這些或者更多的數(shù)據(jù)庫(kù)項(xiàng)目需要單獨(dú)在數(shù)據(jù)庫(kù)鏡像上創(chuàng)建或者復(fù)制)這些外部數(shù)據(jù)項(xiàng)。
在服務(wù)器數(shù)量上,Oracle的主數(shù)據(jù)庫(kù)和備用數(shù)據(jù)庫(kù)配置最小需要2臺(tái)。在MSSQL中,最小數(shù)據(jù)是2個(gè)或3個(gè),根據(jù)你所選擇的高可用性、高安全性、高性能方式所決定。
高可用性方式:這個(gè)操作模式選項(xiàng)允許你在兩臺(tái)服務(wù)器上同步事務(wù)寫入,并支持自動(dòng)錯(cuò)誤恢復(fù)。要使用這個(gè)選項(xiàng),你必須還要使用一個(gè)證人服務(wù)器。
高保護(hù)方式:這個(gè)選項(xiàng)可以讓你在兩臺(tái)服務(wù)器上同步事物寫入,但是錯(cuò)誤恢復(fù)是手工的。因?yàn)樽詣?dòng)的錯(cuò)誤恢復(fù)不是這個(gè)選項(xiàng)的一部分,所以也不會(huì)用到證人服務(wù)器。
高性能方式:這個(gè)選項(xiàng)不關(guān)心兩臺(tái)服務(wù)器上的寫入是否是同步的,因此在性能上有所提高。當(dāng)使用這個(gè)選項(xiàng)的時(shí)候,你只能假設(shè)鏡像服務(wù)器上的所有事情都是成功完成。這個(gè)選項(xiàng)只允許手工的錯(cuò)誤恢復(fù),因此不會(huì)用到證人服務(wù)器。
為了保證故障自動(dòng)恢復(fù),就需要有第三臺(tái)服務(wù)器,可以稱之為目擊者(另外兩個(gè)就是主數(shù)據(jù)庫(kù)和鏡像數(shù)據(jù)庫(kù)),你可以將這個(gè)目擊者當(dāng)作群集中的一個(gè)成員。它實(shí)現(xiàn)了2比1投票的能力,當(dāng)我的一個(gè)組件不可達(dá),并因此需要進(jìn)行錯(cuò)誤恢復(fù)的時(shí)候。證人服務(wù)器只有在你想實(shí)現(xiàn)自動(dòng)錯(cuò)誤恢復(fù)的時(shí)候才需要用到。
在Oracle數(shù)據(jù)的一個(gè)事務(wù)中,日志緩沖器在廢數(shù)據(jù)寫入數(shù)據(jù)文件(忽略write-ahead情況)前被刷新或者寫入到redo日志中。這種刷新或者寫入到redo日志的行為是有必要的,如像實(shí)例失敗(使用前滾和回滾恢復(fù)過(guò)程)這樣的事件發(fā)生時(shí)。MSSQL也承認(rèn)將日志緩沖器寫入到磁盤的重要性。不過(guò)這里稱之為硬化(hardening)。首先將事務(wù)日志緩沖器的信息寫入到磁盤或者硬化,接著將日志記錄塊發(fā)送到鏡像數(shù)據(jù)庫(kù)中。鏡像數(shù)據(jù)庫(kù)接收到該日志記錄塊后,將之存入到某個(gè)緩沖器中,隨后依次硬化該日志記錄塊。
當(dāng)數(shù)據(jù)發(fā)生變化時(shí),MSSQL數(shù)據(jù)庫(kù)如何保持主數(shù)據(jù)庫(kù)和鏡像數(shù)據(jù)庫(kù)的一致性呢?
Oracle用戶非常熟悉SCN,而MSSQL用戶通過(guò)使用mirroring_failover_lsn機(jī)制(粗略來(lái)講就是一個(gè)日志序列號(hào))。MSSQL與Oracle不同,MSSQL將事務(wù)分離(兩個(gè)事務(wù)在兩個(gè)機(jī)器上),而不是一個(gè)分布式事務(wù)(在自身提交前需要遠(yuǎn)程等待提交)。
另外一個(gè)相似點(diǎn),但稍微有些畸變的反射就是redo日志和事務(wù)日志。在Oracle中,完成的redo日志將被發(fā)送到遠(yuǎn)程的服務(wù)器中,將完成的redo日志應(yīng)用到備份數(shù)據(jù)中去。在MSSQL中,事務(wù)日志沒有被傳輸,但是就像我以上提到的,日志緩沖器數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)上。這就導(dǎo)致另外一個(gè)鏡像反射:備份和恢復(fù)模式。