• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            tbwshc

            tbw

              C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              95 Posts :: 8 Stories :: 3 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(4)

            我參與的團隊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            #

            Oracle的內核提供數據庫的備份和恢復機制,SQL*DBA按表空間進行數據的備份和恢復。Oracle提供兩種方式:備份恢復和向前滾動,保證意外故障恢復數據庫的一致性和完整性。
              
              ____1. 備份恢復方式
              
              ____對數據庫的某個一致狀態建立副本,并儲存在介質上脫機保存,以此作為數據庫恢復的基礎?,F以Oracle實用程序Export/Import來介紹備份恢復方式。
              
              ____Export/Import是Oracle提供的兩個互補性程序,即卸載和裝載。它們既完成數據庫與操作系統文件的互為轉載,同時可以有效地回收數據庫的碎片,提供不同版本間Oracle 數據傳送的手段,進行不同用戶間的數據傳送。
              
              ____Export數據卸載,將數據從Oracle寫到指定的操作系統文件進行備份。卸載的對象、內容與數量有三種模式:TABLE MODE(表模式)、USER MODE(用戶模式)、FULL DATABASEM ODE(所有數據庫模式)。使用方式既可用交互方式,也可采用命令行方式,以"關鍵字=值" 將所需信息在命令行中逐一描述來進行卸載。Export要求用戶具有CONNECT或DBA特權。
              
              ____Import與Export互逆,將操作系統文件重新裝載至Oracle數據庫中,使用方式如Expo rt。使用者要求具有CONNECT和RESOURCE特權,且可選擇部分或全部裝入。
              
              ____Export/Import非常方便,系統開銷小,它的限制是輸出的操作系統文件采用專門的壓縮方式存放,僅提供給Import使用。
              
              ____也可采用SQL*PLUS和SQL*LOADER實用工具進行備份。使用SQL*PLUS的SPOOL命令通過脫機定向輸出,使用PLUS格式化結果,形成指定格式的ASCII文件,需要時可用SQL*LOADER 進行加載。它的方便之處是ASCII文件可以編輯,可方便地加載至其他數據庫(如FoxPro、 Sybase中)。
              
              ____2. 向前滾動方式
              
              ____Oracle提供向前滾動方式,使建立備份后成功的事務不會丟失?;謴偷幕A是數據庫的某個一致性狀態(即方式1完成的備份恢復),恢復的依據是存檔的重作記錄文件。啟動重作記錄文件方法如下:
              
              ____(1) 啟動Oracle;
              
              ____(2) 連接Oracle:CONNECT SYSTEM/PASSWORD;
              
              ____(3) 啟動ARCHIVE LOG。
              
              ____出現介質故障時,可用SQL*DBA的RECOVER命令,利用存檔的重作記錄文件恢復一個或多個表空間。RECOVER命令對DATABASE或TABLASPACE進行恢復。前者要求SQL*DBA START UP已被排斥方式裝載且未被打開;后者對無活躍回退段的表空間執行脫機,要求數據庫已裝載且被打開。
              
              ____由于向前滾動方式恢復的依據是存檔的重作記錄文件,因而系統開銷大,但恢復的是建立備份以后的成功事務,所以恢復的程度更高、更完備。
              
              
              Sybase數據庫的備份
              
              ____Sybase數據庫提供兩種恢復方式:自動恢復和非自動恢復。自動恢復是在軟故障下提供的一種恢復機制,非自動恢復是發生硬故障時通過已轉儲的介質裝載的一種手動恢復機制。
              
              ____1. 軟件故障恢復機制
              
              ____SQL Server重啟時啟動自動恢復進程,將故障前已提交的事務寫到數據庫設備上,未完成的事務則回滾。自動恢復進程先恢復系統數據庫,后恢復用戶數據庫。對每個數據執行自動恢復的依據是事務日志,即SYSLOGS表,它記載著用戶對數據庫的每一改變。
              
              ____恢復過程:掃描日志,對尚未結束的事務執行撤銷,對已提交的事務進行重寫。
              
              ____撤銷機制:反向掃描日志,對每一個撤銷事務的更新操作執行反操作。
              
              ____重寫機制:正向掃描日志,對已提交的事務但尚在數據庫緩沖區中的內容執行物理地寫到庫設備上。
              
              ____2. 硬故障恢復機制
              
              ____硬故障一般指介質故障,備份的基礎數據源來自數據庫的轉儲介質。因而,它的恢復取決于轉儲(dump)命令的使用情況。
              
              ____現以250MB磁帶為例來描述轉儲、裝載過程。
              
              ____(1) 配置備份服務器,啟動SQL SERVER和BACKUP SERVER。如:
              
              ____startserver -f run -sybase
              
              ____startserver -f run -syb -backup
              
              ____(2) 建立磁帶轉儲設備
              
              ____sp-addumpdevice "tape",mytape,"/
              
              ____dev/nrct0",6,skip
              
              ____250
              
              ____go
              
              ____其中:"/dev/nrct0"指非回卷磁帶設備名,"6"是設備控制號, tape在3~8之間,skip 通知服務器忽略已存在的ANSI磁帶標號,250是磁帶的大小,以M為單位。
              
              ____建立成功后,可以查詢maser.dbo.sysdevices表中有name="mytape"的記錄描述。
              
              ____(3) 轉儲數據庫
              
              ____即備份一個完整的數據庫,包括它的系統表,建立各種數據對象和事務日志。備份格式不同于操作系統文件,tar命令不可讀,它只能由SQL Server的裝載工具來識別和恢復。轉儲命令如下:
              
              ____dump database TRYDB to mytape with init
              
              ____go
              
              ____其中:TRYDB為庫名;with init為選項,重新初始化磁帶卷。
              
              ____(4) 裝載數據庫
              
              ____如果數據庫受到破壞而必須刪除,則要重新初始化庫設備,tb重建數據庫并裝載最近的數據庫備份及所有事務日志。
              
              ____裝載數據庫:
              
              ____load database TRYDB from mytape
              
              ____go
              
              ____以上僅限裝載用戶數據庫,不適用于master庫。另外,也可將數據庫備份成操作系統文件,執行操作系統備份命令將文件拷至磁帶上。恢復時先tar入磁帶上的文件,然后裝載 ,這種方式不須添加轉儲設備。
            posted @ 2012-07-28 12:40 tbwshc 閱讀(749) | 評論 (0)編輯 收藏

            1 概述
            1.1 數據庫面臨的安全挑戰
            數據庫是企業核心業務開展過程中最具有戰略性的資產,通常都保存著重要的商業伙伴和客戶信息,這些信息需要被保護起來,以防止競爭者和其他非法者獲取?;ヂ摼W的急速發展使得企業的數據庫信息價值及可訪問性得到了提升,同時,也致使數據庫信息資產面臨嚴峻的挑戰,概括起來主要表現在以下三個層面:
            管理層面:主要表現為人員的職責、流程有待完善,內部員工的日常操作有待規范,第三方維護人員的操作監控失效等等,致使安全事件發生時,無法追溯并定位真實的操作者。
            技術層面:現有的數據庫內部操作不明,無法通過外部的任何安全工具(比如:防火墻、IDS、IPS等)來阻止內部用戶的惡意操作、濫用資源和泄露企業機密信息等行為。
            審計層面:現有的依賴于數據庫日志文件的審計方法,存在諸多的弊端,比如:數據庫審計功能的開啟會影響數據庫本身的性能、數據庫日志文件本身存在被篡改的風險,難于體現審計信息的真實性。
            伴隨著數據庫信息價值以及可訪問性提升,使得數據庫面對來自內部和外部的安全風險大大增加,如違規越權操作、惡意入侵導致機密信息竊取泄漏,但事后卻無法有效追溯和審計。
            1.2 數據庫審計的客觀需求
            數據庫審計與風險控制的目的概括來說主要是三個方面:一是確保數據的完整性;二是讓管理者全面了解數據庫實際發生的情況;三是在可疑行為發生時可以自動啟動預先設置的告警流程,防范數據庫風險的發生。因此,如何采取一種可信賴的綜合途徑,確保數據庫活動記錄的100%捕獲是極為重要的,任何一種遺漏關鍵活動的行為,都會導致數據庫安全上的錯誤判斷,并且干擾數據庫在運行時的性能。只有充分理解企業對數據庫安全審計的客觀需求,才能夠給出行之有效的解決方案:
            捕捉數據訪問:不論在什么時間、以什么方式、只要數據被修改或查看了就需要自動對其進行追蹤;
            捕捉數據庫配置變化:當“數據庫表結構、控制數據訪問的權限和數據庫配置模式”等發生變化時,需要進行自動追蹤;
            自動防御:當探測到值得注意的情況時,需要自動啟動事先設置tb的告警策略,以便數據庫安全管理員及時采取有效應對措施,對于嚴重影響業務運行的高風險行為甚至可以立即阻斷;
            審計策略的靈活配置和管理:提供一種直截了當的方法來配置所有目標服務器的審計形式、具體說明關注的活動以及風險來臨時采取的動作;
            審計記錄的管理:將從多個層面追蹤到的信息自動整合到一個便于管理的,長期通用的數據存儲中,且這些數據需要獨立于被審計數據庫本身;
            靈活的報告生成:臨時和周期性地以各種格式輸出審計分析結果,用于顯示、打印和傳輸;
            1.3 現有的數據庫審計解決方案的不足
            傳統的審計方案,或多或少存在一些缺陷,主要表現在以下幾個方面:
            傳統網絡安全方案:依靠傳統的網絡防火墻及入侵保護系統(IPS),在網絡中檢查并實施數據庫訪問控制策略。但是網絡防火墻只能實現對IP地址、端口及協議的訪問控制,無法識別特定用戶的具體數據庫活動(比如:某個用戶使用數據庫客戶端刪除某張數據庫表);而IPS雖然可以依賴特征庫有限阻止數據庫軟件已知漏洞的攻擊,但他同樣無法判別具體的數據庫用戶活動,更談不上細粒度的審計。因此,無論是防火墻,還是IPS都不能解決數據庫特權濫用等問題。
            基于日志收集方案:需要數據庫軟件本身開啟審計功能,通過采集數據庫系統日志信息的方法形成審計報告,這樣的審計方案受限于數據庫的審計日志功能和訪問控制功能,在審計深度、審計響應的實時性方面都難以獲得很好的審計效果。同時,開啟數據庫審計功能,一方面會增加數據庫服務器的資源消耗,嚴重影響數據庫性能;另一方面審計信息的真實性、完整性也無法保證。
            其他諸如應用程序修改、數據源觸發器、統一認證系統授權等等方式,均只能記錄有限的信息,更加無法提供細料度的數據庫操作審計。
            1.4 本方案解決的數據庫安全問題
            為了解決企業數據庫安全領域的深層次、應用及業務邏輯層面的安全問題及審計需求,杭州安恒信息技術有限公司依靠其對入侵檢測技術的深入研究及安全服務團隊積累的數據庫安全知識,研制并成功推出了全球領先的、面向企業核心數據庫的、集“全方位的風險評估、多視角的訪問控制、深層次的審計報告”于一體的數據庫審計與風險控制設備,即明御數據庫審計與風險控制系統,為企業核心數據庫提供全方位安全防護。
            在企業業務支撐網絡中部署了明御數據庫審計與風險控制系統,可以實現企業核心數據庫的“系統運行可視化、日常操作可跟蹤、安全事件可鑒定”目標,解決企業數據庫所面臨的管理層面、技術層面、審計層面的三大風險,以滿足企業的不斷增長的業務需要。明御數據庫審計與風險控制系統對于企業數據庫的安全防護功能,概括起來體現在以下三個方面:
            首先:明御數據庫審計與風險控制系統采用“網絡抓包、本地操作審計”組合工作模式,結合安恒專用的硬件加速卡,確保數據庫訪問的100%完整記錄,為后續的日常操作跟蹤、安全事件鑒定奠定了基礎。
            其次:明御數據庫審計與風險控制系統通過專利級的雙引擎技術,一方面利用數據庫安全研究團隊多年積累的安全知識庫,防止無意的危險誤操作,阻止數據庫軟件漏洞引起的惡意攻擊;另一方面,依賴智能自學習過程中動態創建的安全模型與異常引擎相結合,有效控制越權操作、違規操作等異常操作行為。
            再者:明御數據庫審計與風險控制系統 依賴其獨特的數據庫安全策略庫,可以深入到應用層協議(如操作命令、數據庫對象、業務操作過程)實現細料度的安全審計,并根據事先設置的安全策略采取諸如產生告警記錄、發送告警郵件(或短信)、提升風險等級、加入黑名單、立即阻斷等響應。同時,明御數據庫審計與風險控制系統可以提供多視角的審計報告,即根據實時記錄的網絡訪問情況,提供多種安全審計報告,更清晰地了解系統的使用情況以及安全事件的發生情況,并可根據這些安全審計報告進一步修改和完善數據庫安全策略庫。
             
            2 方案總體結構
            2.1 主要功能
            如下圖所示,數據庫審計與風險控制系統主要的功能模塊包括“靜態審計、實時監控與風險控制、動態審計(全方位、細粒度)、審計報表、安全事件回放、審計對象管理、系統配置管理管理”幾個部分。
            2.1.1 數據庫靜態審計
            數據庫靜態審計的目的是代替繁瑣的手工檢查,預防安全事件的發生。數據庫審計與風險控制系統依托其權威性的數據庫安全規則庫,自動完成對幾百種不當的數據庫不安全配置、潛在弱點、數據庫用戶弱口令、數據庫軟件補丁、數據庫潛藏木馬等等靜態審計,通過靜態審計,可以為后續的動態防護與審計的安全策略設置提供有力的依據。
            2.1.2 實時監控與風險控制
            數據庫審計與風險控制系統可保護業界主流的數據庫系統,防止受到特權濫用、已知漏洞攻擊、人為失誤等等的侵害。當用戶與數據庫進行交互時,數據庫審計與風險控制系統會自動根據預設置的風險控制策略,結合對數據庫活動的實時監控信息,進行特征檢測及審計規則檢測,任何嘗試的攻擊或違反審計規則的操作都會被檢測到并實時阻斷或告警。
            2.1.3 數據庫動態審計
            數據庫審計與風險控制系統基于“數據捕獲→應用層數據分析→監控、審計和響應” 的模式提供各項安全功能,使得它的審計功能大大優于基于日志收集的審計系統,通過收集一系列極其豐富的審計數據,結合細粒度的審計規則、以滿足對敏感信息的特殊保護需求。
            數據庫動態審計可以徹底擺脫數據庫的黑匣子狀態,提供4W(who/when/where/what)審計數據。通過實時監測并智能地分析、還原各種數據庫操作,解析數據庫的登錄、注銷、插入、刪除、存儲過程的執行等操作,還原SQL操作語句;跟蹤數據庫訪問過程中的所有細節,包括用戶名、數據庫操作類型、所訪問的數據庫表名、字段名、操作執行結果、數據庫操作的內容取值等。
            全方位的數據庫活動審計:實時監控來自各個層面的所有數據庫活動。如:來自應用程序發起的數據庫操作請求、來自數據庫客戶端工具的操作請求、來自數據庫管理人員遠程登錄數據庫服務器產生的操作請求等。
            完整的雙向審計:除可實時監控數據庫的請求操作以外,還可以實時監控所有請求操作后數據庫的回應信息,如命令執行情況,錯誤信息等。
            潛在危險活動重要審計:提供對DDL類操作、DML類操作的重要審計功能,重要審計規則的審計要素可以包括:用戶、源IP地址、操作時間(任意天、一天中的時間、星期中的天數、月中的天數)、使用的SQL操作類型(Select/Delete/Drop/Insert/Update)。當某個數據庫活動匹配了事先定義的重要審計規則時,一條報警將被記錄以進行審計。
            重要審計規則設置:
            重要審計結果展示:
            敏感信息細粒度審計:對業務系統的重要信息,提供完全自定義的、精確到字段及記錄內容的細粒度審計功能。自定義的審計要素包括登錄用戶、源IP地址、數據庫對象(分為數據庫用戶、表、字段)、操作時間段(本日、本周、本月、最近三小時、最近十二小時、最近二十四小時、最近七天、最近三十天、任意時間段)、使用的SQL操作類型(select/delete/drop/insert/update/create/turncate)、記錄內容。
            根據操作類型及記錄內容進行細粒度審計:
            細粒度審計結果展示:
            遠程ftp操作審計與回放:對發生在數據庫服務器上的ftp命令進行實時監控、審計及回放。審計的要素包括:ftp用戶、ftp客戶端IP地址、命令執行時間段(本日、本周、本月、最近三小時、最近十二小時、最近二十四小時、tb最近七天、最近三十天、任意時間段)、執行的ftp命令(get/put/ls等等)。
             
            自定義ftp操作審計:
            ftp審計結果展示:
            ftp回放:
             
            遠程telnet操作審計與回放:對發生在數據庫服務器上的Telnet命令進行實時監控、審計及回放。審計的要素包括:telnet用戶、telnet客戶端IP地址、命令執行時間段(本日、本周、本月、最近三小時、最近十二小時、最近二十四小時、最近七天、最近三十天、任意時間段)、telnet登錄后執行的系統命令(login/pwd/root等等)。
            自定義telnet操作審計:
             
            telnet操作審計結果展示:
            會話分析與查看:單個離散的操作(Sql操作、ftp命令、telnet命令)還不足于了解用戶的真實意圖,一連串的操作所組成的一個完整會話展現,可以更加清晰地判斷用戶的意圖(違規的\粗心的\惡意的)。
            Telent操作審計會話查看:
             
            2.1.4 審計報表
            數據庫審計與風險控制系統內嵌了功能強大的報表模塊,除了按安全經驗、行業需求分類的預定義固定格式報表外,管理員還可以利用報表自定義功能生成定制化的報告。報告模塊同時支持Word、Excel、PowerPoint、Pdf格式的數據導出。系統缺省提供以下報表:
             
            數據庫攻擊源統計示意圖:
            數據庫操作審計示意:
            同時提供靈活的格式報表功能,可以方便的根據業務邏輯來動態格式化報表元素,提供強大的樣式定義,對于熟悉CSS的設計人員來說,可以設計出相當出色的報表樣式。
             
            2.1.5 安全事件回放
            允許安全管理員提取歷史數據,對過去某一時段的事件進行回放,真實展現當時的完整操作過程,便于分析和追溯系統安全問題。
            很多安全事件或者與之關聯的事件在發生一段時間后才引發相應的人工處理, 這個時候, 作為獨立審計的數據庫審計與風險控制系統就發揮特別的作用. 因為所有的FTP、telnet、客戶端連接等事件都保存后臺(包括相關的告警), 對相關的事件做定位查詢,縮小范圍,使得追溯變得容易;同時由于這是獨立監控審計模式, 使得相關的證據更具有公證性。
            Sql操作回放示意圖:
            telnet命令回放示意圖:
            2.1.6 綜合管理
            數據庫審計與風險控制系統提供WEB-base的管理頁面,數據庫安全管理員在不需要安裝任何客戶端軟件的情況下,基于標準的瀏覽器即可完成對數據庫審計與風險控制系統的相關配置管理,主要包括“審計對象管理、系統管理、用戶管理、功能配置、風險查詢”等。
            下圖為審計對象配置示意圖:
            下圖為系統配置示意圖:
            下圖為風險查詢示意圖: 
             
            2.2 審計流程
            明御數據庫審計與風險控制系統數據庫審計流程如下圖所示:
            2.2.1 審計數據采集
            明御數據庫審計與風險控制系統審計數據采集的方式包括:網絡抓包、本地操作審計,采集的內容主要包括:
            賬號登錄行為數據:采集對賬號登錄動作的審計。具體包括:
            賬號名稱、登錄成功或登錄失敗、用戶終端IP/ID、登錄時間等;
            對異常動作的審計記錄,應記錄越權企圖、用戶終端IP/ID、登錄時間等;
            賬號登錄后各種操作記錄,記錄各種操作的操作人員、操作時間、操作內容,具體包括:
            對數據庫的一般操作記錄;
            對關鍵數據的操作記錄;
            數據庫特殊命令的操作記錄
            明御數據庫審計與風險控制系統對審計數據的采集大多數情況下是通過網絡獲取,由于其采用了專用硬件加速接口卡,可以在千兆環境下線速捕獲,因此保證了明御數據庫審計與風險控制系統具備交換機一樣的高吞吐量和低延時、并且確保了審計信息的不會丟失。
            2.2.2 審計數據標準化
            審計數據來源自多種方式采集的數據,而這些數據定義的格式不盡相同。所以,審計數據的標準化就必須把這些不同格式的事件轉化成標準格式,然后寫入審計數據庫。在標準化的過程中,也需要對多種方式采集的數據進行排重處理。
            2.2.3 審計數據歸并
            對于標準化處理后的審計數據必須對某些數據進行歸并(會聚)。歸并規則,就是在什么情況下,滿足什么條件,對哪些字段進行歸并。事件歸并功能可以對海量的審計數據依據歸并條件進行歸并,達到簡化審計數據,提高審計數據準確率。
            審計數據歸并規則包含以下屬性:
            歸并字段:歸并處理的審計數據字段,所列字段內容相同的審計數據才進行歸并;
            歸并時間:歸并審計數據的時間窗口,指多長時間進行一次歸并;
            歸并數目:需要歸并事件的數量,指多少事件進行一次歸并;
            對被歸并審計數據的處理方式:被歸并的審計數據以何種方式進行處理;
            被歸并審計數據的處理方式:
            丟棄:直接將被歸并審計數據全部丟棄,不寫入數據庫;
            寫入數據庫:將被歸并審計數據全部寫入數據庫;
            通過預設歸并規則的模板,方便對海量審計數據的歸并,明御數據庫審計與風險控制系統提供以下預設模板:
            根據審計數據名稱進行歸并分析;
            根據審計數據的類型進行歸并分析;
            根據審計數據的原始時間進行歸并分析;
            根據受審計的設備類型進行歸并分析;
             
            2.2.4 安全事件關聯
            通過安全事件關聯功能,來深度挖掘安全隱患、判斷審計數據的嚴重程度,包括關聯分析的類型和關聯分析規則的內容。
            基于時序關聯規則:將賬號的登錄行為和賬號各種業務操作行為根據時序進行關聯。通過時序關聯,形成某一個賬號連續的登錄行為和操作行為,根據制定審計策略判斷其是否業務操作習慣;根據時序關聯判斷執行每個業務操作的賬號是否具有正常的登錄記錄等;
            基于賬號與重要操作行為的關聯:將對數據庫系統的重要業務操作時所使用的賬號信息進行關聯,用來判斷該賬號是否正常使用;判斷該賬號是否具有該項權限所對應的權限范圍,是否為合法用戶等等。
            基于賬號與權限關聯:將賬號應該對應的權限與實際系統中賦予的權限進行關聯,用來審計賬號的訪問權限是否合理;查詢資源的授權訪問者,權限的分配時間、分配者等是否和審批的一致。
            2.2.5 審計結果呈現
            審計數據的呈現與安全風險管理是密切相關的。明御數據庫審計與風險控制系統提供對審計數據進行實時監控和實時展現。在審計數據的展現或響應中,可以支持郵件、彈出窗口、syslog、SNMP Trap、手機信息、聲音報警等多種方式。
            2.2.6 靈活的報告展現
            明御數據庫審計與風險控制系統內嵌了功能強大的報表模塊,除了按安全經驗、行業需求分類的預定義固定格式報表外,管理員還可以利用報表自定義功能生成定制化的報告。報告模塊同時支持Word、Excel、PowerPoint、Pdf、Html、Postscript格式的數據導出。支持兩種報表生成模式,即預置固定格式的報表、用戶自定義報表:
            通過預置固定格式的報表:可快速查看安全告警、SOX審計、設備性能以及應用系統受攻擊情況。
            靈活的條件格式定義,可以方便的根據業務邏輯來動態格式化報表元素,同時提供強大的樣式定義,對于熟悉CSS的設計人員來說,可以設計出相當出色的報表樣式。
            全部查詢:
            指定用戶查詢:
             
            2.3 系統優勢
            2.3.1 零風險、多種方式部署
            明御數據庫審計與風險控制系統可靈活支持直連、旁路的模式部署到網絡中,因此,部署時不需要對現有的網絡體系結構(包括:路由器、防火墻、應用層負載均衡設備、應用服務器等)進行調整。同時,依靠“安恒”自主研發的雙引擎技術,檢測過程中無需對應用程序進行修改,實現應用層的零風險部署。
            2.3.2 不影響數據庫業務本身
            明御數據庫審計與風險控制系統主要是通過網絡抓包進行數據采集 ,因此并不影響數據庫保護對象本身的運行與性能,主要體現在以下幾個方面:
            不需要對數據庫軟件進行更改;
            不占用數據庫本身的資源,比如:CPU資源、內存資源、磁盤資源等;
            無需數據庫的管理權限;
            2.3.3 高可用性
            明御數據庫審計與風險控制系統全方位確保設備本身的高可用性,包括但不限于:
            物理保護:關鍵部件采用冗余配置(如:冗余電源、內置硬盤RAID等);
            掉電保護:設備掉電(如電源被不慎碰掉)時,網絡流量將會直接貫通;
            系統故障保護:內置監測模塊準實時地監測設備自身的健康狀況;
            不間斷的管理保護:在進行策略配置情況下,能保持網絡的連接和保護;
            不丟包:基于硬件加速的接口卡,在1G、2.5G、10G環境下實現100%數據包捕獲;

            冗余部署:在具備冗余體系結構的環境中,支持Active-Active或Active-Standby部署配置

            posted @ 2012-07-22 14:01 tbwshc| 編輯 收藏

            了解如何安裝、設置和配置 Oracle GoldenGate 以輕松實現 Oracle Database 10g 和 11g 之間數據的無縫復制。

            作者:Porus Homi Havewala

            2010 年 4 月發布

            Oracle GoldenGate 用于在各種企業系統間以亞秒級速度復制和集成事務數據,是同類最佳的、易于部署的產品。Oracle GoldenGate 可以靈活地在同類和異類系統(包括不同版本的 Oracle Database、不同的硬件平臺)tb之間以及 Oracle 數據庫和非 Oracle 數據庫(包括 Microsoft SQL Server、用于開放系統和 z/OS 的 IBM DB2、Sybase 等等)之間移動數據。

            本文演示如何安裝、設置和配置此產品以輕松實現 Oracle Database 10g 和 11g 之間數據的無縫復制,還介紹了此產品的加速能力。

            Oracle 于 2009 年收購了 GoldenGate,我們可以看到在全球各行業超過 4,000 個解決方案中實施了 Oracle GoldenGate。該軟件執行實時的、基于日志的更改數據捕獲 (CDC),能夠在異構數據庫間以極低的延遲和很小的空間移動大量事務數據。

            通常,您部署 GoldenGate 捕獲、數據泵和交付進程,并且可將這些進程部署在許多不同的操作系統和數據庫上。可根據目標數據庫的需要,復制所有數據或部分數據。當 Oracle GoldenGate 用于 Oracle 數據庫時,可以復制數據操作語言 (DML) 和數據定義語言 (DDL) 操作。(目前只能在同類(不能在異類的)Oracle 版本間復制 DDL 操作。)

            Oracle GoldenGate 官方支持 Oracle9i 第 2 版到 Oracle Database 11g 第 2 版,并且對所有這些版本提供 DML/DDL 支持。該產品可用于 Oracle Database 的企業版和標準版。

            如上所述,可以在所支持的同類或異類 Oracle Database 版本間移動數據,也可以在 Oracle 數據庫和非 Oracle 數據庫間移動數據。大多數情況下,可對數據進行篩選、映射和轉換。注意,如果啟用了 DDL 支持(換言之,如果使用 GoldenGate 進行同類 Oracle Database 版本之間的 DDL 復制),則不支持數據篩選、映射和轉換。

            Oracle GoldenGate 是以 DBA 為中心的,因此 DBA 很容易學會如何使用它。其實現時間也是最少的 — 一些站點只用一個月的時間就完全付諸實現。

            可獲得什么

            Oracle GoldenGate 產品系列包括:

            • Oracle GoldenGate
            • Management Pack for Oracle GoldenGate(也稱為 Oracle GoldenGate Director)
            • Oracle GoldenGate Veridata
            • Oracle GoldenGate Application Adapters
            • Oracle GoldenGate for Mainframe

            為使增值服務造??蛻簦琌racle GoldenGate 核心許可包括 Oracle Active Data Guard 的全權使用許可和 Oracle Database 中 XStream 的全權使用許可。XStream 是與 Oracle Streams 接口的 API。Oracle Active Data Guard 支持主動打開備用數據庫以提供報表服務,甚至在應用重做數據的同時也如此。這個特性非常棒,可將生產報表和查詢工作分流到備用數據庫上。

            一直以來,Oracle Streams 只用于在 Oracle 數據庫間復制數據。Oracle GoldenGate 還可以在非 Oracle 數據庫間復制數據,并且這種復制易于建立。

            我們應注意到,已發布的 Oracle — GoldenGate 發展方向聲明 中指出,“由于 Oracle GoldenGate 的戰略性,將繼續支持 Oracle Streams,但不會對其進行主動增強。而是對 Oracle Streams 中最好的內容行評估以確定是否將其并入 Oracle GoldenGate 中。”

            此演示的目的

            為了進行此次演示,您應在一臺 Microsoft Windows 服務器上有三個數據庫。這三個數據庫是 HRPRD1、HRPRD2 和 HRPRD3。其數據庫版本分別為 Oracle Database 11g、 Oracle Database 10g 和 Oracle Database 10g

            這三個數據庫的 SYS 和 SYSTEM 口令已設置為 hrpassword1,用于測試目的。稍后可更改此口令。

            此演示的目的是在 HRPRD2 和 HRPRD3 這兩個 Oracle 10g 數據庫的 HR.EMPLOYEES 表之間建立單向復制。對第一個數據庫中此表的 DML 更改應傳給第二個數據庫。然后,我們將對這一復制進行增強,可以將更改同時復制到 Oracle 11g 數據庫 HRPRD1 中。其結果是,對 HRPRD2 中該表的任何更新、插入和刪除不僅將會成功更新 HRPRD3,也會成功更新 HRPRD1。

            這種從 Oracle Database 10g 到 Oracle Database 10g 然后再到 Oracle Database 11g 的復制策略常用于升級情況,進行升級時,需要先復制數據,然后方可切換到升級后的數據庫版本。Oracle GoldenGate 提供了簡單的解決方案。

            注意,針對 Oracle 數據庫時,您 需要使用 Microsoft ODBC 數據源管理器為這些數據庫創建數據源名稱 (DSN)。Oracle GoldenGate 復制將使用監聽器直接連接到 Oracle 數據庫。

            需要下載的內容

            首先,對于 Windows 系統,需要從 Microsoft 下載中心下載 Microsoft Visual C ++ 2005 SP1 Redistributable Package,然后進行安裝。如果計算機上未安裝 Visual C++,這用于安裝運行本應用程序時所需的 Visual C++ 庫的運行時組件。

            接下來,需要從 Oracle 技術網 下載 Oracle GoldenGate 軟件。截至本文撰寫時,OTN 只支持 Windows 平臺 64 位版本:適用于 Windows 2000、XP 和 2003(64 位)上的 Oracle 10g 的 Oracle GoldenGate 10.4.0.x 版 (8 MB)。要下載 32 位 Windows 版本,您必須使用 Oracle E-Delivery 網站。(請注意,E-Delivery 下載有一個為期 30 天的試用產品許可,而非 OTN 開發人員許可。)登錄此網站后,搜索適用于 Microsoft Windows(32 位)平臺的“Oracle Fusion Middleware Product Pack”(因為 Oracle GoldenGate 被視作一個 Oracle 融合中間件產品,而非 Oracle Database 產品),然后單擊 Go 。

            此時會出現介質包列表。在此列表中,先選擇 Oracle GoldenGate on Oracle Media Pack for Microsoft Windows (32-bit) 。

            此介質包中包含:

            適用于 Windows 2000、XP 和 2003 上的 Oracle 10g 的 Oracle GoldenGate 10.4.0.x 版

            V18162-01

            大?。?.4 MB

            適用于 Windows 2000、XP 和 2003 上的 Oracle 11g 的 Oracle GoldenGate 10.4.0.x 版

            V18164-01

            大小:8.4 MB

            Oracle GoldenGate 文檔

            V18423-01

            大?。?0 MB

            下載這三個 zip 文件,因為您需要適用于 Oracle 10g 和 Oracle 11g 的 Oracle GoldenGate。
            然后,返回到 Oracle 融合中間件的介質包列表,從中tb選擇 Management Pack for Oracle GoldenGate (v2.0.0.2) Media Pack for Microsoft Windows
            該管理包介質包中包含:

            適用于 Windows 的 Oracle GoldenGate Director V2.0.0.x Server

            V18127-01

            大?。?28 MB

            適用于 Windows 的 Oracle GoldenGate Director V2.0.0.x Client

            V18128-01

            大?。?5 MB

            Oracle GoldenGate Director 文檔

            V18129-01

            大小:952 KB

            如果您想安裝管理包,下載所有這些文件。該管理包是一個安裝您 Windows 服務器上的獨立產品,。該產品原名為 Oracle GoldenGate Director,它包含一個多層的客戶端-服務器應用程序,使組織可以輕松監視和管理其 Oracle GoldenGate 部署。

            使用 Oracle GoldenGate Director 的 GUI 界面,可以集中設計和配置 Oracle GoldenGate,還可以管理和監視為了在公司各服務器間復制數據而建立的各種 Oracle GoldenGate 進程。

            介質包的主列表中還有其他一些介質包,如 Oracle GoldenGate Veridata Media Pack for Microsoft Windows。

            Oracle GoldenGate Veridata 軟件作為服務器進行安裝,在不同平臺上具有代理,它負責將一組數據與另一組數據進行對比以識別不同步的數據,對比時無需停機。此對比可全天候進行,可與大流量的復制同時進行。還可在不同平臺間進行數據對比。

            除了上述主要介質包外,列表中還顯示了其他 Oracle GoldenGate 包。這些軟件包適用于非 Oracle 數據庫,如 Sybase、SQL Server、IBM DB2、Teradata,還有 JMS 和平面文件,這反映了 Oracle GoldenGate 支持異構的性質。

            安裝步驟

            您下載的 Oracle GoldenGate 文檔 zip 文件 (V18423-01.zip) 中包含 Oracle GoldenGate Oracle Installation and Setup Guide Version 10.4 (gg_ora_inst_v104.pdf),其中描述了適用于 Linux、UNIX 和 Windows 上的 Oracle 數據庫的 Oracle GoldenGate 的安裝步驟。

            注意,還有其他一些安裝文檔,它們針對適用于 Sybase、SQL Server、DB2、MySQL、Teradata 等的 Oracle GoldenGate。

            首先,將 Oracle GoldenGate for Oracle 10g (V18162-01.zip) 解壓縮到一個新的 Oracle GoldenGate 軟件目錄中,目錄名中不含任何空格。例如,您可以使用 C:\OGG10G 作為 Oracle GoldenGate 目錄。此目錄中的軟件代碼將用于建立第一個和第二個 Oracle 10g 數據庫之間的復制。

            由于您的第三個數據庫是 Oracle Database 11g 版 ,您還需要解壓縮 Oracle GoldenGate for Oracle 11g (V18164-01.zip)。對于此版本的 Oracle GoldenGate,您需要使用一個單獨的目錄,C:\OGG11G。此目錄中的軟件代碼將用于控制到第三個 Oracle Database 11g 數據庫的復制。

            如果您有 Oracle9i 數據庫并且想從其復制數據或向其復制數據,需要另一個適用于 Oracle9i 的 Oracle GoldenGate 軟件。不過,您不能通過 Oracle 網站下載 Oracle GoldenGate 的 Oracle9i 版本。如果您需要此版本,可能需要通過 My Oracle Support 發出一個系統請求 (SR)。

            在命令提示符處輸入以下命令

            mkdir C:\OGG10G
            cd C:\OGG10G
            unzip c:\V18162-01.zip
            
            mkdir C:\OGG11G
            cd C:\OGG11G
            unzip C:\V18164-01.zip
            
            # start the 10g
             databases if not already started
            net start OracleServiceHRPRD2
            net start OracleServiceHRPRD3
            
            # start the 11g
             database if not already started
            net start OracleServiceHRPRD1
              

            設置環境變量

            現在,您可以打開兩個命令窗口(開始..運行..Cmd) ,針對 Oracle Database 10g 和 Oracle Database 11g 將相應的環境變量(如 ORACLE_HOME、ORACLE_SID、LD_LIBRARY_PATH 等)設置為相應的值。

            為了在兩個 Oracle 10g 數據庫間建立復制,將這些變量進行如下設置:

            set  ORACLE_HOME=C:\Oracle\product\10.2.0\db_1
            set ORACLE_SID=HRPRD2
            set  PATH=%ORACLE_HOME%\bin;%PATH%
            set  LD_LIBRARY_PATH=C:\OGG10G; %ORACLE_HOME%\LIB; 
            %ORACLE_HOME%\jdbc\lib
            set  CLASSPATH=;C:\Program 
            Files\Java\jre6\lib\ext\QTJava.zip;%ORACLE_HOME%\jdbc\lib
              

            ORACLE_SID 可設置為 HRPRD2 或 HRPRD3,兩者都是 Oracle 10g 數據庫。請注意 PATH、LD_LIBRARY_PATH 和 CLASSPATH 的值。

            另一種方法是用系統變量進行這些設置,為此您可以在 Windows XP Professional 中使用:我的電腦..屬性..高級..環境變量..系統變量。在這里添加新的系統變量并按如上所述更改路徑。

            在此例中,在一臺服務器上運行兩個數據庫版本的缺點是,每次啟動 Oracle GoldenGate for Oracle 10g 或 Oracle GoldenGate for Oracle 11g 的 Manager 服務時,都必須更改系統變量。您可能要添加與 Oracle Database 11g 有關的系統變量,然后啟動 Oracle GoldenGate for Oracle 11g Manager 服務。這之后,您可能要更改這些系統變量,使其適合于 Oracle Database 10g ,然后啟動 Oracle GoldenGate for Oracle 10g Manager 服務。由于這是一個測試系統,這么做可能沒有問題。但在生產環境下,您需要采取一種更自動化的方法(如采用腳本化的方法)在腳本中設置這些變量并啟動 Manager 服務。

            GGSCI 命令解釋程序

            在命令窗口或“我的電腦”級別設置環境變量之后,轉到 Oracle GoldenGate 的文件夾下,通過命令行(見圖 1)或 Windows 資源管理器運行 Oracle GoldenGate Command Interpreter for Oracle (GGSCI) 程序。


            圖 1 Oracle GoldenGate Command Interpreter

            現在,您可在 GGSCI 中執行 CREATE SUBDIRS 命令來創建 Oracle GoldenGate 的工作子目錄。參見圖 2,其中列出了所創建的重要目錄。


            圖 2 創建工作子目錄

            將 Oracle GoldenGate Manager 作為本地程序運行

            您可以將 Oracle GoldenGate Manager 當作一個本地程序在命令窗口中運行,也可以將它作為一個 Windows 服務安裝以便在 Windows 啟動時自動啟動。我們建議使用后面這種方法。

            如果您希望將其作為一個本地命令運行,只需調用目錄中的 Manager 執行文件(調用時帶著一個參數文件)即可。命令語法為:

            C:\OGG10G>mgr
            Usage:  MGR PARAMFILE <param file> [REPORTFILE <report file>]
                          [PID <process id>] [PORT  <port number>]
                          [USESUBDIRS] [NOUSESUBDIRS]
                          [PAUSEATEND] [NOPAUSEATEND]
                          [CD <directory>]

            PARAMFILE 是必需的參數。因此,您必須在 GGSCI 中創建一個參數文件:

            GGSCI (HaviPori) 1> edit params mgr

            此命令將在 C:\OGG10G\dirprm 目錄中創建一個新的 mgr.prm 文件。在該文件中鍵入將用于運行 manager 進程的端口號,然后保存該文件。

            PORT 7809

            默認端口號為 7809。無論您選擇哪個端口號,請確保該端口號未被任何其他程序所使用并且沒有任何防火墻限制。因為 PORT 是 Manager 唯一需要的參數,所以必須指定該參數。GGSCI 使用該端口將請求發送給 Manager 以啟動進程,并且 Extract 進程也使用該端口進行各種操作。

            創建該參數文件之后,就可以在 Windows 命令提示符下啟動 Manager 了,如下所示:

            C:\OGG10G>mgr paramfile c:\OGG10G\dirprm\mgr.prm

            該命令啟動 Manager,并且顯示圖 3 所示的消息:


            圖 3 在 Windows 命令提示符處啟動 Manager

            必須保持此窗口為打開狀態,以保持 Manager 運行。如果您注銷,該窗口將關閉,Manager 將停止運行。

            將 Manager 作為 Windows 服務進行安裝

            上文描述了手動啟動 Manager 的方法,還有一種啟動方法,那就是將 Manager 作為自動啟動的 Windows 服務來安裝。

            在 Windows 集群環境下必須使用后面這種方法,因為出現故障時只有服務可以自動切換到備用服務器上。在非集群系統中,將 Manager 作為服務來安裝是可選的方法但也是強烈建議的方法。

            在 Windows 中作為服務創建 Manager 進程時,該服務的默認名稱為 GGSMGR。您可以為此服務指定自定義的名稱。如果您在同一臺服務器上需要不止一個 Oracle GoldenGate Manager 服務,比如一個針對 Oracle GoldenGate for Oracle 10g 的服務和另一個針對 Oracle GoldenGate for Oracle 11g 的服務,則指定名稱是很重要的。如果您打算運行 Oracle GoldenGate Veridata,還需要一個 Manager 服務。

            用以下方法為 Manager 服務指定一個不同的名稱。在 GGSCI 命令提示符處執行以下命令:

            EDIT PARAMS ./GLOBALS

            在出現的記事本編輯器中,選擇新建一個文件(如果是首次這么做),然后輸入以下代碼并保存該 GLOBALS 文件:

            MGRSERVNAME OracleGGSMGR1

            根據 Windows 上的 Oracle 服務一般帶有 Oracle 前綴(如 OracleDBConsole<instancename>、OracleJobScheduler<instancename> 服務)的慣例,使用名稱 OracleGGSMGR1。

            通過 C:\OGG10G 目錄中的 Install 程序可輕松創建 Manager 服務。使用 install addservice 命令,如圖 4 所示:


            圖 4 創建 Manager 服務

            新服務在 Windows 服務列表中顯示為一個自動啟動的服務(見圖 5):


            圖 5 Manager 服務屬性

            Manager 服務以本地系統帳戶運行,也可配置為以特定帳戶(使用用戶名和口令選項)運行,該用戶名和口令可由 addservice 命令指定?,F在可通過以下命令啟動該服務:

            GGSCI (HaviPori) 1> start manager
            
            Starting Manager as service ('OracleGGSMGR1')...
            Service started.
              

            安裝 Windows 事件消息

            還可使用 Install 程序將事件消息安裝到 Windows 注冊表中,這樣它們可通過 Windows Event Manager 顯示。使用以下命令可完成此操作:

            C:\OGG10G>install addevents
            Oracle GoldenGate messages installed successfully.
            Install program terminated normally.
              

            還可將 category.dll 和 ggsmsg.dll 文件從 C:\OGG10G 目錄復制到 C:\WINDOWS\system32 目錄,從而生成具體的而不是一般性的錯誤。

            建立復制 — 在 HRPRD2 上建立 Extract 進程

            Oracle GoldenGate Manager 進程已啟動并運行。下一步要建立數據庫之間的復制。

            為此,您至少需要創建和配置一個 Extract 和 Replicat 組。在這些組中指定您想捕獲和復制的數據。

            Extract 進程捕獲發生的數據更改并將這些更改發送給目標服務器上的一個“線索”。在目標服務器上啟動 Replicat 進程,該進程負責進行實際的復制,它從線索中獲取數據更改,然后將這些更改應用到目標數據庫中。

            您還需要為 Oracle GoldenGate Replication 準備數據庫:在數據庫級打開追加日志 功能。為此,在以 SYSDBA 身份登錄到數據庫后使用以下命令:

            SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
            Database altered.
            
            SQL> alter system switch logfile;
            System altered

            現在可以添加 Extract 組了。

            GGSCI (HaviPori) 1> ADD EXTRACT emp_ext, TRANLOG, BEGIN NOW
            EXTRACT added.
              

            您在這里指定了 TRANLOG,這意味著事務(重做)日志成為數據源。BEGIN 后面可以是該日志中的一個時間戳以便從該時刻開始進行處理,也可以是 NOW 以便立即開始處理。TRANLOG 還可以帶有 EXTSEQNO 選項(某個 Oracle 重做日志的序列號,從該日志開始)和 EXTRBA 選項(該日志中的相對字節地址)。

            注意,Extract 組的名稱只能有八位字符。如果進行以下指定,則可獲得完全幫助。

            GGSCI (HaviPori) 1> help add extract

            接下來,我們要添加一個 RMTTRAIL 或 EXTTRAIL。前者用于遠程計算機,如果您在同一臺本地計算機上建立復制,則建議使用后者。我們將使用 EXTTRAIL,通過以下命令來創建它:

            GGSCI (HaviPori) 1> ADD EXTTRAIL C:\OGG10G\dirdat\et, EXTRACT emp_ext
            EXTTRAIL added.
              

            EXTTRAIL 被指定為服務器上的一個物理子目錄 — 最好在 dirdat 子目錄下,dirdat 是為 Oracle GoldenGate 復制而創建的工作目錄之一。

            指定的文件名只能是兩位字符,因為在創建實際文件時,會在這兩個指定的字符后追加一個數字后綴以產生實際文件名。例如,當 EXTRACT 進程啟動并且發生數據更改時,會創建一個 C:\OGG10G\dirdat\et000001 文件作為提取文件。

            RMTTRAIL 的命令語法與之相同,如果您要使用 RMTTRAIL,只需用 RMTTRAIL 代替 EXTTRAIL。主要差別體現在 extract 的參數文件中 — 下一步將創建此參數文件。使用 RMTTRAIL 時,該參數文件將有更多參數用于描述遠程主機和遠程管理器端口號。

            現在,我們來為 Extract 組 emp_ext 創建參數文件,如下所示:

            GGSCI (HaviPori) 1> EDIT PARAM emp_ext

            在此文件中,鍵入以下代碼行:

            EXTRACT emp_ext
            USERID system@localhost:1521/HRPRD2, PASSWORD hrpassword1
            EXTTRAIL C:\OGG10G\dirdat\et
            TABLE hr.employees;

            您指定了在這個 Extract 組中,對第一個 Oracle 10g 數據庫(即 HRPRD2)中的表 HR.EMPLOYEES 進行提取。

            如果您使用了 RMTTRAIL,則只需按下列行進行更改:

            RMTHOST <remote host>, MGRPORT <remote manager port number> 
            RMTTRAIL C:\<remote GoldennGate Directory>\dirdat\rt
              

            現在,可使用以下命令啟動 extract:

            GGSCI (HaviPori) 1> START EXTRACT EMP_EXT
            Sending START request to MANAGER ('OracleGGSMGR1') ...
            EXTRACT EMP_EXT starting
              

            該進程的狀態和有關信息如下所示:

            GGSCI (HaviPori) 2> STATUS EXTRACT EMP_EXT
            EXTRACT EMP_EXT: RUNNING
            
            GGSCI (HaviPori) 3> INFO EXTRACT EMP_EXT
            EXTRACT    EMP_EXT   Last Started 2009-12-08 13:04   Status RUNNING
            Checkpoint Lag       00:00:00 (updated 00:00:00 ago)
            Log Read Checkpoint  Oracle Redo Logs
                                 2009-12-08 13:05:58  Seqno 11, RBA 578560
              

            還可查看有關該進程的詳細信息:

            GGSCI (HaviPori) 4> INFO EXTRACT EMP_EXT detail
            EXTRACT    EMP_EXT   Last Started 2009-12-08 13:04   Status RUNNING
            Checkpoint Lag       00:00:00 (updated 00:00:00 ago)
            Log Read Checkpoint  Oracle Redo Logs
                                 2009-12-08 13:07:19  Seqno 11, RBA 596992
            
              Target Extract Trails:
              Remote Trail Name                                Seqno        RBA     Max MB
              C:\OGG10G\dirprm\et                                  0        923         10
              Extract Source                          Begin             End
              D:\ORADATA\HRPRD2\REDO01.LOG         2009-12-08 12:59  2009-12-08 13:07
              Not Available                           * Initialized *   2009-12-08 12:59
            
            Current directory     C:\OGG10G
            Report file                C:\OGG10G\dirrpt\EMP_EXT.rpt
            Parameter file         C:\OGG10G\dirprm\EMP_EXT.prm
            Checkpoint file        C:\OGG10G\dirchk\EMP_EXT.cpe
            Process file             C:\OGG10G\dirpcs\EMP_EXT.pce
            Error log                C:\OGG10G \ggserr.log
              

            診斷 Extract

            只要有錯誤,extract 進程就會顯示為 STOPPED 狀態。這種情況下需要進行錯誤分析。

            首先,查看報告文件 C:\OGG10G\dirrpt\EMP_EXT.rpt,上面的詳細信息中提到了該報告。

            然后,查看日志文件 ggserr.log 和 sqlnet.log 中是否有任何說明性的消息,這兩個文件位于 C:\OGG10G 主目錄中。

            ggserr.log 文件包含事件信息,例如:

            2009-12-02  14:53:26  GGS INFO        301   Oracle GoldenGate
            Manager for Oracle, mgr.prm:  Command received from GGSCI on host 10.10.10.10 (START EXTRACT  EMP_EXT ).
            2009-12-02  14:53:26  GGS INFO        302   Oracle GoldenGate Manager for Oracle, mgr.prm:  
            EXTRACT EMP_EXT starting.

            也可通過以下方法查看這些事件:

            GGSCI (HaviPori) 1> VIEW GGSEVT
            …
            ….
            2009-12-02 15:09:34  GGS INFO        302  Oracle GoldenGate Manager for Oracle,
            mgr.prm:  EXTRACT EMP_EXT starting.
            2009-12-02 15:13:26  GGS INFO        399  Oracle GoldenGate Command Interpreter
            for Oracle:  GGSCI command (HaviPoriH): EDIT PARAM emp_ext.
              

            sqlnet.log 可顯示錯誤,例如:

            TNS-12557: TNS:protocol adapter not loadable

            這個特定錯誤指明存在數據庫連接問題,您需要在監聽器級進行分析。確保 Path 環境變量在最開始處包含了 Oracle Home bin 子目錄。可能有其他的 TNS 錯誤,它們可能會指明其他解決方法。

            EMP_EXT.rpt 可顯示如下所示的錯誤:

            2009-12-08 13:01:27  GGS ERROR       182  OCI Error beginning
             session (status = 28009-ORA-28009: connection as SYS should be as SYSDBA or SYSOPER).
            2009-12-08 13:01:27  GGS ERROR       190  PROCESS ABENDING.
              

            這指明 Extract 進程正在嘗試以 sys 而不是 SYSDBA 身份登錄。只需在 Extract 的參數文件中將登錄參數改為“system”即可。

            在這里我們應注意,在 Extract 參數文件中 login 行的末尾指定 SYSDBA 是不起作用的,盡管這么做對于 GGSCI 中的 DBLOGIN 命令(在下文中可看到此命令)確實會起作用。

            ggserr.log 文件可顯示類似錯誤:

            2009-12-03 00:43:16  GGS INFO        399  Oracle GoldenGate 
            Command Interpreter for Oracle:  GGSCI command (HaviPoriH): start manager.
            2009-12-03 00:43:25  GGS ERROR       182  Oracle GoldenGate 
            Manager for Oracle, mgr.prm:  OCI Error during OCIServerAttach 
            (status = 12154-ORA-12154: TNS:could not resolve the connect identifier specified).
            2009-12-03 00:43:25  GGS ERROR       190  Oracle GoldenGate 
            Manager for Oracle, mgr.prm:  PROCESS ABENDING.
              

            這指明 Manager 的參數文件 mgr.prm 中所提供的登錄憑證可能存在問題。其結果是 Manager 沒有啟動。

            您還可能在 Extract 的報告文件中看到另一個錯誤。例如,EMP_EXT.rpt 可能會有此類錯誤:

            2009-12-07 16:40:08  GGS ERROR       190  No minimum supplemental
             logging is enabled. This may cause extract process to handle key 
            update incorrectly if key column is not in first row piece.
            2009-12-07 16:40:08  GGS ERROR       190  PROCESS ABENDING.
              

            問題的解決方法顯然是在數據庫級啟用追加日志功能。由于該功能已啟用,在本例中將不會看到此錯誤。

            在 HRPRD3 上建立 Replicat 進程

            現在轉到目標數據庫 HRPRD3,在本例中該數據庫位于同一服務器上。由于這也是一個 Oracle 10g 數據庫,您可以使用同一 Oracle GoldenGate for Oracle 10g 安裝軟件(在 C:\OGG10G 子目錄中)和同一 Manager 服務。如果這個數據庫位于另一臺服務器上,您需要在該服務器上安裝適用于該數據庫版本的相應 Oracle GoldenGate 軟件然后配置一個新的 Manager 服務。

            首先,使用 GGSCI 的 DBLOGIN 命令連接到該數據庫,這樣以后發出的其他命令將在此數據庫上運行。

            注意,DBLOGIN 正常運行,如下所示:

            GGSCI (HaviPori) 1> 
            DBLOGIN USERID system@localhost:1521/HRPRD3 PASSWORD hrpassword1
            Successfully logged into database.
              

            在 GGSCI help 中可以看到還有兩個參數:SOURCEDB 和 TARGETDB。這兩個參數只用于非 Oracle 數據庫。

            現在,需要為要復制的 employees 表添加一個檢查點表:

            GGSCI (HaviPori) 2> ADD CHECKPOINTTABLE HR.EMPLOYEES_CHKPT
            Successfully created checkpoint table HR.EMPLOYEES_CHKPT.
              

            此表中保存的檢查點指示 Replicat 進程的當前讀寫位置。這用于在進程需要重啟時或者在服務器出現任何故障或網絡停頓時防止數據丟失。如果沒有這一機制,將導致數據丟失。另一個好處是,通過使用檢查點,多個 Extract 或 Replicat 進程可通過相同的一組線索進行讀取。

            對于以批處理模式運行的 Extract 和 Replicat 進程,檢查點不是必需的,因為這樣的進程總是可以重啟。然而,在 Extract 和 Replicat 進程連續工作的情況下,檢查點是必需的。檢查點通常保存在 dirchk 子目錄的文件中,但是對于 Replicat,可以選擇在數據庫的檢查點表中保存檢查點。

            如果您在 GLOBALS 參數文件中指定檢查點表,則上面的命令可使用該文件中的規定。這種情況下,只需這樣來使用該命令:

            GGSCI (HaviPori) 3> ADD CHECKPOINTTABLE
            No checkpoint table specified, using GLOBALS specification (hr.employees_chkpt).
            Successfully created checkpoint table HR.EMPLOYEES_CHKPT.
              

            現在可以添加 Replicat 組了, 具體如下所示,其中指定的 EXTTRAIL 正是在第一個數據庫中建立 Extract 組時所使用的 EXTTRAIL。這樣,該 Replicat 組將以 Extract 組創建的線索為數據源,即使用相同的線索:

            GGSCI (HaviPori) 4> ADD REPLICAT emp_rep, EXTTRAIL C:\OGG10G\dirdat\et, CHECKPOINTTABLE hr.employees_chkpt, 
            REPLICAT added.
              

            編輯此 Replicat 組的參數文件,具體如下:

            GGSCI (HaviPori) 5> EDIT PARAM emp_rep

            在新文件中輸入以下內容:

            REPLICAT emp_rep
            USERID system@localhost:1521/HRPRD3, PASSWORD hrpassword1
            ASSUMETARGETDEFS
            MAP hr.employees, TARGET hr.employees;
              

            由于各表具有完全相同的 DDL 結構,您使用 ASSUMETARGETDEFS 參數。

            現在可以啟動 Replicat 組:

            GGSCI (HaviPori) 6> start REPLICAT emp_rep
            Sending START request to MANAGER ('GGSMGR') ...
            REPLICAT EMP_REP starting

            稍候片刻再查看其狀態,如果立即查看,其狀態可能顯示為“stopped”??吹綘顟B為 “running”后,查看詳細信息,執行 info all 命令顯示所有正在運行的進程:

            GGSCI (HaviPori) 7> status REPLICAT emp_rep
            REPLICAT EMP_REP: STOPPED
            
            GGSCI (HaviPori) 8> status REPLICAT emp_rep
            REPLICAT EMP_REP: RUNNING
            
            GGSCI (HaviPori) 11> info REPLICAT emp_rep detail
            REPLICAT   EMP_REP   Last Started 2009-12-08 13:35   Status RUNNING
            Checkpoint Lag       00:00:00 (updated 00:00:01 ago)
            Log Read Checkpoint  File C:\OGG10G\dirdat\et000001
                                 2009-12-08 13:33:24.000000  RBA 985
            
              Extract Source                          Begin             End
              C:\OGG10G\dirdat\et000001               2009-12-08 13:33  2009-12-08 13:33
              C:\OGG10G\dirdat\et000000               * Initialized *   2009-12-08 13:33
            
            Current directory    C:\OGG10G
            Report file          C:\OGG10G\dirrpt\EMP_REP.rpt
            Parameter file       C:\OGG10G\dirprm\EMP_REP.prm
            Checkpoint file      C:\OGG10G\dirchk\EMP_REP.cpr
            Checkpoint table     HR.EMPLOYEES_CHKPT
            Process file         C:\OGG10G\dirpcs\EMP_REP.pcr
            Error log            C:\OGG10G\ggserr.log
            
            GGSCI (HaviPori) 12> info all
            Program     Status      Group       Lag           Time Since Chkpt
            MANAGER     RUNNING
            EXTRACT     RUNNING     EMP_EXT     00:00:00      00:00:03
            REPLICAT    RUNNING     EMP_REP     00:00:00      00:00:06
              

            此時可對兩個 Oracle Database 10g 數據庫 HRPRD2 和 HRPRD3 之間的復制進行測試。但我們決定等到建立好到 Oracle 11g 數據庫 HRPRD1 的復制之后再進行測試。下面我們將建立該復制。

            在 HRPRD1 上建立 Replicat 進程

            您的 Oracle 11g 數據庫 HRPRD1 也在同一服務器上。由于它是一個 11g 數據庫版本,您需要使用本文開始時解壓縮到 C:\OGG11G 目錄中的 Oracle GoldenGate for Oracle 11g 軟件。

            對于 Oracle 11g 數據庫 home,按如下所示設置環境變量:

            set ORACLE_HOME=C:\app\havipori\product\11.1.0\db_1
            set ORACLE_SID=HRPRD1
            set PATH=%ORACLE_HOME%\bin;%PATH%
            set LD_LIBRARY_PATH=C:\OGG11G; %ORACLE_HOME%\LIB; %ORACLE_HOME%\jdbc\lib
            set CLASSPATH=;C:\Program Files\Java\jre6\lib\ext\QTJava.zip;%ORACLE_HOME%\jdbc\lib
              

            按照與 Oracle GoldenGate for Oracle 10g 安裝軟件類似的步驟進行操作,創建一個名為 OracleGGSMGR2 的 Manager 服務并啟動它。創建工作子目錄和 mgr.prm 文件。這些步驟如下所示:

            C:\OGG11G>ggsci 
            GGSCI (HaviPori) 1> EDIT PARAMS ./GLOBALS
              

            在該文件中鍵入 MGRSERVNAME OracleGGSMGR2,然后保存。

            C:\OGG11G>install addservice
            Service 'OracleGGSMGR2' created.
            Install program terminated normally.
            
            GGSCI (HaviPori) 1>create subdirs
            Creating subdirectories under current directory C:\OGG11G
            
            Parameter files                C:\OGG11G\dirprm: created
            Report files                   C:\OGG11G\dirrpt: created
            Checkpoint files               C:\OGG11G\dirchk: created
            Process status files           C:\OGG11G\dirpcs: created
            SQL script files               C:\OGG11G\dirsql: created
            Database definitions files     C:\OGG11G\dirdef: created
            Extract data files             C:\OGG11G\dirdat: created
            Temporary files                C:\OGG11G\dirtmp: created
            Veridata files                 C:\OGG11G\dirver: created
            Veridata Lock files            C:\OGG11G\dirver\lock: created
            Veridata Out-Of-Sync files     C:\OGG11G\dirver\oos: created
            Veridata Out-Of-Sync XML files C:\OGG11G\dirver\oosxml: created
            Veridata Parameter files       C:\OGG11G\dirver\params: created
            Veridata Report files          C:\OGG11G\dirver\report: created
            Veridata Status files          C:\OGG11G\dirver\status: created
            Veridata Trace files           C:\OGG11G\dirver\trace: created
            Stdout files                   C:\OGG11G\dirout: created
            
            GGSCI (HaviPori) 2>  EDIT PARAMS mgr
              

            在該文件中鍵入以下代碼行,然后保存該文件。注意,這里使用了不同的端口號并且 Manager 現在登錄到 HRPRD1 上。

            PORT 7810
            USERID system@localhost:1521/HRPRD1 PASSWORD hrpassword1
              

            現在可以啟動 Manager 了。下一步是使用 DBLOGIN 登錄到 Oracle 11g 數據庫,然后在此數據庫中創建檢查點表。

            GGSCI (HaviPori) 3> start manager
            Starting Manager as service ('OracleGGSMGR2')...
            Service started.
            
            GGSCI (HaviPori) 4> DBLOGIN USERID system@localhost:1521/HRPRD1 PASSWORD hrpassword1
            Successfully logged into database.
            
            GGSCI (HaviPori) 5> ADD CHECKPOINTTABLE HR.EMPLOYEES_CHKPT
            Successfully created checkpoint table HR.EMPLOYEES_CHKPT.
              

            現在,可以在數據庫 HRPRD1 中創建第二個 Replicat 組了。注意,我們將使用和前面數據庫 HRPRD3 所使用的完全相同的線索。

            這樣,HRPRD2 的數據所寫入到的同一個線索同時為兩個數據庫(HRPRD3 和 HRPRD1)、兩個 Replicat 組所使用。這相當棒。

            如果在 ADD REPLICAT 命令中不使用 BEGIN NOW,則 Replicat 進程會在跟蹤開始時就啟動,這也不錯。

            GGSCI (HaviPori) 6> ADD REPLICAT emp_rep, EXTTRAIL C:\OGG10G\dirdat\et, CHECKPOINTTABLE hr.employees_chkpt,
            
            REPLICAT added.
            
            GGSCI (HaviPori) 7> EDIT PARAM emp_rep
              

            在此文件中輸入以下幾行內容:

            REPLICAT emp_rep
            USERID system@localhost:1521/HRPRD1, PASSWORD hrpassword1
            ASSUMETARGETDEFS
            HANDLECOLLISIONS
            DISCARDFILE c:\OGG11G\dirrpt\emp_ext.dsc, purge
            MAP hr.employees, TARGET hr.employees;
              

            注意該文件中額外的參數,如 HANDLECOLLISIONS 和 DISCARDFILE。這是為了對表中記錄重復之類的錯誤進行處理。我們已將這些參數作為選項放入此文件中,也可以將它們放入第一個 Replicat 組的參數文件中。

            HANDLECOLLISIONS 在源數據庫活動時對初始數據加載進行自動錯誤處理。確保在初始加載完成后刪除此參數。DISCARDFILE 參數指示被刪除的記錄將保存在哪個文件中。

            現在啟動該 Replicat 組并查看其狀態:

            GGSCI (HaviPori) 8> start REPLICAT emp_rep
            Sending START request to MANAGER ('GGSMGR2') ...
            REPLICAT EMP_REP starting
            
            GGSCI (HaviPori) 9> status REPLICAT emp_rep
            REPLICAT EMP_REP: STOPPED
              

            其狀態顯示為 stopped,但 C:\OGG11G 目錄下的任何日志文件中都沒有錯誤指示。

            迫使錯誤顯示出來的唯一方法是從命令提示符處運行 Replicat。這可用于調試目的 — 錯誤(如果有的話)會顯示在屏幕上而不是寫入報告文件中。但在 Oracle GoldenGate for Oracle 11g 版本中,看上去需要通過這種方法來使 Replicat 運行起來,雖然我們認為這可能是測試服務器上的環境問題造成的。使用的命令為:

            C:\OGG11G> replicat paramfile c:\OGG11G\dirprm\emp_rep.prm
            
            ***********************************************************************
                             Oracle GoldenGate Delivery for Oracle
                                  Version 10.4.0.19 Build 002
                    Windows (optimized), Oracle 11 on Sep 18 2009 16:44:02
            Copyright (C) 1995, 2009, Oracle and/or its affiliates.  All rights reserved.
            
                                Starting at 2009-12-09 11:46:28
            ***********************************************************************
            Operating System Version:
            Microsoft Windows XP Professional, on x86
            Version 5.1 (Build 2600: Service Pack 2)
            
            Process id: 1504
            Description:
            ***********************************************************************
            **            Running with the following parameters                  **
            ***********************************************************************
            REPLICAT emp_rep
            USERID system@localhost:1521/HRPRD1, PASSWORD ***********
            ASSUMETARGETDEFS
            HANdlecollisions
            Discardfile c:\OGG11G\dirrpt\emp_ext.dsc, purge
            MAP hr.employees, TARGET hr.employees;
            
            CACHEMGR virtual memory values (may have been adjusted)
            CACHEBUFFERSIZE:                         64K
            CACHESIZE:                              512M
            CACHEBUFFERSIZE (soft max):               4M
            CACHEPAGEOUTSIZE (normal):                4M
            PROCESS VM AVAIL FROM OS (min):           1G
            CACHESIZEMAX (strict force to disk):    881M
            
            Database Version:
            Oracle Database 11g
             Enterprise Edition Release 11.1.0.6.0 - Production
            PL/SQL Release 11.1.0.6.0 - Production
            CORE    11.1.0.6.0      Production
            TNS for 32-bit Windows: Version 11.1.0.6.0 - Production
            NLSRTL Version 11.1.0.6.0 - Production
            
            Database Language and Character Set:
            NLS_LANG environment variable not set, using default value AMERICAN_AMERICA.WE8M
            SWIN1252.
            NLS_LANGUAGE     = "AMERICAN"
            NLS_TERRITORY    = "AMERICA"
            NLS_CHARACTERSET = "WE8MSWIN1252"
            
            Warning: NLS_LANG is not set. Please refer to user manual for more information.
            
            ***********************************************************************
            **                     Run Time Messages                             **
            ***********************************************************************
            Opened trail file C:\OGG10G\dirdat\et000001 at 2009-12-09 11:46:35
            
            MAP resolved (entry HR.EMPLOYEES):
              MAP HR.EMPLOYEES, TARGET hr.employees;
            Using following columns in default map by name:
              EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE,
              JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID
            
            Using the following key columns for target table HR.EMPLOYEES: EMPLOYEE_ID.
              

            此時,Replicat 進程已準備就緒,我們可在屏幕上查看其狀態。如果您打開一個新的命令窗口、啟動 GGSCI 并查看其狀態,Replicat 進程會顯示為 RUNNING。這樣,通過這種方式,Oracle Database 11g 中的復制開始工作。

            文件中額外的參數(如 HANDLECOLLISIONS 和 DISCARDFILE)是特意添加的,這是因為通過命令行運行 Replicat 進程時屏幕上曾顯示出記錄重復錯誤。從下面的輸出結果中可以看到這些錯誤,這些錯誤指示初始加載時出現的問題與重復的記錄有關。

            通過進一步的分析發現,某個用戶在 Oracle 11g 目標數據庫中手動插入了記錄,而手動插入的數據與啟動 Oracle GoldenGate 復制進程之后 插入到 Oracle 10g 源數據庫中的數據相同。這就引發了記錄重復,從而導致重復問題。

            …
            ***********************************************************************
            **                     Run Time Messages                             **
            ***********************************************************************
            Opened trail file C:\OGG10G\dirdat\et000000 at 2009-12-09 11:17:51
            
            Switching to next trail file C:\OGG10G\dirdat\et000001 at 2009-12-09 11:17:51 du
            e to EOF, with current RBA 923
            Opened trail file C:\OGG10G\dirdat\et000001 at 2009-12-09 11:17:51
            
            Processed extract process graceful restart record at seq 1, rba 923.
            
            MAP resolved (entry HR.EMPLOYEES):
              MAP HR.EMPLOYEES, TARGET hr.employees;
            Using following columns in default map by name:
              EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE,
              JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID
            
            Using the following key columns for target table HR.EMPLOYEES: EMPLOYEE_ID.
            
            2009-12-09 11:17:54  GGS WARNING     218  Aborted grouped transaction on 'HR.EMP
            LOYEES', Database error 1 (ORA-00001: unique constraint (HR.EMP_EMAIL_UK) violat
            ed).
            
            2009-12-09 11:17:54  GGS WARNING     218  Repositioning to rba 985 in seqno 1.
            
            2009-12-09 11:17:54  GGS WARNING     218  SQL error 1 mapping HR.EMPLOYEES to HR
            .EMPLOYEES OCI Error ORA-00001: unique constraint (HR.EMP_EMAIL_UK) violated (st
            atus = 1), SQL <INSERT INTO "HR"."EMPLOYEES" ("EMPLOYEE_ID","FIRST_NAME","LAST_N
            AME","EMAIL","PHONE_NUMBER","HIRE_DATE","JOB_ID","SALARY","COMMISSION_PCT","MANA
            GER_ID","DEPARTMENT_ID") VALUES (:a0,:a1,:a2,:a3,:a4,:a5>.
            
            2009-12-09 11:17:54  GGS WARNING     218  Repositioning to rba 985 in seqno 1.
            ….
              

            解決此問題的辦法是使用 HANDLECOLLISIONS 和 DISCARDFILE 參數,然后重啟該 Replicat 進程。DISCARDFILE 在出現被刪除的記錄時可提供更多信息。在命令提示符處啟動運行 Replicat 進程后,等待直到其通過線索完成運行并根據需要刪除記錄。

            然后在命令窗口按 Ctrl-C 停止該 Replicat 進程。這將顯示:

            Enter X to exit or C to continue: X
            ***********************************************************************
            *                   ** Run Time Statistics **                         *
            ***********************************************************************
            Last record for the last committed transaction is the following:
            ___________________________________________________________________
            Trail name :  C:\OGG10G\dirdat\et000001
            Hdr-Ind    :     E  (x45)     Partition  :     .  (x04)
            UndoFlag   :     .  (x00)     BeforeAfter:     A  (x41)
            RecLength  :   196 (x00c4)    IO Time    : 2009-12-08 13:43:36.000000
            IOType     :     5  (x05)     OrigNode   :   255  (xff)
            TransInd   :     .  (x03)     FormatType :     R  (x52)
            SyskeyLen  :     0  (x00)     Incomplete :     .  (x00)
            AuditRBA   :         11       AuditPos   : 1188880
            Continued  :     N  (x00)     RecCount   :     1  (x01)
            
            2009-12-08 13:43:36.000000 Insert             Len   196 RBA 1295
            Name: HR.EMPLOYEES
            ___________________________________________________________________
            
            Reading C:\OGG10G\dirdat\et000001, current RBA 1604, 2 records
            Report at 2009-12-09 11:47:56 (activity since 2009-12-09 11:46:35)
            
            From Table HR.EMPLOYEES to HR.EMPLOYEES:
                   #                   inserts:         2
                   #                   updates:         0
                   #                   deletes:         0
                   #                  discards:         0
                   #         insert collisions:         2
            
            Last log location read:
                 FILE:      C:\OGG10G\dirdat\et000001
                 SEQNO:     1
                 RBA:       1604
                 TIMESTAMP: Not Available
                 EOF:       YES
                 READERR:   400
              

            現在可以取消 HANDLECOLLISIONS 參數了,可在該參數行之前添加“—”將其注釋掉。然后在命令行重啟該 Replicat 進程。由于記錄重復問題已得到解決,該進程現在可以正常工作,以后對源數據庫進行任何更改時,該進程都可將這些更改復制過來。

            對復制進行測試

            從圖 6 的命令行窗口中可以看到 HRPRD1、HRPRD2 和 HRPRD3 這三個數據庫的 HR.EMPLOYEES 表中的記錄。這三個數據庫都正好有 107 條記錄。在第三個窗口中可看到使用的 SELECT 命令。


            圖 6 三個數據庫中的員工記錄

            現在可以在源數據庫 HRPRD2 的 HR.EMPLOYEES 表中 INSERT 和 COMMIT 一些行,然后查看這些行是否被復制到目標數據庫 HRPRD3 和 HRPRD1 中。從圖 7 中可以看到這些 INSERT 操作。


            圖 7 插入到 HRPRD2 的員工表中

            對所有三個數據庫再次運行 SELECT,其結果顯示,即刻發生了到目標數據庫的復制,所有數據庫現在都有 109 條記錄(如圖 8 所示)。這樣,使用 Oracle GoldenGate 到 Oracle 10g 和 Oracle 11g 的復制成功。


            圖 8 即刻復制到其他數據庫

            您已看到,從 Oracle Database 10g 到 10g 數據庫的復制可正常進行。從 Oracle Database 10g 到 11g 數據庫的復制也可正常進行,但是只有在命令提示符處啟動 Replicat 進程(例如使用“replicat paramfile c:\OGG11G\dirprm\emp_rep.prm”)才會如此。而從 GGSCI 啟動 Replicat 進程仍會使其滯留于 stopped 狀態。這可能是由于我們的測試服務器存在環境錯誤。我們應記住,如果從命令提示符處啟動就不會有錯誤,進程會正常運行。

            功能、資源需求和影響

            您已看到,Oracle GoldenGate 的 Extract 和 Replicat 進程已生效。每個實例(即一個 Manager 進程)可通過 GGSCI 命令接口支持多達 300 個并發的 Extract 和 Replicat 進程,這個數量相當大。

            然而,隨著此類進程數量的增加,對內存的占用也會增加 — 每個 Extract 和 Replicat 進程需要大約 25 至 55 MB 內存。對內存的占用實際上可能更高,這取決于并發事務的數量和事務大小。這始終是個問題。

            Oracle GoldenGate Replication 還對源系統有 3% 到 5% 的 CPU 影響,這取決于生成的重做日志的數量。

            我們在這里建立的是單向復制。還可以建立雙向多主復制(對多站點更新的復制)。在這樣的安裝環境中,Oracle GoldenGate 通過研究和了解兩個站點何時更新相同的記錄來解決沖突。您可以設置一些沖突解決規則(如時間戳,或者哪一方始終優先等等),您也可以就如何解決沖突設置用戶退出機制。

            即使目標數據庫的表中沒有唯一鍵時,Oracle GoldenGate 也能復制數據。這對所有支持的數據庫都是可行的,條件是您能夠指定那些是唯一的列或者使用整行作為一個鍵 — 因為任何刪除或更新操作都需要某種唯一性。

            目前,Oracle GoldenGate 不能復制雙字節數據,但計劃在未來的版本中支持這種復制?,F在,對雙字節數據的處理可傳遞給一個備用數據庫以用于災難恢復。

            Oracle GoldenGate Director

            Oracle GoldenGate 中的這一產品現在名為 Oracle Management Pack for GoldenGate。這是一個多層的客戶端-服務器應用程序,通過一個 GUI 界面監視和管理 Oracle GoldenGate 的部署。如果多臺主機上安裝了 Oracle GoldenGate Director 的遠程客戶端,您可以對這些主機上運行的多個 Oracle GoldenGate 實例(Manager 進程)進行管理。

            這些客戶端全部連接到集中安裝的 Oracle GoldenGate Director 服務器,該服務器使用 Oracle WebLogic Server 11g (10.3.1) 作為功能應用服務器。以前,較早的 JBoss Application Server 3.2.7 附帶 Oracle GoldenGate Director?,F在它為 Oracle WebLogic Server 所取代,但要注意后者必須在安裝 Oracle GoldenGate Director 服務器之前在系統上預先安裝并運行。

            Oracle GoldenGate Director 服務器有一個 Web 界面并且需要在現有 Oracle 數據庫中擁有自己的數據庫信息庫(至少 200 MB),您也可以對該信息庫使用 MySql 或 Microsoft SQL Server 。作為一項安全措施,Oracle GoldenGate Director 的安裝要求該信息庫所使用的數據庫口令必須至少為八位字符,其中至少包含一個數字和一個字母數字字符。

            如果在 GGSCI 中定義一個進程,您可以通過 Oracle GoldenGate Director 配置、監視和控制該進程。從操作系統命令行執行的其他獨立進程(如 DDLGEN 進程)不能通過 Oracle GoldenGate Director 監視。

            在 Windows、UNIX 和 NonStop 平臺上,Extract 進程、Replicat 進程、Manager 進程、線索(本地或遠程)、文件(本地或遠程)以及 Extract 和 Replicat 任務均可通過 Oracle GoldenGate Director 來配置、監視和控制。

            總結及其他信息

            在 Oracle GoldenGate Manager 參數文件中可以指定其他參數,可通過這些參數來允許動態端口分配、在 Manager 啟動時自動啟動復制進程(如 Extract 和 Replicat)、建立對所有線索的集中維護(清除)。

            The Oracle GoldenGate Administration Guide Version 10.4 詳細介紹了這些高級 Manager 參數。該指南還介紹了如何以不同的方法配置 Extract 和 Replicat 進程、如何將 Oracle GoldenGate Replication 用于實時報表、實時數據分布、實時數據倉儲、維護實時備用數據庫和主-主高可用性等各種目的,以及如何配置 DDL 同步。在某個數據庫要升級,但要求停機時間幾乎為零的情況下,Oracle GoldenGate 也非常有用 — 您只需建立從舊的數據庫版本到新的數據庫版本之間的 Oracle GoldenGate 復制,然后在切換時將您的所有客戶端切換為指向新數據庫即可。這會是一個極好的選擇,例如,如果您準備將現有數據庫移到 Oracle Exadata V2 數據庫機上,以便將您的所有數據庫整合到世界上最快的數據庫機。

            有關 Oracle GoldenGate 的另一個有用的參考資料是 Oracle GoldenGate Troubleshooting and Tuning Guide Version 10.4 。在本文開始時下載的文檔 zip 文件中包含了這個參考資料和管理指南 。

            我們想感謝 Oracle 融合中間件和 Oracle GoldenGate 的各位 Oracle 產品經理,本文所述建立 Oracle GoldenGate 復制的過程得到了他們的欣然幫助(真正的 Oracle 精神)。我們期待著計劃之中的 Oracle GoldenGate Director 與 Oracle Enterprise Manager Grid Control 的集成。

            Oracle Enterprise Manager Grid Control 是 Oracle 的一個強大的企業管理產品。如果您想了解如何對您環境中所有的 Oracle RAC 或非 Oracle RAC 數據庫、Oracle 自動存儲管理 (ASM) 實例和 Oracle Clusterware 自動打補丁,請閱讀作者的一篇題為“使用 Oracle Enterprise Manager Grid Control 修補數千個數據庫” 的文章。有關如何使用 Oracle Enterprise Manager Grid Control 為您公司的數據庫輕松建立 Oracle Recovery Manager (Oracle RMAN) 備份的信息,請閱讀“Oracle RMAN 備份:提供簡單方式 ”。

            另外,要了解使用 Oracle Enterprise Manager Grid Control 進行 Oracle Data Guard 的安裝、管理(包括倒換和故障切換)和監視如何能夠節省大量的時間和資源,請閱讀作者最近發表的另一篇文章“使用 Grid Control 輕松預防生產災難 ”。

            posted @ 2012-07-22 14:00 tbwshc| 編輯 收藏

            ---- 容災首先是一個概念,要認識到為什么做容災,才能做好容災。世界上沒有賣后悔藥的,當災難降臨了,如果沒有行之有效的數據保護、數據恢復的容災措施,帶來不可預估的損失將是無法避免的。類似電信行業、金融行業,證券行業也是如此,動輒涉及數以百億計的資金、涉及龐大的客戶量,在系統數據的準確、業務的連續、關鍵業務的不中斷等方面更是不容出現任何的差錯。
             
            ----目前,業界具有容災功能的常用解決方案主要包括以下幾類:磁盤陣列復制技術,主要由一些磁盤陣列廠商提供,如EMC SRDF、IBM PPRC HP BusinessCopy、HDS TrueCopy等;存儲卷復制技術,tb由一些卷管理軟件廠商提供,如VERITAS VVR;數據庫復制技術,由數據庫廠商以及一些第三方廠商提供,如DSG RealSync,Quest SharePlex等;應用層復制技術,由各系統的應用廠商自己提供。
             
            ----磁盤陣列復制技術主要適用于數據中心級的海量數據復制,此技術用戶必需采用支持該功能的磁盤陣列型號,而這些陣列大都為高端陣列,投資非常昂貴。并且,由于政府行業用戶的帶寬有限,而磁盤陣列復制技術對帶寬的要求又相對很高,動輒需要上GB的帶寬。此外,采用磁盤陣列復制技術,其目標端無法提供實時數據查詢,由于目標端數據庫在復制過程中不能被打開,難于實現交易與查詢的分離,同時也造成大量投資浪費。因此,磁盤陣列復制技術無法滿足某些行業集中交易系統的容災需求,使得這些用戶難以選擇此種解決方案。
             
            ----存儲卷復制技術主要適用于工作組級的數據復制,它對CPU資源占用高。同樣由于目標端數據無法提供實時數據查詢和對帶寬的要求高,使得證券等行業用戶也難以選擇。
             
            ----而應用層復制技術只適合那些在應用中提供了該技術的應用,由于它的非標準化、開發和維護工作量大,使得其應用不成熟也不普遍。關鍵行業對數據的可靠性要求又非常之高,使得關鍵行業用戶也不敢冒然選擇此種復制技術。
             
            ----DSG RealSync屬于數據庫復制技術,它適用于從工作組級、企業級到數據中心級的復制需求,無論系統采用什么樣的服務器平臺、什么樣的存儲平臺,只要是ORACLE系統之間的復制即可適用。采用DSG RealSync復制技術,其目標端數據庫在復制過程中處于可用狀態,幫助關鍵行業用戶實現生產系統與查詢統計報表系統的分離;其源端系統和目標端系統可以采用異構的操作系統平臺、存儲平臺;支持選擇性復制,即支持只復制指定的user、指定的Table、指定的行和列,從而節省存儲空間,提高應用靈活性;支持1對多,多對1的復制結構,即:能夠將多個數據庫中的數據復制到一個數據庫中,能夠將一個數據庫中的不同數據分發到不同的數據庫中;也節約帶寬和網絡資源,其所需帶寬一般在幾Mbps,幾十Mbps。
             
            ----隨著用戶容災意識的逐漸增強,關鍵行業也提出了建設一套高效、可靠、投資回收比高的災難備份系統的需求,以確保系統的數據安全和災難發生時數據的快速恢復。   
            posted @ 2012-07-22 13:58 tbwshc| 編輯 收藏

            // MultiThread.cpp : 定義控制臺應用程序的入口點。

            //

            #include "stbdafx.h"
            #include <windows.h>
            #include <iostream>

            using namespace std;
            int tickets = 100;
            HANDLE hMutex;

            DWORD WINAPI Fun1Proc(LPVOID lp);
            DWORD WINAPI Fun2Proc(LPVOID lp);

            int _tmain(int argc, _TCHAR* argv[])
            {
            HANDLE hThread1,hThread2;
            hThread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
            hThread2 = CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
            CloseHandle(hThread1);
            CloseHandle(hThread2);
            hMutex = CreateMutex(NULL,FALSE,NULL);

            Sleep(2000);
            system("pause");
            return 0;
            }

            DWORD WINAPI Fun1Proc(LPVOID lp)
            {
            while(1)
            {
             WaitForSingleObject(hMutex,INFINITE);
             if(tickets > 0)
             {
             Sleep(10);
             cout << "thread1 sell ticket." << tickets-- <<endl;
             }
             else
             break;
             ReleaseMutex(hMutex);
            }
            return 0;
            }

            DWORD WINAPI Fun2Proc(LPVOID lp)
            {
            while(1)
            {
             WaitForSingleObject(hMutex,INFINITE);
             if(tickets > 0)
             cout << "thread2 sell ticket." << tickets-- <<endl;
             else
             break;
             ReleaseMutex(hMutex);
            }
            return 0;
            }


             

            posted @ 2012-07-21 11:57 tbwshc 閱讀(1122) | 評論 (0)編輯 收藏

            哎!

            慘……

            最近接連維護兩個很煩人的項目,我的第一想法就是重寫!可是上頭的意思是說我的想法太瘋狂。

            可每次有這種情況我都感覺還是重寫劃算點……

            之前的之前一個東東重寫也就一周時間,而上頭還是決定用著,對那東東很麻煩怕新寫的別人不適應 以及穩定性的擔心。而結果就沒重寫,接下來的幾個月我都被那玩意煩。哎

            回正題

            這兩個項目一個是C++的,一個是C#的,兩個都是關于網絡的。都是非常有各自語言的特色

            C++的那個項目是所有要處理消息的函數都是統一的 void xxxx(void* pData);

            然后進去就

            int* pxx = (int*)pData;

             pxx= XXX(sss);

            pData += sizeof int;

            SH_XXX* pshxx = (SH_XXX*)pData;

            Mxxxk(pshxx,xxxixx);

            sss;

            Send(g_Buf);//所有處理函數的最后都是這一句

            寫的是行云流水,酣暢淋漓啊。慢慢看也明白,但是人都容易馬虎的,很多時候調的時候一不小心, 就不知道跑哪兒去了。

            所有函數使用同一個全局緩沖區,讀和寫是同時進行的。tb有可能讀了一些東西,偏移一段后進入某個 函數又退回一段距離開始寫東西。前前后后,讀讀寫寫。哎,煩啊

            至于C#的那個,導出是委托,每一個東西都有一個父類。比如

            Code;

            DoubleCode : Code;

            ThreeCode : DoubleCode;

            SessionCode : TreeCode;

            StreamCode : SessionCode;

            posted @ 2012-07-21 11:55 tbwshc 閱讀(160) | 評論 (0)編輯 收藏

            最近才知道struct和class的靜態構造函數的觸發規則是不同的,不像class在第一次使用類的時候觸 發靜態構造函數。如果只訪問struct實例的字段是不會觸發靜態構造函數調用的。通過測試發現當訪問靜 態字段,struct本身的函數(靜態和實例)和帶參數的構造函數就會引起靜態構造函數的執行。而調用默 認構造和未覆寫的基類虛函數是不會的。為什么呢?

            讓我們先來看看class和struct在調用構造函數時的區別。class使用newobj指令而struct使用initobj 指令來構造對象。newobj在堆上申請一塊內存并調用相應的構造函數進行初始化,然后將對象地址返回給 計算棧。initbobj則是從本地變量表中載入已經分配出來的struct實例然后初始化struct的各字段。這個 初始化過程是CLR內部執行的,而不像class編譯器會給class添加一個默認構造函數(這就是為什么 struct不能給字段添加默認值的原因。但在類中如果給字段添加了默認值編譯器就會自動在構造函數中添 加字段賦值操作)。如果給struct中定義了一個有參數的構造函數,那么系統就不會使用initobj指令, 而是直接用call指令調用帶參數的構造函數。

            我們最常見最常用的調用函數的指令是call和callvirt。對于靜態函數使用call指令,對于class使用 callvirt指令(不論class中的函數是不是虛的)。只有子類調用父類的函數的時候(避免遞歸調用)以 及構造函數中(由編譯器添加保證父類字段被初始化)使用call指令。而對于struct我們發現只要調用的 函數是struct本身定義的都是使用call指令。call和callvirt指令的差別在于,call會把調用的函數當作 靜態函數看待,而不會關心調用當前函數時實例指針(this)是否為空。這就是struct調用函數時為什么 都是call因為struct實例是不可能被置為null的。實際上class在調用非虛函數時實際上也是使用call的 只是多做了一步驗證——this是否為空,讓我們來驗證一下。

            class Class_Test{  public void Test1() {}  public virtual void Test2()

            {}  public static void Test3() {}  public override string ToString()  

            {    return base.ToString();  }}Class_Test c = new Class_Test

            ();c.Test1();c.Test2();Class_Test.Test3();string str = c.ToString();

            posted @ 2012-07-21 11:54 tbwshc 閱讀(1348) | 評論 (1)編輯 收藏

            簡介:實用工具類開發和維護會耗費程序員的時間。Boost 通過提供幾個高質量的庫,從而簡化了此 過程,您可以將這些庫輕松集成到現有的代碼庫中。本文簡單概述一些較流行的 Boost 實用工具類,并 幫助您了解如何將它們投入使用。

            實用工具類(utility classes)在幾乎任何適當規模的 C++ 項目中都是必需的,但是不存在滿足此 需求的標準方法。通常,團隊根據他們的需求編寫實用工具類代碼,但是由于缺少重要的接口信息,使得 相同組織中的其他項目團隊無法重用那些類。建議的標準模板庫(Standard Template Library,STL)只 具有諸如 hash、stack 和 vector 等少數基本類,因此無法有效地用于取代遺留實用工具庫。

            本文將介紹幾個 Boost 實用工具類,包括 tuple、static_assert、pool、random 和 program_options。您需要對標準 STL 具備一定的了解才能充分理解本文的內容。本文中的所有代碼都已 使用 Boostb 1.35 來進行了測試并使用 gcc-3.4.4 來進行了編譯。

            boost::tuple 類

            有時,您希望 C++ 函數返回多個不相關的值。在推出 STL 之前,實現此目的的方法是創建所有不相 關變量的結構,并以指針或引用的形式返回它們或作為參數傳遞給函數——但是任一種方法都不是表達程 序員意圖的方法。STL 引入了 pair,可將其用于聚合不相關的數據部分,但它一次只能處理兩個數據對 象。為了使用 int、char 和 float 的元組(tuple ),您可以按如下方式返回 pair:

            make_pair<int, pair<char, float> > (3, make_pair<char, float> ('a', 0.9));

            隨著您添加更多的元素,創建元組結構將變得越來越困難。Boost tuple 類型派上了用場。要使用 boost::tuple,您必須包括頭文件 tuple.hpp。要執行元組比較和元組 I/O,您需要分別包括 tuple_comparison.hpp 和 tuple_io.hpp。

            第一個使用元組的程序

            清單 1 使用 int、char 和 float 的元組并打印內容。

            清單 1. 創建 Boost 元組并打印內容

            #include <iostream>
            #include <tuple.hpp>
            #include <tuple_comparison.hpp>
            #include <tuple_io.hpp>
            using namespace boost;
            int main ( )
             {
             tuple<int, char, float> t(2, 'a', 0.9);
              std::cout << t << std::endl;
             return 0;
             }

            此代碼的輸出為 (2 a 0.9)。請注意,<< 運算符重載 std::ostream,以便通過轉儲每個單獨 的 tuple 元素來輸出元組。

            posted @ 2012-07-21 11:54 tbwshc 閱讀(1112) | 評論 (0)編輯 收藏

            在C/C++中,整型的長度跟編譯器相關,編譯器的實現取決于CPU。 比如TC++是DOS16下的應用程序,DOS16是16位的操作系統,所以TC++中sizeof(int)==16;同理win32中sizeof(int)==32。

            C99標準定義一個叫著<stdint.h>的頭文件,該頭文件定義了一系列各種類別的整數類型typedef名字。盡管速多C++工具支持該頭文件已經有一段時間了,但它尚未正式收錄于C++標準,因此,在使用該頭文件之前,你應該先閱讀你的編譯器文檔,看看它是否支持該文件。在某些C++ 的編譯器中,如GNC,為了能使用C99標準的這些新特性,就在<inttypes.h>頭文件中引入了這個文件< stdint.h>.

            字長固定的整型類型

            C99標準在<stdint.h>這個頭文件的類型定義中,有一套是字長固定的整型類型:

            int8_t   int16_t   int32_t   int64_t

            與其對應的字長固定的無符號型整型類型有:

            uint8_t   uint16_t   uint32_t   uint64_t

            它們的名字非常直觀。例如,int8_t是長度固定為8比特的有符號整型類型,tb而uint8_t則是字長固定為8比特的無符號型整型類型。當你需要確保在不同的平臺上,整型數據的字長固定不變,那么你就可以使用這些typedef名字。允許對期望的性質進行更為詳細的描述。例如,有的類型的名字是 int_least8_t,它至少有 8 位,還有 int32_t,它恰好是 32 位。

            C99標準標準保證至少可以訪問 8 位、16 位、32 位和 64 位類型。沒有保證會提供精確寬度類型。不要使用這種類型,除非您肯定是實在不能接受更大的類型。另一個可選的類型是新的 intptr_t 類型,它是一個足夠大的可以容納一個指針的整數。并不是所有的系統都提供這樣一種類型(盡管當前所有的 Linux 和 BSD 實現都提供)。

            字長最小的快速整型類型

            該頭文件還定義了另外一套typedef名字,即“最小指定長度的快速整數類型”。這套typedef名字中的每一種都表示一種整數類型,它滿足在長度不小于某個指定長度的前提下,擁有最快的處理速度。這些整數類型的名字為int_fastX_t(有符號)或者uint_fastX_t(無符號),其中“X”表示最小指定長度。例如,int_fast32_t指得是字長至少為32比特的快速有符號整型類型。最小字長快速整型類型有:

            int_fast8_t  int_fast16_t  int_fast32_t  int_fast64_t

            對應的無符號整型類型有:

            uint_fast8_t  uint_fast16_t  uint_fast32_t  uint_fast64_t

            什么情況下使用這些typedef名字?

            假設你需要一個字長不少于16比特的循環計數器,那么你會希望該計數器的類型總是當前計算機CPU最佳操作的整型類型,而int_fast16_t可以保證任何平臺上的編譯器總是選擇字長不少于16比特的最快整型類型。

            #include <inttypes.h>
            for (int_fast16_t n=0; n<30000; ++n)
            {
            //.. do something
            }


             

            posted @ 2012-07-21 11:53 tbwshc 閱讀(1047) | 評論 (0)編輯 收藏

            SQL Server 2008中對匯總有明顯的增強,有點像Oracle的語法了。請看下面四個例子:

            假定場景如下:某幾位員工在不同時間參加了不同的項目,獲取了相應的收入,現在需要按各種分類進行統計。

            基本表如下:

            USE testDb2  GO   IF NOT OBJECT_ID('tb_Income') IS NULL DROP TABLE [tb_Income]   /****** Object: Table [dbo].[tb_Income] Script Date: 2012/4/5 8:19:21 ******/   CREATE TABLE [dbo].[tb_Income](  [TeamID] int not null,  [PName] [Nvarchar](20) NOT NULL,  [CYear] Smallint NOT NULL,  [CMonth] TinyInt NOT NULL,  [CMoney] Decimal (10,2) Not Null  )   GO  INSERT [dbo].[tb_Income]  SELECT 1,'胡一刀',2011,2,5600  union ALL SELECT 1,'胡一刀',2011,1,5678  union ALL SELECT 1,'胡一刀',2011,3,6798  union ALL SELECT 2,'胡一刀',2011,4,7800  union ALL SELECT 2,'胡一刀',2011,5,8899  union ALL SELECT 3,'胡一刀',2012,8,8877   union ALL SELECT 1,'苗人鳳',2011,1,3455  union ALL SELECT 1,'苗人鳳',2011,2,4567  union ALL SELECT 2,'苗人鳳',2011,3,5676  union ALL SELECT 3,'苗人鳳',2011,4,5600  union ALL SELECT 2,'苗人鳳',2011,5,6788  union ALL SELECT 2,'苗人鳳',2012,6,5679  union ALL SELECT 2,'苗人鳳',2012,7,6785   union ALL SELECT 2,'張無忌',2011,2,5600  union ALL SELECT 2,'張無忌',2011,3,2345  union ALL SELECT 2,'張無忌',2011,5,12000  union ALL SELECT 3,'張無忌',2011,4,23456  union ALL SELECT 3,'張無忌',2011,6,4567  union ALL SELECT 1,'張無忌',2012,7,6789  union ALL SELECT 1,'張無忌',2012,8,9998   union ALL SELECT 3,'趙半山',2011,7,6798  union ALL SELECT 3,'趙半山',2011,10,10000  union ALL SELECT 3,'趙半山',2011,9,12021  union ALL SELECT 2,'趙半山',2012,11,8799  union ALL SELECT 1,'趙半山',2012,12,10002   union ALL SELECT 3,'令狐沖',2011,8,7896  union ALL SELECT 3,'令狐沖',2011,9,7890  union ALL SELECT 2,'令狐沖',2011,10,7799  union ALL SELECT 2,'令狐沖',2011,11,9988  union ALL SELECT 2,'令狐沖',2012,9,34567  union ALL SELECT 3,'令狐沖',2012,12,5609   GO 數據如下:

            SELECT * FROM tb_Income   /*   TeamID PName CYear CMonth CMoney   胡一刀 2011 2 5600.00   胡一刀 2011 1 5678.00   胡一刀 2011 3 6798.00   胡一刀 2011 4 7800.00   胡一刀 2011 5 8899.00   胡一刀 2012 8 8877.00   苗人鳳 2011 1 3455.00   苗人鳳 2011 2 4567.00   苗人鳳 2011 3 5676.00   苗人鳳 2011 4 5600.00   苗人鳳 2011 5 6788.00   苗人鳳 2012 6 5679.00   苗人鳳 2012 7 6785.00   張無忌 2011 2 5600.00   張無忌 2011 3 2345.00   張無忌 2011 5 12000.00   張無忌 2011 4 23456.00   張無忌 2011 6 4567.00   張無忌 2012 7 6789.00   張無忌 2012 8 9998.00   趙半山 2011 7 6798.00   趙半山 2011 10 10000.00   趙半山 2011 9 12021.00   趙半山 2012 11 8799.00   趙半山 2012 12 10002.00   令狐沖 2011 8 7896.00   令狐沖 2011 9 7890.00   令狐沖 2011 10 7799.00   令狐沖 2011 11 9988.00   令狐沖 2012 9 34567.00   令狐沖 2012 12 5609.00  */ 一、使用CUBE匯總數據(http://msdn.microsoft.com/en-us/library/bb522495%28v=sql.105%29.aspx)

            小試牛刀,

            /*********使用CUBE匯總數據***************/   /********* 3w@live.cn 邀月***************/  SELECT TeamID as 小組ID,  SUM(CMoney) 總收入  FROM tb_Income  GROUP BY CUBE (TeamID)  ----ORDER BY TeamID desc
             

             

            改進查詢:

            SELECT TeamID as 小組ID,PName as 姓名,  SUM(CMoney) 總收入  FROM tb_Income  GROUP BY CUBE (TeamID,PName)


            二、使用ROLLUP匯總數據(http://msdn.microsoft.com/en-us/library/bb522495%28v=sql.105%29.aspx)

            /*********使用ROLLUP匯總數據***************/   /********* 3w@live.cn 邀月***************/   SELECT TeamID as 小組ID,PName as 姓名,  SUM(CMoney) 總收入  FROM tb_Income  GROUP BY ROLLUP (TeamID,PName)


            注意:使用Rollup與指定的聚合列的順序有關。

             

            三、使用Grouping Sets創建自定義匯總數據(http://msdn.microsoft.com/en-us/library/bb522495%28v=sql.105%29.aspx)

            除了Cube和Rollup,還有更加靈活強大的自定義集合匯總--Grouping Sets

            /*********使用Grouping Sets創建自定義匯總數據***************/   /********* 3w@live.cn 邀月***************/   SELECT TeamID as 小組ID,PName as 姓名,CYear as 年份,----min(CMonth) as 月份,  SUM(CMoney) 總收入  FROM tb_Income  Where CMonth=2  GROUP BY grouping SETS ((TeamID),(TeamID,PName),(CYear,PName))


            四、使用Grouping標識匯總行(http://technet.microsoft.com/zh-cn/library/ms178544.aspx)

            細心的朋友可能會注意到,如果Cube后有兩個以上的匯總列時,可能會有一些列是Null,那么這些Null值究竟tb本身就是Null,還是由于聚合產生的Null呢,此時,GroupingID函數大顯身手的機會來了。

            /*********使用Grouping標識匯總行***************/   /********* 3w@live.cn 邀月***************/  SELECT TeamID as 小組ID,CYear as 年份,  CASE WHEN grouping(TeamID)=0 AND grouping(CYear)=1 THEN '小組匯總' WHEN grouping(TeamID)=1 AND grouping(CYear)=0 THEN '年份匯總' WHEN grouping(TeamID)=1 AND grouping(CYear)=1 THEN '所有匯總' else '正常行' END as 行類別,  SUM(CMoney) 總收入  FROM tb_Income  GROUP BY CUBE (TeamID,CYear) 結果:

             

            其實,還有更復雜的Grouping_ID,不過,一般情況下用不到,需要的同學,請看MSDN:

            http://technet.microsoft.com/zh-cn/library/bb510624.aspx


            小結:帶有Cube,Rollup,grouping Sets的Group By函數在統計與分析中有著廣泛的應用,相信它的高效簡捷,在特定的場合會令人你愛不釋手!

             

            posted @ 2012-07-15 17:16 tbwshc 閱讀(805) | 評論 (0)編輯 收藏

            僅列出標題
            共10頁: First 2 3 4 5 6 7 8 9 10 
            国内精品久久久久久久久| 无码伊人66久久大杳蕉网站谷歌| 久久午夜无码鲁丝片秋霞| 久久精品国产一区二区三区| 久久国产乱子伦精品免费午夜| 国产L精品国产亚洲区久久| 精品久久一区二区三区| 国产91久久精品一区二区| 91精品国产乱码久久久久久| 久久国产精品99国产精| 亚洲国产成人久久精品影视| 国产成人久久久精品二区三区| 99久久人人爽亚洲精品美女| 久久精品一区二区影院| 无码8090精品久久一区| 97精品依人久久久大香线蕉97| 久久香蕉超碰97国产精品| 久久精品人人做人人爽电影| 久久精品无码一区二区三区免费| 一级女性全黄久久生活片免费| 久久久久亚洲av综合波多野结衣 | 亚洲婷婷国产精品电影人久久| 久久夜色精品国产| 蜜臀av性久久久久蜜臀aⅴ麻豆| 久久99国产精品久久| 久久精品国产72国产精福利| 久久精品国产亚洲av麻豆图片| 久久精品无码专区免费东京热 | 狠狠综合久久综合中文88 | 久久男人中文字幕资源站| 狠狠色噜噜色狠狠狠综合久久| 国产精品久久毛片完整版| 色悠久久久久久久综合网| 国产国产成人精品久久| 久久综合九色综合久99| 久久精品国产亚洲av高清漫画 | 久久久精品人妻无码专区不卡 | 超级碰久久免费公开视频| 亚洲国产成人久久一区WWW| 久久99国产亚洲高清观看首页| 人妻精品久久久久中文字幕|