MSSQL資料庫映象在Oracle中的實現方法
資料庫映象是將資料庫事務處理從一個資料庫移動到不同環境中的另一個資料庫中。映象的拷貝是一個備用的拷貝,不能直接訪問,它只用在錯誤恢復的情況下。Oracle資料庫與MSSQL資料操作上有很大的不同,但是,在映象操作方面有類比的地方。這篇文章關於MSSQL資料庫映象在Oracle資料庫中是如何實現的,它們之間存在哪些差異呢。
首先,微軟SQL資料庫中的映象資料庫類似於Oracle資料庫中的備用資料庫。我說的只是類似,確切的說,我們需要考慮不同資料庫在自己體系中的差異。MSSQL作為一個例項來操作,一個例項包含幾個資料庫,你首先要登入一個例項,然後選擇哪個資料庫作用於該例項。而在Oracle資料庫中,簡單模式(忽略RAC)就只有一個資料庫與一個例項相聯絡。因此,可以這麼說,在Oracle資料庫中,備份資料庫(standby database)就完全是主資料庫的快照。而在MSSQL中,映象資料庫僅僅是選擇的那個資料庫的備份,但沒有包括代理,登入,任務(這些或者更多的資料庫專案需要單獨在資料庫映象上建立或者複製)這些外部資料項。
在伺服器數量上,Oracle的主資料庫和備用資料庫配置最小需要2臺。在MSSQL中,最小資料是2個或3個,根據你所選擇的高可用性、高安全性、高效能方式所決定。
高可用性方式:這個操作模式選項允許你在兩臺伺服器上同步事務寫入,並支援自動錯誤恢復。要使用這個選項,你必須還要使用一個證人伺服器。
高保護方式:這個選項可以讓你在兩臺伺服器上同步事物寫入,但是錯誤恢復是手工的。因為自動的錯誤恢復不是這個選項的一部分,所以也不會用到證人伺服器。
高效能方式:這個選項不關心兩臺伺服器上的寫入是否是同步的,因此在效能上有所提高。當使用這個選項的時候,你只能假設映象伺服器上的所有事情都是成功完成。這個選項只允許手工的錯誤恢復,因此不會用到證人伺服器。
為了保證故障自動恢復,就需要有第三臺伺服器,可以稱之為目擊者(另外兩個就是主資料庫和映象資料庫),你可以將這個目擊者當作群集中的一個成員。它實現了2比1投票的能力,當我的一個元件不可達,並因此需要進行錯誤恢復的時候。證人伺服器只有在你想實現自動錯誤恢復的時候才需要用到。
在Oracle資料的一個事務中,日誌緩衝器在廢資料寫入資料檔案(忽略write-ahead情況)前被重新整理或者寫入到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時,3種恢復模式的不同點。快速的比較有:MSSQL完整模式對應於Oracle中的歸檔模式;簡單模式對應於非歸檔模式;bulk模式與使用直接路徑插入,新增提示,或者與nologging模式操作類似。
根據以上三種模式(這三種模式很容易轉換,不需要關機或者重啟)的描述以及日誌緩衝器和歸檔redo日誌的討論中,很容易斷定在MSSQL中進行資料庫的映象需要將資料的回覆模式設定成完全模式(full model)。簡單模式(Simple model)或許也能行,但是這種模式下維持事務日誌中的小部分資料,在備份中,如果在日誌被刪節了,整個映象過程也就破環了,因為當你在將事務傳送到映象資料庫中的時候,如果日誌被刪節了,這個過程就不能完成。
說到資料庫被破壞該怎麼辦呢?這正是映象(或者說備份)的主要目的:當主資料庫斷開或者說遇到故障時候我們希望系統能回到映象前或者備份前的狀況去。這如何才能實現呢?我們能自動實現或者手動實現。想實現這些,需要一些已經完成的設定。在MSSQL中,自動故障恢復,回到原來狀態需要在HA模式,事務安全是full,資料傳輸是同步,有目擊伺服器的情況下。這種模式下執行還需要使用企業版的資料庫系統。高安全性和高效能在標準版的情況下也能實現。
MSSQL還有其它版本的選擇,但是這些並不如Oracle的反射“乾淨”,這些版本包括:Developer、Workgroup 和 SQL Express。舉個例子,目擊伺服器能夠是任何的版本,但是如果你想給映象伺服器做一個快照,那麼你就需要企業或者開發版的了。
在設定夥伴(partner,通常有主資料庫和映象資料庫組成)過程中,他們的恢復狀態開始起作用。通過使用相同的名字,映象在遠端/映象伺服器上建立(使用配置資料庫映象安全向導是最簡單的方法)起來,並且映象資料庫被設定成NORECOVERY,通常它是恢復(recovering)狀態的。在MSSQL中,恢復資料庫是沒有的,因此沒有進行上述的設定,是不能被其他使用者當作只讀資料庫來使用的。
為了避免這個中缺陷,你可以給映象做一個快照,使得該“影像”對使用者可見。正如我上述所提到的那樣,這需要你的資料庫版本是企業(或者開發)版。這就意味著使用者需要有快照資料庫的知識,知道如何進入儲存它,如何告訴應用程式使用哪個資料庫。慣例上來說,配置檔案使用的.net環境,你能建立一個主資料庫和一個故障回滾的輔資料庫。如果在Oracle中配置過備份資料庫,你就會覺得這很類似。
結論
這篇文章內容包括按照Oracle的方式,如何更好的理解在另一種主流的RDBMS上執行映象或者複製,試著學習和解釋你的RDBMS如何工作的,從另外一種模式來得到你的注意有助於你搞清楚你當前資料庫系統執行原理。舉個例子,我發現非常有實用價值的是Oracle歸檔模式和MSSQL三種恢復模式之間的關係。使用在MSSQL中的一些術語(夥伴,主資料庫,目擊,映象)有助於你構成和識別Oracle中執行資料庫映象的操作。
為了更好的評價資料庫映象是如何運作,如何實施的,你可以執行兩個單獨的MSSQL例項,作業系統是XP或者是2003都沒有關係。按照MSDN聯機叢書的步驟完成一遍。下載或者選用AdventureWorks資料庫(類似於Oracle的HR/SH資料庫等。這些都沒有預安裝的),將其映象到主機伺服器上。呈現在你面前的不僅僅是另外一個資料的所具有功能特性,你將還會看到MSSQL所具有的操作,得到自己的正確評價(我平時使用的是Oracle資料庫,測試用的是MSSQL,反過來說,你平時使用的是MSSQL,現在用Oracle來測試的話,也會有新的發現)。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-589276/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 解析MSSQL跨資料庫查詢的實現方法SQL資料庫
- 在Oracle中實現資料庫的複製Oracle資料庫
- 在Oracle中實現資料庫的複製(轉)Oracle資料庫
- 樹結構表遞迴查詢在ORACLE和MSSQL中的實現方法遞迴OracleSQL
- 樹結構表遞迴查詢在ORACLE和MSSQL中的實現方法 [續]遞迴OracleSQL
- Java用OCI驅連Oracle資料庫的實現方法JavaOracle資料庫
- 在j2ee中實現一般java物件資料庫的方法。Java物件資料庫
- RedHatLinux下實現MySQL資料庫映象(轉)RedhatLinuxMySql資料庫
- MSSQL資料庫超時的原因與解決方法SQL資料庫
- 在 Kubernetes 中執行 Oracle 資料庫的新方法Oracle資料庫
- Oracle資料庫安全策略與實現方法(轉)Oracle資料庫
- 在jboss下,有多個mssql資料庫,如何修改mssql-service.xmlSQL資料庫XML
- 【BUILD_ORACLE】在Oracle cloud資料庫“插拔”PDB的方法UIOracleCloud資料庫
- MSSQL·最佳實踐·RDSSDK實現資料庫遷移上阿里雲RDSSQLServerSQL資料庫阿里Server
- 在 Istio 中實現 Redis 叢集的資料分片、讀寫分離和流量映象Redis
- oracle 觸發器實現禁止在資料庫中建立dblink ---透過觸發器實現Oracle觸發器資料庫
- mssql sqlserver 使用sql指令碼 清空所有資料庫表資料的方法分享SQLServer指令碼資料庫
- Qt中通過ODBC連線MSSQL資料庫QTSQL資料庫
- 關於java中實現在oracle資料庫中實現對中文首字母進行排序的解決方案JavaOracle資料庫排序
- mssql資料庫異地進行異地備份的方法SQL資料庫
- 在ORACLE中移動資料庫檔案在(轉)Oracle資料庫
- clone oracle資料庫的方法Oracle資料庫
- 在ORACLE中移動資料庫檔案Oracle資料庫
- Redis中單機資料庫的實現Redis資料庫
- 臨時表在Oracle資料庫與SQL Server資料庫中的異同Oracle資料庫SQLServer
- SQL Server資料庫的簡單實現方法SQLServer資料庫
- Oracle中的sql%rowcount在瀚高資料庫中的相容方案OracleSQL資料庫
- 資料庫映象和資料庫快照資料庫
- 非常實用的Oracle資料庫資料恢復方法案例Oracle資料庫資料恢復
- 用Asp實現對ORACLE資料庫的操作Oracle資料庫
- Sqlserver在映象資料庫上建立快照指令碼SQLServer資料庫指令碼
- excel檔案中的資料匯入Oracle資料庫的幾種方法ExcelOracle資料庫
- 在ORACLE中移動資料庫檔案(轉)Oracle資料庫
- Oracle 估算資料庫大小的方法Oracle資料庫
- MSSQL 備份資料庫還原SQL資料庫
- MSSQL系列 (一):資料庫的相關操作SQL資料庫
- 解密MSSQL連結資料庫的密碼解密SQL資料庫密碼
- Java 的JDBC 資料庫連線池實現方法JavaJDBC資料庫