天天看點

designs\project\database-OGG

目錄

    • 簡介
    • OGG 關鍵特性
    • OGG 用途
    • OGG 的幾種架構方式
    • OGG 工作原理
        • 概覽
        • 擴充性
        • 檢查點
    • OGG 的配置
        • OGG環境搭建
          • 資料庫端配置
          • OGG 端配置
        • 抽取程序配置
          • 無 Pump 抽取程序示栗
          • 有 Pump 抽取程序示栗
        • 初始同步
        • 複制程序配置
        • 并行優化
        • 雙向複制的問題

簡介

OGG 是一個資料庫 Replication 工具

如果您的來源庫和目标僅是Oracle資料庫,使用Data Guard就可以了,如果我的源端是Oracle,而目标是任何其他資料庫之一,最受歡迎且受支援的工具,最可行的方案是OGG(OGG 還支援從 mysql 同步到 sqlserver 之類)

OGG 關鍵特性

  • 實時性
    • 主伺服器和從伺服器之間的同步,幾乎是實時進行的(0.1秒級别,調優後)
  • 異構系統資料庫同步
  • 保證事物的完整性
    • 這意味着事物,從源端到目标端的順序是不會改變的

OGG 用途

  • 建構高可用性系統
    • 實時的同步,當源資料庫當機時,應用程式可以仍然連接配接到副本集資料庫并繼續
  • 熱更,零停機時間的版本更新或遷移
    • 源資料庫更新時,讓應用程式遷移到副本集上
  • 分離應用,提供單獨的報送伺服器
    • 我們将源端資料庫 replication 到我們的目标資料庫,在目标端,我們将配置,目标報送程式
    • 源端中的資源全部很好地用于確定 OLTP 程式的高效執行
  • 資料庫産品內建
    • 我們一般喜歡建立一個資料倉庫,從所有不同的位置提取資料,并将來源資料整合,進入資料倉庫
  • 它還提供轉換資料的能力
    • 您可以已程式設計的方式,使用它還提供可擴充的解決方案,通過它可以完成轉換,非常快且經過優化
  • 部落客個人覺得: OGG 是一個 replication 中間件,但還算不上分布式中間件。最近 Apache 開源了分布式資料庫 shardingsphere(又要學 (╬▔皿▔)╯)
    • OGG 支援完全備援,支援基于 SQL 的部分備援
      • 不支援分布式事務
      • 不支援并行查詢
    • OGG 的檢查點機制保證 Replication 的有序性
      • OGG 應該不支援分布式的并發,因為我沒看到過有時鐘同步!
    • OGG 提供可伸縮性 Scalibility
    • OGG 支援故障恢複 Fault tolerance
      • 非分布式架構,無協調器的概念
    • OGG 内部實作對使用者透明 Transparency
  • 部落客個人覺得:想要将 OGG 組分布式系統,可以将 OGG 的資料在一個 Memocache 或者 MongoDB 中集中轉發,這樣,共享記憶體的分布式資料庫的特性就基本有了。部落客想想而已。老闆要是聽說我想造個輪子,他該吐血了 ⊙﹏⊙∥
    • 安全可靠?宕了就停了
    • 備援資料的一緻性?有的
    • 并發事務支援?找 MongoDB
    • 容錯性?有的

OGG 的幾種架構方式

  • 單向複制
  • 雙向複制
  • 廣播
  • 資料內建
  • 級聯

OGG 工作原理

概覽

我們都知道 OGG 是基于日志更改的捕獲

擴充性

trail 檔案

可以是

  • Flat File —— 呃,不認識
  • Adapters —— 使用者自定義的擴充卡
  • DB Load Utility Format —— 目标端資料庫能識别的規格檔案

使用者可以自由的開發擴充應用

檢查點

OGG 通過類似邏輯時鐘同步(内部有序CSN号/事務号)的機制,提升實時備援 Replication 的容錯性

OGG 的配置

  • 環境準備
  • 配置抽取程序
  • 初始同步
  • 配置複制程序

OGG環境搭建

資料庫端配置
注意當需要配置多個資料庫的時候,請把視窗排齊整,確定我們正在連接配接到正确的資料庫,不要問我為啥知道
           
  • 在源端和目标端建立一個資料庫使用者
    • OGG 從Redo日志檔案中讀取資訊,而 redo 檔案僅具有有關對象ID的資訊,是以OGG軟體需要通路資料庫
      • 可以直接實用 as sysdba 的角色授權
      • 不過 Oracle 的 DBA 角色數量好像最多 5 個還是 6 個吧!還是老老實實配置權限吧
      grant unlimited tablespace to ogg;
      grant create session, alter session to ogg;
      grant alter system to ogg;
      grant select any dictionary to ogg;
      grant flashback any table to ogg;
      grant select any table, insert any table, update any table, delete any table, drop any table to ogg;
      grant create table, create sequence to ogg;
      grant select on dba_clusters to ogg;
      grant select on v_$database to ogg;
      grant select on sys.logmnr_buildlog to ogg;
      grant select any transaction to ogg;
      grant lock any table to ogg;
      grant ggs_ggsuser_role to ogg;
      grant execute on dbms_flashback to ogg;
      grant execute on dbms_logmnr_d to ogg;
      grant execute on dbms_capture_adm to ogg;
      grant execute on dbms_streams to ogg;
      grant execute on utl_file to ogg;
      exec dbms_streams_auth.grant_admin_privilege(‘ogg’); 
                 
    • OGG 必須在目标資料庫執行 DML,這個使用者擁有在目标端資料庫執行 DML 權限
  • 開啟supplemental日志,并立即切換為 supplemental 日志模式
    • 啟用資料庫級别的 supplemental 日志
      • a) 檢視歸檔日志使用情況
        select * from v$flash_recovery_area_usage; --檢視空間占用率,如果 ARCHIVED LOG 超過90%,Oracle随時有當機的危險
        select * from v$recovery_file_dest; --檢視歸檔日志大小及使用情況
        select group#, bytes, status from v$log; --檢視現有日志
        select sequence#,first_time from v$loghist;--列出所有歸檔redo日志檔案的順序和産生的時間
        select * from v$archived_log;  --檢視v$archive_log
        select count(*) from v$archived_log where archived='YES' and deleted='NO'; --檢視所有歸檔,未删除的歸檔日志
                   
        b) 修改閃回區大小
        show parameter db_recovery
        -- 首先是關閉資料庫:以SYS身份連結到oracle,執行
        shutdown immediate;
        -- 啟動資料庫到mount狀态:
        startup mount
        -- 檢視回閃恢複區的大小和存放目标:
        show parameter db_recovery_file_dest
        -- 修改回閃恢複區的大小
        alter system set db_recovery_file_dest_size = 4G
        -- (預設是2G,可以根據實際情況調整大小)
        -- 最後打開資料庫: 
        alter database open;
                   
        • c) 方法二:重定向歸檔日志的位置

          生産環境建議将歸檔目錄和oracle産品的安裝目錄分開。最後的目錄名稱需要為archive_log!

        • d) 實際上從Oracle 10g開始,可以生成多份一樣的日志,儲存多個位置,以防不測
        • e) 開啟歸檔日志
        shutdown immediate;
        startup mount
        alter database archivelog;
        alter database open;
        archive log list;
        
        alter database force logging;
        alter database add supplemental log data
        -- 如果啟用DDL 支援,必須關閉recycle bin
        alter system set recyclebin=offscope=spfile;
        alter system switch logfile;
        -- 切換一下日志,最好還能重新開機一下
                   
OGG 端配置
  • 番外
    • a) 使用CMD定位到OGG安裝目錄,輸入GGSCI進入OGG配置終端
    • b) Windows2012伺服器上報錯,運作GGSCI找不到MSVCP100
      • MSVCP100.dll = Visual C++ 2010 Runtime
    • c) Windows2012伺服器上報錯,運作GGSCI找不到MSVCR100
      • MSVCR100.dll = Visual C++ 2010 Runtime
    • d) Windows2012伺服器上報錯,運作GGSCI找不到MSVCR120
      • MSVCR120.dll = Visual C++ 2013 Runtime
    • e) 其他版本依次類推,記得去微軟官網下 www.microsoft.com 别裝上其他東西了
  • 源端将需要同步的表加入trandata。
    • 預設的重做日志隻記錄 rowId,是以一個額外的主鍵資訊也應該被記錄
    • 重做日志對加入 trandata 的表額外記錄主鍵
      -- 運作GGSCI,進入OGG管理控制台
      dblogin userid admin password admin
      add trandata xxxx.*
                 
  • 配置源端和目标端的 manager 程序
    • manager 是 OGG 的主線程管理全局的東西
    • 建議編輯全局配置檔案,在全局檔案中指定使用檢查點表的表名
    • 全局配置檔案應該存在于安裝在的預設位置,OGG根目錄
  • 如果是異構環境,資料庫類型不一緻
    • 在源端中定義資料源格式
    • 在目标端定義資料格式
    • 這可以通過使用一個稱為 defgen 的實用程式,通過它可以顯示的指定映射
    • Manager 配置方法參見:designs\project\database-windows下OGG的部署

抽取程序配置

  • OGG 的基于日志的捕獲對于源系統的性能影響很小
  • 啟用 pump
    • 如果目标端是再網絡的另一端,則我們可以啟用單獨的 pump 程序來将本地 trail 釋出到遠端 trail
    • 使用 pump 的另一個好處是,如果網絡斷了抽取程序不會受到影響,OGG繼續運作
    • 如果使用一個 pump 來發送給多個目标,如果其中一個網絡掉線,則 pump 會停止
    • 是以一般我們為一個 trail 啟用多個獨立的 pump 來 pump 到不同目的地,且多個 pump 的檢查點互相獨立
無 Pump 抽取程序示栗
add extract extwest, tranlog, begin now
edit param extwest
           
EXTRACT extwest
USERID admin,PASSWORD oracle
RMTHOST 127.0.0.1, MGRPORT 7809 
RMTTRAIL .\dirdat\ew
dynamicresolution
gettruncates
TABLE admin.*;
STATOPETIONS RESETREPORTSTAS
REPORT AT 00:01
REPORTROLLOVER AT 00:01
REPORTCOUNT EVERY 60 SECONDS, RATE
           
-- 
add exttrail ./dirdat/ew, extract extwest, megabytes 50
           
有 Pump 抽取程序示栗
edit param extwest
           
EXTRACT extwest
EXTRAIL ./dirdat/ew
USERID gguser, PASSWORD gguser
TABLE west.*;
STATOPETIONS RESETREPORTSTAS
REPORT AT 00:01
REPORTROLLOVER AT 00:01
REPORTCOUNT EVERY 60 SECONDS, RATE
           
add extract extwest, tranlog, begin now
           
-- 建立 pump
edit param pwest
           
EXTRACT pwest
RMTHOST 192.168.1.110, MGRPORT 15001, COMPRESS
RMTTRAIL ./dirdat/pe
PASSTHRU
TABLE west.*;
           
add extract pwest, extrailsource ./dirdata/ew
           
start extract extwest
start extract pwest
           

初始同步

對比手動備份恢複,OGG 執行初始同步之後,不管源代碼發生了什麼變化,都可以被捕獲并同步到目标中
           
再執行初始同步之前,請確定從源端的抽取程序已經是開啟狀态,以防初始同步期間的資料丢失
  • 初始同步時的沖突解決 collisior
    • 由于初始同步和資料同步同時運作,我們會遇到許多的沖突,我們可以嘗試停止同步,如果實在沒有辦法停止源端事務,則考慮處理初始同步持續期間的沖突
      • 記錄重複:在 Replciate 中使用 SEND HANDLECOLLISIONS 來解決問題
      • 找不到記錄:(資料被使用者删除了)在 Replciate 中添加 SEND NOHANDLECOLLISIONS 來解決問題

複制程序配置

DBLOGIN USERID ogg, PASSWORD ogg
ADD CHECKPOINTTABLE ogg.checkpoint
           
edit param rep1
           
REPLICAT rep1
USERID root,PASSWORD oracle
ASSUMETARGETDEFS
REPERROR default,discard
DISCARDFILE .\repsz.dsc,append,megabytes 100 // 請将目錄更換成自己的,
MAP admin.*, TARGET root.*;
           

并行優化

如果資料之間沒有依賴(通過 range 函數,或者分表),可以開啟多個抽取程序,進行優化

雙向複制的問題

  • loop 循環複制:使用 Exclude User 來避免。A 傳遞給 B ,B 再傳回給 A
  • conflicts 沖突:如果兩邊的使用者同一時間使用同一行記錄的時候。
    • 使得同步足夠的快
    • 通過資料分片來避免兩邊同時處理同一記錄
    • 手動處理沖突監測并解決沖突
  • 序列不能同步
    • 可以在以邊時用偶數序列,另一邊使用奇數序列
  • 禁用 Truncate
文檔翻譯?CSDN 稽核中啊