數據庫鏡像是將數據庫事務處理從一個數據庫移動到不同環境中的另一個數據庫中鏡像的拷貝是一個備用的拷貝不能直接訪問它只用在錯誤恢復的情況下Oracle數據庫與MSSQL數據操作上有很大的不同但是在鏡像操作方面有類比的地方這篇文章關於MSSQL數據庫鏡像在Oracle數據庫中是如何實現的它們之間存在哪些差異呢
首先微軟SQL數據庫中的鏡像數據庫類似於Oracle數據庫中的備用數據庫我說的只是類似確切的說我們需要考慮不同數據庫在自己體系中的差異MSSQL作為一個實例來操作一個實例包含幾個數據庫你首先要登錄一個實例然後選擇哪個數據庫作用於該實例而在Oracle數據庫中簡單模式(忽略RAC)就只有一個數據庫與一個實例相聯系因此可以這麼說在Oracle數據庫中備份數據庫(standby database)就完全是主數據庫的快照而在MSSQL中鏡像數據庫僅僅是選擇的那個數據庫的備份但沒有包括代理登錄任務(這些或者更多的數據庫項目需要單獨在數據庫鏡像上創建或者復制)這些外部數據項
在服務器數量上Oracle的主數據庫和備用數據庫配置最小需要台在MSSQL中最小數據是個或個根據你所選擇的高可用性高安全性高性能方式所決定
高可用性方式這個操作模式選項允許你在兩台服務器上同步事務寫入並支持自動錯誤恢復要使用這個選項你必須還要使用一個證人服務器
高保護方式這個選項可以讓你在兩台服務器上同步事物寫入但是錯誤恢復是手工的因為自動的錯誤恢復不是這個選項的一部分所以也不會用到證人服務器
高性能方式這個選項不關心兩台服務器上的寫入是否是同步的因此在性能上有所提高當使用這個選項的時候你只能假設鏡像服務器上的所有事情都是成功完成這個選項只允許手工的錯誤恢復因此不會用到證人服務器
為了保證故障自動恢復就需要有第三台服務器可以稱之為目擊者(另外兩個就是主數據庫和鏡像數據庫)你可以將這個目擊者當作群集中的一個成員它實現了比投票的能力當我的一個組件不可達並因此需要進行錯誤恢復的時候證人服務器只有在你想實現自動錯誤恢復的時候才需要用到
在Oracle數據的一個事務中日志緩沖器在廢數據寫入數據文件(忽略writeahead情況)前被刷新或者寫入到redo日志中這種刷新或者寫入到redo日志的行為是有必要的如像實例失敗(使用前滾和回滾恢復過程)這樣的事件發生時MSSQL也承認將日志緩沖器寫入到磁盤的重要性不過這裡稱之為硬化(hardening)首先將事務日志緩沖器的信息寫入到磁盤或者硬化接著將日志記錄塊發送到鏡像數據庫中鏡像數據庫接收到該日志記錄塊後將之存入到某個緩沖器中隨後依次硬化該日志記錄塊
當數據發生變化時MSSQL數據庫如何保持主數據庫和鏡像數據庫的一致性呢?
Oracle用戶非常熟悉SCN而MSSQL用戶通過使用mirroring_failover_lsn機制(粗略來講就是一個日志序列號)MSSQL與Oracle不同MSSQL將事務分離(兩個事務在兩個機器上)而不是一個分布式事務(在自身提交前需要遠程等待提交)
另外一個相似點但稍微有些畸變的反射就是redo日志和事務日志在Oracle中完成的redo日志將被發送到遠程的服務器中將完成的redo日志應用到備份數據中去在MSSQL中事務日志沒有被傳輸但是就像我以上提到的日志緩沖器數據發送到網絡上這就導致另外一個鏡像反射備份和恢復模式
在Oracle中當你處於歸檔模式或者非歸檔模式的時候這些操作是內定的如果歸檔redo日志被傳輸或者提交到一個遠程的服務器那麼主數據庫明顯就是在歸檔模式下那些文件就是這麼產生的運行在這種模式下允許有少量的數據丟失因為在發生故障(無論什麼樣的故障)前恢復能夠在任意一個點上執行在MSSQL中是類似的但是有三種狀態需要選擇
《SQL Server聯機叢書》像許多其它的在線資源一樣講述了在使用MSSQL時種恢復模式的不同點快速的比較有MSSQL完整模式對應於Oracle中的歸檔模式簡單模式對應於非歸檔模式bulk模式與使用直接路徑插入添加提示或者與nologging模式操作類似
根據以上三種模式(這三種模式很容易轉換不需要關機或者重啟)的描述以及日志緩沖器和歸檔redo日志的討論中很容易斷定在MSSQL中進行數據庫的鏡像需要將數據的回復模式設置成完全模式(full model)簡單模式(Simple model)或許也能行但是這種模式下維持事務日志中的小部分數據在備份中如果在日志被刪節了整個鏡像過程也就破環了因為當你在將事務發送到鏡像數據庫中的時候如果日志被刪節了這個過程就不能完成
說到數據庫被破壞該怎麼辦呢?
這正是鏡像(或者說備份)的主要目的當主數據庫斷開或者說遇到故障時候我們希望系統能回到鏡像前或者備份前的狀況去這如何才能實現呢?我們能自動實現或者手動實現想實現這些需要一些已經完成的設置在MSSQL中自動故障恢復回到原來狀態需要在HA模式事務安全是full數據傳輸是同步有目擊服務器的情況下這種模式下運行還需要使用企業版的數據庫系統高安全性和高性能在標准版的情況下也能實現
MSSQL還有其它版本的選擇但是這些並不如Oracle的反射干淨這些版本包括DeveloperWorkgroup 和 SQL Express舉個例子目擊服務器能夠是任何的版本但是如果你想給鏡像服務器做一個快照那麼你就需要企業或者開發版的了
在設置伙伴(partner通常有主數據庫和鏡像數據庫組成)過程中他們的恢復狀態開始起作用通過使用相同的名字鏡像在遠程/鏡像服務器上建立(使用配置數據庫鏡像安全向導是最簡單的方法)起來並且鏡像數據庫被設置成NORECOVERY通常它是恢復(recovering)狀態的在MSSQL中恢復數據庫是沒有的因此沒有進行上述的設置是不能被其他用戶當作只讀數據庫來使用的
為了避免這個中缺陷你可以給鏡像做一個快照使得該影像對用戶可見正如我上述所提到的那樣這需要你的數據庫版本是企業(或者開發)版這就意味著用戶需要有快照數據庫的知識知道如何進入存儲它如何告訴應用程序使用哪個數據庫慣例上來說配置文件使用的NET環境你能建立一個主數據庫和一個故障回滾的輔數據庫如果在Oracle中配置過備份數據庫你就會覺得這很類似
結論
這篇文章內容包括按照Oracle的方式如何更好的理解在另一種主流的RDBMS上執行鏡像或者復制試著學習和解釋你的RDBMS如何工作的從另外一種模式來得到你的注意有助於你搞清楚你當前數據庫系統運行原理舉個例子我發現非常有實用價值的是Oracle歸檔模式和MSSQL三種恢復模式之間的關系使用在MSSQL中的一些術語(伙伴主數據庫目擊鏡像)有助於你構成和識別Oracle中執行數據庫鏡像的操作
為了更好的評價數據庫鏡像是如何運作如何實施的你可以運行兩個單獨的MSSQL實例操作系統是XP或者是都沒有關系按照MSDN聯機叢書的步驟完成一遍下載或者選用AdventureWorks數據庫(類似於Oracle的HR/SH數據庫等這些都沒有預安裝的)將其鏡像到主機服務器上呈現在你面前的不僅僅是另外一個數據的所具有功能特性你將還會看到MSSQL所具有的操作得到自己的正確評價(我平時使用的是Oracle數據庫測試用的是MSSQL反過來說你平時使用的是MSSQL現在用Oracle來測試的話也會有新的發現)
From:http://tw.wingwit.com/Article/program/Oracle/201311/18083.html