Goldengate的拆分與合併
在使用Goldengate作為複製解決方案時,隨著負載的增加,replicat元件常常是最先出現效能瓶頸的。為了適應不斷增加的負載,就需要拆分replicat來實現並行複製,本文介紹Goldengate拆分的具體實施步驟。同時,作為拆分的逆向操作,介紹如何將拆分的多個replicat合併回一個replicat。
拆分的方式一般分為兩種:
一種是用goldengate提供的@RANGE函式作表內的拆分,透過對錶上主鍵列作hash演算法將該表上發生的變更均分到多個replicat上來降低單個replicat元件的負載;
另一種是將複製的表劃分成幾組,使用多個replicat元件來分別複製其中的一組表。
前一種拆分和合並方式的具體步驟參考metalink文件:1320133.1和1512633.1。
本文介紹後一種拆分方式的實現步驟。
為了實現對錶分組拆分,首先要考慮如何分組,通常我們可以按表的負載來劃分。
透過以下命令,生成近一段時間複製的統計report
GGSCI>send rep01,report
在report檔案中可以看到各個表上在過去一段時間分別發生了多少變更,進而按負載將表均分到多個replicat元件中。
接下來以將一路replicat拆分成兩路的案例介紹具體實施步驟:
replicat程式的拆分與合併
拆分:
1.停止replicat程式
cd $GG_HOME
ggsci
GGSCI>stop rep01
2.將兩個新的replicat引數檔案複製到$GG_HOME/dirprm目錄中。
這兩個新的引數檔案與原有的引數檔案的主要區別是將其中的複製表按負載均分為了兩部分,分別放在單獨的引數檔案中。
3.建立新的replicat元件
GGSCI> ADD REPLICAT rep01a,EXTTRAIL /oracle/goldengate/ggs/dirdat/r1
GGSCI> ADD REPLICAT rep02a,EXTTRAIL /oracle/goldengate/ggs/dirdat/r1
4.檢查replicat程式的checkpoint資訊
GGSCI>info rep01,showch
記錄下其Current Checkpoint資訊中的sequence和RBA值。
Current Checkpoint (position of last record read in the data source):
Sequence #: 2157
RBA: 2856752
Timestamp: 2013-09-03 08:13:58.035316
Extract Trail: /oracle/goldengate/ggs/dirdat/r1
5.修改新建replicat程式的read checkpoint資訊
根據step 4中得到的Current checkpoint資訊修改新建replicat程式的checkpoint資訊,之後新建的replicat程式就會從舊replicat程式停止的位置開始抓取新的資訊
GGSCI> alter rep01a, extseqno , extrba
GGSCI> alter rep02a, extseqno , extrba
6.啟動新建的replicat程式
GGSCI>start rep01a
GGSCI>start rep02a
7.刪除舊的replicat程式
GGSCI>dblogin userid ,password ***
GGSCI>delete rep01
合併:
1.停止extract程式
cd $GG_HOME
ggsci
GGSCI>stop ext01
2.檢查extract程式的checkpoint資訊
GGSCI>info ext01,showch
記錄下其Write Checkpoint資訊中的sequence和RBA值,比如:
Write Checkpoint #1
GGS Log Trail
Current Checkpoint (current write position):
Sequence #: 2157
RBA: 36277005
3.檢查pump程式的checkpoint資訊
GGSCI>info pump01,showch
若pump程式的Current Checkpoint資訊中的sequence和RBA值與step 2得到的值相等,則說明goldengate抓取的資訊都已被傳送到了target伺服器上,可繼續執行下一步驟。否則,等待並重復執行該命令。
比如:
Current Checkpoint (position of last record read in the data source):
Sequence #: 2157
RBA: 36277005
同時,記錄下其Write Checkpoint資訊中的sequence和RBA值。
比如:
Write Checkpoint #1
GGS Log Trail
Current Checkpoint (current write position):
Sequence #: 2160
RBA: 41659507
4.檢查replicat程式的checkpoint資訊
GGSCI>info rep01a,showch
GGSCI>info rep02a,showch
若replicat程式的Current Checkpoint資訊中的sequence和RBA值與step 3中得到的Write Checkpoint資訊相等,則說明goldengate抓取的資訊都已被apply到target db,可繼續執行下一步驟。否則,等待並重復執行該命令。
比如:
Current Checkpoint (position of last record read in the data source):
Sequence #: 2160
RBA: 41659507
5.停止舊的replicat程式
GGSCI>stop rep01a
GGSCI>stop rep02a
6.將合併後新的replicat引數檔案複製到$GG_HOME/dirprm目錄中。
合併後新的引數檔案是將原有的兩個引數檔案中的表合併到了一個檔案中。
7.建立新的replicat程式
GGSCI> ADD REPLICAT rep01,EXTTRAIL /oracle/goldengate/ggs/dirdat/r1
8.修改新建replicat程式的read checkpoint資訊
根據step 4中得到的Current checkpoint資訊修改新建replicat程式的checkpoint資訊,之後新建的replicat程式就會從舊replicat程式停止的位置開始抓取新的資訊
GGSCI> alter rep01, extseqno , extrba
9.啟動新建的replicat程式
GGSCI>start rep01
10.啟動extract程式
GGSCI>start ext01
11.刪除舊的replicat程式
GGSCI>dblogin userid ,password ***
GGSCI>delete rep01a
GGSCI>delete rep02a
查詢關於Goldengate的相關資料可發現,作為實現goldengate best practice的建議之一,oracle建議:"To avoid contention, Oracle recommends that when reading trail files, you pair each Replicat with its own trail file".也就是說,當考慮拆分replicat來實現並行複製時,oracle建議最好從pump元件開始拆分,以下步驟就針對前面的案例,進一步說明了如何從pump元件開始拆分goldengate.然後介紹如何對這種拆分作逆向合併。
pump和replicat程式的拆分與合併
拆分:
1.停止extract程式
cd $GG_HOME
ggsci
GGSCI>stop ext01
2.檢查extract程式的checkpoint資訊
GGSCI>info ext01,showch
記錄下其Write Checkpoint資訊中的sequence和RBA值,比如:
Write Checkpoint #1
GGS Log Trail
Current Checkpoint (current write position):
Sequence #: 2153
RBA: 91925643
3.檢查pump程式的checkpoint資訊
GGSCI>info pump01,showch
若pump程式的Current Checkpoint資訊中的sequence和RBA值與step 2得到的值相等,則說明goldengate抓取的資訊都已被傳送到了target伺服器上,可繼續執行下一步驟。否則,等待並重復執行該命令。
Current Checkpoint (position of last record read in the data source):
Sequence #: 2153
RBA: 91925643
記錄下其Write Checkpoint資訊中的sequence和RBA值,比如:
Write Checkpoint #1
GGS Log Trail
Current Checkpoint (current write position):
Sequence #: 2157
RBA: 2332672
4.停止舊的pump程式
GGSCI>stop pump01
5.檢查replicat程式的checkpoint資訊
GGSCI>info rep01,showch
若replicat程式的Current Checkpoint資訊中的sequence和RBA值與step 3中得到的Write Checkpoint資訊相等,則說明goldengate抓取的資訊都已被apply到target db,可繼續執行下一步驟。否則,等待並重復執行該命令。
Current Checkpoint (position of last record read in the data source):
Sequence #: 2157
RBA: 2856752
6.停止舊的replicat程式
GGSCI>stop rep01
7.將兩個新的pump引數檔案複製到$GG_HOME/dirprm目錄中。
這兩個新的引數檔案與原有的引數檔案的主要區別是將其中的複製表按負載均分為了兩部分,分別放在單獨的引數檔案中。
8.建立兩個新的pump程式
GGSCI>ADD EXTRACT pump01a, EXTTRAILSOURCE /oracle/goldengate/ggs/dirdat/e1
GGSCI>ADD RMTTRAIL /oracle/goldengate/ggs/dirdat/r1, EXTRACT pump01a,MEGABYTES 100
GGSCI>ADD EXTRACT pump02a, EXTTRAILSOURCE /oracle/goldengate/ggs/dirdat/e1
GGSCI>ADD RMTTRAIL /oracle/goldengate/ggs/dirdat/r2, EXTRACT pump02a,MEGABYTES 100
9.修改新建pump程式的read checkpoint資訊
根據step 3中得到的read checkpoint資訊修改新建pump程式的checkpoint資訊,讓其從舊pump程式停止的位置開始抓取新的資訊
GGSCI> ALTER EXTRACT pump01a, EXTSEQNO , EXTRBA
GGSCI> ALTER EXTRACT pump02a, EXTSEQNO , EXTRBA
10.將兩個新的replicat引數檔案複製到$GG_HOME/dirprm目錄中。
與pump引數檔案類似,這兩個新的引數檔案與原有的引數檔案的主要區別是對錶的拆分。
11.建立兩個新的replicat程式
GGSCI>ADD REPLICAT rep01a,EXTTRAIL /oracle/goldengate/ggs/dirdat/r1
GGSCI>ADD REPLICAT rep02a,EXTTRAIL /oracle/goldengate/ggs/dirdat/r2
12.刪除traget伺服器上/oracle/goldengate/ggs/dirdat/目錄下原有的以r1開頭的trail file檔案
13.啟動新建的pump程式
GGSCI>start pump01a
GGSCI>start pump02a
14.啟動新建的replicat程式
GGSCI>start rep01a
GGSCI>start rep02a
13.刪除舊的pump程式
GGSCI>delete pump01
14.刪除舊的replicat程式
GGSCI>dblogin userid ,password ***
GGSCI>delete rep01
合併:
1.停止extract程式
cd $GG_HOME
ggsci
GGSCI>stop ext01
2.檢查extract程式的checkpoint資訊
GGSCI>info ext01,showch
記錄下其Write Checkpoint資訊中的sequence和RBA值,比如:
Write Checkpoint #1
GGS Log Trail
Current Checkpoint (current write position):
Sequence #: 2153
RBA: 91925643
3.檢查pump程式的checkpoint資訊
GGSCI>info pump01a,showch
GGSCI>info pump02a,showch
若pump程式的Current Checkpoint資訊中的sequence和RBA值與step 2得到的值相等,則說明goldengate抓取的資訊都已被傳送到了target伺服器上,可繼續執行下一步驟。否則,等待並重復執行該命令。
Current Checkpoint (position of last record read in the data source):
Sequence #: 2153
RBA: 91925643
記錄下其Write Checkpoint資訊中的sequence和RBA值,比如:
Write Checkpoint #1
GGS Log Trail
Current Checkpoint (current write position):
Sequence #: 2157
RBA: 2332672
4.停止舊的pump程式
GGSCI>stop pump01a
GGSCI>stop pump02a
5.檢查replicat程式的checkpoint資訊
GGSCI>info rep01a,showch
GGSCI>info rep01a,showch
若replicat程式的Current Checkpoint資訊中的sequence和RBA值與step 3中得到的Write Checkpoint資訊相等,則說明goldengate抓取的資訊都已被apply到target db,可繼續執行下一步驟。否則,等待並重復執行該命令。
Current Checkpoint (position of last record read in the data source):
Sequence #: 2157
RBA: 2856752
6.停止舊的replicat程式
GGSCI>stop rep01a
GGSCI>stop rep02a
7.將合併後新的pump引數檔案複製到$GG_HOME/dirprm目錄中。
合併後新的引數檔案是將原有的兩個引數檔案中的表合併到了一個檔案中。
8.建立新的pump程式
GGSCI>ADD EXTRACT pump01, EXTTRAILSOURCE /oracle/goldengate/ggs/dirdat/e1
GGSCI>ADD RMTTRAIL /oracle/goldengate/ggs/dirdat/r1, EXTRACT pump01,MEGABYTES 100
9.修改新建pump程式的read checkpoint資訊
根據step 3中得到的read checkpoint資訊修改新建pump程式的checkpoint資訊,讓其從舊pump程式停止的位置開始抓取新的資訊
GGSCI> ALTER EXTRACT pump01, EXTSEQNO , EXTRBA
10.將合併後新的replicat引數檔案複製到$GG_HOME/dirprm目錄中。
合併後新的引數檔案是將原有的兩個引數檔案中的表合併到了一個檔案中。
11.建立新的replicat程式
GGSCI>ADD REPLICAT rep01,EXTTRAIL /oracle/goldengate/ggs/dirdat/r1
12.刪除traget伺服器上/oracle/goldengate/ggs/dirdat/目錄下原有的以r1開頭的trail file檔案
13.啟動新建的pump程式
GGSCI>start pump01
14.啟動新建的replicat程式
GGSCI>start rep01
13.刪除舊的pump程式
GGSCI>delete pump01a
GGSCI>delete pump02a
14.刪除舊的replicat程式
GGSCI>dblogin userid ,password ***
GGSCI>delete rep01a
GGSCI>delete rep02a
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29819001/viewspace-1805255/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- java 拆分與合併字串Java字串
- 命令列中的拆分與合併命令列
- opencv 影像的 ROI、通道的拆分與合併OpenCV
- 資料檔案合併與拆分
- Oracle 11g 分割槽拆分與合併Oracle
- 請求合併與拆分在併發場景中應用
- PDFsam Basic for mac合併拆分PDF文件Mac
- linux檔案合併、去重、拆分Linux
- Java與JavaScript 完美實現字串拆分(利用陣列儲存)與合併的互逆操作JavaScript字串陣列
- 奇酷手機怎麼合併和拆分聯絡人 奇酷手機怎麼合併和拆分聯絡人教程
- Aspose.Words使用教程之如何寫入純文字(TXT)檔案,表的合併與拆分
- iOS拆分,合併靜態庫以壓縮打包空間iOS
- PDF Merge PDF Splitter for Mac(PDF合併和拆分軟體)Mac
- 合併與拆分資料模型(MSDM:Merging & Spliting Data Modeling)模型
- Git 分支與合併Git
- Hbase-原理-region合併和hfile的合併(大合併、小合併)
- Git 分支 - 分支的新建與合併Git
- git分支合併與rebaseGit
- 生成表格與合併表格
- 使用TortoiseGit操作分支的建立與合併Git
- CSS的樣式合併與模組化CSS
- PHP 圖片的合併,微信小程式碼合併,文字合併PHP微信小程式
- C#陣列 多個集合和陣列的操作(合併,去重,拆分,判斷)C#陣列
- Hive列合併與元素蒐集Hive
- Linux大檔案的切割與合併Linux
- GoldenGate--大事務拆分成小事務定位問題Go
- JS 物件合併與克隆方法的分類與比較JS物件
- Linux - 檔案的分割(split)與合併(cat)Linux
- linux下檔案的切割與合併(轉)Linux
- MySQL按指定字元合並及拆分MySql字元
- NumPy 陣列迭代與合併詳解陣列
- git合併分支,如果選擇性的合併檔案?Git
- 真正的git合併Git
- 使用合適的維度拆分來求解問題
- Word與Outlook聯絡人的郵件合併(轉)
- 影片合併分割軟體如何合併影片
- Unity網格合併_材質合併[轉]Unity
- ETL中雙流合併和多流合併的區別