ExpertOracleGoldenGate - BasicReplication (1)

snowdba發表於2014-11-06
第三篇 基礎複製

文章出處來自Expert Oracle GoldenGate。本人英語水平有限,按照自己對OGG的理解和書面表達的含義寫下了這篇部落格,為自己的學習之路做個紀念。由於本篇內容較多,今天先放出第一部分。


本篇提供了一個易於理解的GoldenGate基礎複製,包括一個複製human resources schema的範例。我們能看到如何安裝、啟動、確認基礎複製的配置,包括初始化資料載入程式。無論該範例是執行在Linux在的Oracle還是執行在Windows上的SQL Server2008, GlodenGate的命令和概念適用於所有平臺。

預覽

這一篇覆蓋了安裝、配置GoldenGate基本單向複製。為了持續同步變化還新增了local Extract, data-pump Extract和Replicat。更多的高階配置以後的篇章中介紹。

Prerequisites for Setting Up Replication
安裝Relication的基礎條件

開始安裝replication之前我們需要具備下面的基礎條件
  • 在源端和目標端安裝GoldenGate軟體的安裝
  • 在源端和目標端建立資料庫user ID
  • 目標端資料庫伺服器配置了正確的伺服器名或IP地址
  • 源端和目標端的GoldenGate管理程式(manager)已經啟動並處於執行狀態(running)
  • TCP/IP網路可以連線源端伺服器到目標端伺服器的GoldenGate管理程式埠。
  • 資料通行(Data currency):資料多久會被更新?允許資料複製的延時是多久?如果不允許有延時或者資料變化量很大時,我們需要多花些時間來專門設計和調優複製期間出現的延時。記住資料更新頻率和系統能容忍的延時,還有目標資料庫的時間不需要完全的同源端一致。
  • 資料量:有多少資料需要被複制?資料更新的頻率?從源端的資料庫事務日誌檔案中可以研究出源資料的變化量。資料變化量將直接影響到源端與目標端的網路頻寬和磁碟空間。
  • trail檔案
  • 資料需求:我們應該明白任何獨有的活著特殊的資料需求,使它們能夠在GoldenGate中正確處理。比如在目標端需要禁用一些觸發器(trigger)。如果序列(sequences)需要複製就需要為它們新增特殊的引數。某些資料型別可能經過特殊處理也無法支援。比如在GoldenGate 11中BFILE和ANYDATA就不支援。有些其他型別的資料能被支援,但是會收到限制。一定要在GoldenGate產品文件中檢視並確認使用的資料型別是否被支援。
  • 安全需求:複製過程中有多少安全性的要求?複製資料是否加密?GoldenGate在資料儲存到trail檔案和從源端傳送到目標端的過程都可以加密。是否需要為資料庫中的資料加密?資料庫資料的加密方法叫做TDE(Transparent Data Encryption),如果使用該功能需要為replication定義特殊的解密資料。
  • 網路需求:replication需要防火牆開啟那些埠?源端到目標端的距離有多遠? 處理這些資料量需要多少頻寬,有多少頻寬是可用的?

Table 4-1 描述了本章所需的環境。其中部分設定是Windows下SQL Server資料庫環境使用的。記住,GoldenGate支援源端和目標端採用不同型別的資料庫。



源端和目標端使用的Human Resources或者HR都來自於Oracle安裝時自帶的範例。下面的列表就是來自範例中HR模式(也可以理解為使用者)裡的Employees表。
SQL> desc employees;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 EMPLOYEE_ID                               NOT NULL NUMBER(6)
 FIRST_NAME                                         VARCHAR2(20)
 LAST_NAME                                 NOT NULL VARCHAR2(25)
 EMAIL                                     NOT NULL VARCHAR2(25)
 PHONE_NUMBER                                       VARCHAR2(20)
 HIRE_DATE                                 NOT NULL DATE
 JOB_ID                                    NOT NULL VARCHAR2(10)
 SALARY                                             NUMBER(8,2)
 COMMISSION_PCT                                     NUMBER(2,2)
 MANAGER_ID                                         NUMBER(6)
 DEPARTMENT_ID                                      NUMBER(4)

單項複製拓撲結構

這一篇我們採用的拓撲結構是單項複製,如下圖所示。上一篇部落格中提到的最簡單的單項複製拓撲結構常用來做報表查詢或解除安裝資料。只有源端資料庫產生資料變化,然後在目標端上覆制。




基本的複製步驟

當具備了所有先決條件後,建立基本的單項複製需要4個步驟,如同下圖描述的那樣。這些步驟包含了初始化資料後的同步工作。稍後介紹每一步的詳細內容。



下面來描述圖中的各個步驟

1. 開始抽取。配置並啟動抽取程式來捕獲資料庫變化,並且將這些變化寫入源端佇列(source trail)

2. 開始投遞。配置和啟動投遞程式,將源source trail中捕獲到的資料庫變化通過網路傳送到目標資料庫所在伺服器,然後將變化寫入目標端佇列(remote trail)

3. 執行資料初始化載入。可以採用Goldengate或者其他工具。目的是使目標端資料庫適時同步源端資料庫之前,保持資料一致。推薦使用exp/imp或者RMAN

4. 開始複製。配置和啟動複製程式開始應用遠端佇列(remote trail)中的變化,直到兩邊資料同步。


從抽取程式開始,讓我們看看每一個步驟的細節

抽取程式

當我們確認前提條件都已經具備就可以開始進行復制操作的第一步,啟動Extract。


本節介紹了多種Extract的配置選項,在這之後會看到怎樣啟動Extract並確認可以它可以正確的獲取變化。


確認開啟了資料庫級別“補充日誌”(supplemental logging)


當開始從資料庫複製之前,需要保證源端資料庫開啟了資料庫級補充日誌(supplemental logging)。如果是雙向複製就需要在源端和目標端都開啟補充日誌。追加日誌提供為Goldengate提供了redo log的補充資訊。


使用下面的SQLPLUS命令來去人Oracle資料庫是否已經開啟了補充日誌模式:

SQL> SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;

SUPPLEMENTAL_LOG_DATA_MIN
-------------------------
NO

如果上面的輸出結果是NO,可以使用下面的命令開啟補充日誌模式:

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

再次確認結果

SQL> SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;

SUPPLEMENTAL_LOG_DATA_MIN
————————————

YES

記住,Oracle9i中SUPPLEMENTAL_LOG_DATA引數必須為YES,Oracle10g以後SUPPLEMENTAL_LOG_DATA引數必須為YES或是IMPLICIT


開啟表級補充日誌

通常情況下,資料庫所記錄的日誌資訊不能完全滿足Goldengate複製目標資料庫的需求。資料產生變化時OGG還需要一個鍵值將變化應用到目標資料庫時。新增補充日誌到源端資料庫表,確保在目標端可以正確的應用更新操作。

可以使用GoldenGate ADD TRANDATA命令強制為源端資料庫的更新操作記錄一個主鍵列。在單向複製中,不需要在目標端資料庫開啟補充日誌。在Goldengate命令介面GGSCI中輸入下列命令來開啟補充日誌

GGSCI (sourceserver) 1> dblogin userid gger password userpw
Successfully logged into database.

GGSCI (sourceserver) 2> add trandata hr.employees
Logging of supplemental redo data enabled for table HR.EMPLOYEES.

DBLOGIN命令為OGG管理使用者建立了一個資料庫連線。ADD TRANDATA命令使資料庫為HR.EMPLOYEES表的所有更新操作記錄了一個主鍵列。

可以使用下面的查詢語句來驗證補充日誌是否新增成功

SQL> select owner, log_group_name, table_name
    from dba_log_groups where owner = 'HR';

OWNER  LOG_GROUP_NAME      TABLE_NAME
-----  -------------------  ----------
HR    GGS_EMPLOYEES_19387  EMPLOYEES

如果資料庫中有很多表都需要新增補充日誌,可以使用SQL指令碼來生成ADD TRANDATA命令

set echo off
set verify off
set pagesize 2000
set linesize 250
set trim on
set heading off
set feedback off

spool &&SCHEMA..add_trandata.obey

select 'add trandata &SCHEMA..'||table_name
  from dba_tables where owner = '&SCHEMA' ;

spool off


前面的指令碼生成了一個Oracle spool檔案,以後可以在GGSCI使用OBEY命令來執行它。

GGSCI (sourceserver) 1> dblogin userid gger password userpw
Successfully logged into database.

GGSCI (sourceserver) 2> obey diroby/HR.add_trandata.obey


ADD TRANDATA命令執行過一次之後,使用下面的SQLPLUS命令來驗證是否生效

SQL> select owner, log_group_name, table_name
    from dba_log_groups where owner = 'HR';

OWNER  LOG_GROUP_NAME        TABLE_NAME
-----  ---------------------  -----------
HR    GGS_REGIONS_19375      REGIONS
HR    GGS_COUNTRIES_19377    COUNTRIES

HR    GGS_LOCATIONS_19379    LOCATIONS
HR    GGS_DEPARTMENTS_19382  DEPARTMENTS
HR    GGS_JOBS_19385         JOBS
HR    GGS_EMPLOYEES_19387    EMPLOYEES
HR    GGS_JOB_HISTORY_19391  JOB_HISTORY


下面的步驟是禁用所有的觸發器或者級聯刪除約束。

禁用觸發器和級聯刪除約束

我們需要禁用目標端表上的所有資料庫觸發器或者級聯刪除完整性約束。以為我們已經從源端複製了觸發器和級聯刪除所產生的資料,而目標端也應用了這些變化。如果不禁用它們,會再次觸發其操作,導致資料錯誤。

禁用觸發器和級聯刪除約束有以下方法。第一種方法是針對高版本的資料庫,在Replicat配置檔案中新增一個引數。第二種方法是使用指令碼來禁用它們。

從Goldengate 11版本之後,Replicat配置檔案中的DBOPTIONS引數多了一個新的選項SUPPRESSTRIGGERS,可以自動的阻止觸發器。該引數需要資料庫的版本是10.2.0.5或者11.2.0.2以上。如果使用的時Oracle9.2.0.7版本資料庫,可以使用DBOPTIONS引數配合DEFERREFCONST選項來延緩完成性驗證,指導Replicat提交事務。

當然也可以是用SQL指令碼來禁用觸發器和級聯刪除約束。從資料中動態的生成該指令碼既快速又準確。

set echo off
set verify off
set pagesize 2000
set linesize 250
set trim on
set heading off
set feedback off

spool &&SCHEMA..disable_cascade_delete_constraints.sql

select 'alter table '||owner||'.'||table_name||
' disable constraint '||constraint_name||';'
from all_constraints
where delete_rule = 'CASCADE'

and owner = '&SCHEMA';


spool off
spool &SCHEMA..disable_triggers.sql

select 'alter trigger '||owner||'.'||trigger_name||
' disable ;'
from all_triggers
where owner = '&SCHEMA';

spool off
spool &SCHEMA..enable_cascade_delete_constraints.sql

select 'alter table '||owner||'.'||table_name||
' enable constraint '||constraint_name||';'
from all_constraints
where delete_rule = 'CASCADE'

and owner = '&SCHEMA';
spool off
spool &SCHEMA..enable_triggers.sql

select 'alter trigger '||owner||'.'||trigger_name||
' enable;'
from all_triggers
where owner = '&SCHEMA';

spool off


指令碼生成了4個spool檔案,可以在SQLPLUS中執行該指令碼來禁用觸發器和級聯刪除約束


未完待續...




















來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29047826/viewspace-1323516/,如需轉載,請註明出處,否則將追究法律責任。

相關文章