目錄
-
- 簡介
- 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 支援完全備援,支援基于 SQL 的部分備援
- 部落客個人覺得:想要将 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 權限
- OGG 從Redo日志檔案中讀取資訊,而 redo 檔案僅具有有關對象ID的資訊,是以OGG軟體需要通路資料庫
- 開啟supplemental日志,并立即切換為 supplemental 日志模式
- 啟用資料庫級别的 supplemental 日志
- a) 檢視歸檔日志使用情況
b) 修改閃回區大小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'; --檢視所有歸檔,未删除的歸檔日志
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; -- 切換一下日志,最好還能重新開機一下
-
- a) 檢視歸檔日志使用情況
- 啟用資料庫級别的 supplemental 日志
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 稽核中啊