oracle goldengate 配置DML&DDL實驗

湖湘文化發表於2013-12-18
 

Oracle Goldengate

關於DMLDDL複製模擬環境搭建

1.      Read Me

此文件的內容為搭建Oracle GoldengateOGG)的DML複製、以及DDL複製。從生產端到容災端的配置(主到從)。主要模擬的是生產端正常工作,容災端作為災備庫;當生產端出現問題後,應用切換至容災端,並由容災端資料庫接管業務;在生產端恢復後,將資料從容災端重新透過OGG同步到生產端的一個過程。文件中並沒有雙向配置的描述,相信大家瞭解這些配置過程之後,參考Admin文件實現雙向複製應該問題不大。此文件為實驗性質的文件,肯定存在一些不足,歡迎大家批評指正。

2.      實驗環境以及OGG架構介紹:

平臺:Red Hat 5.4 32bit

資料庫版本: Oracle 10GR210.2.0.1

OGG version 11.1.1.0.0

OGG實現原理是透過對生產端資料庫中redo log或者archive log的內容進行抽取、投遞、複製,使生產端資料庫實現同容災端資料庫的資料同步。以下是OGG的技術架構:

OGG相關程式介紹:

序號

程式名

說明

1

Manager

Goldengate軟體的管理程式,用於管理生產端或者容災端OGG相關程式。以下簡稱為MGR

2

Extract

GoldenGate軟體的抽取程式,又叫Capture程式,一般用於抽取資料庫日誌抓取資料變化或將本地佇列中資料傳遞到目標端。以下簡稱為ext_ylqa

3

Replicat

GoldenGate軟體的投遞程式,又稱為Delivery程式,用於將佇列檔案中的資料變化轉換為sql應用到目標庫。以下簡稱為repylqa

4

Data Pump

專指將本地佇列中資料傳遞到目標端的Extract程式,區別於讀取日誌的主Extract程式。以下簡稱為dpylqa

Primary Extract: The primary Extract process captures data and DDL from the database

source.

Data pump: The data pump is a secondary Extract process that reads captured data from

a local trail on the source system and sends it over the network to the target. The data

pump adds storage flexibility and isolates the primary Extract process from TCP/IP

activity. For an illustration of how a data pump fits into the capture configuration, see

Figure 1 on page 38.

Replicat: The Replicat process reads a remote trail and applies the transactional

changes to the target database.

3.      生產端資料庫環境準備

3.1 建立ggate使用者以及表空間

-- Create tablespace

SQL>  create tablespace ggs datafile '/home/app/oradata/node1/ggs01.dbf' size 50m;

-- Create the user

CREATE USER ggate IDENTIFIED BY ggate default tablespace ggs temporary tablespace temp quota unlimited on ggs ;

-- Grant/Revoke role privileges

grant resource,connect,dba to ggate;

3.2   檢視歸檔資訊

生產端需要是歸檔模式

--檢視是否歸檔

Archive log list;

--修改歸檔模式

shutdown immediate

startup mount;

alter database archivelog;

alter database open;

3.3 配置oracle環境變數

oracle環境變數中新增以下內容(如果不新增,將無法啟動透過./ggsci啟動ggsci介面):

export OGG_HOME=/home/oracle/ggate

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$OGG_HOME:$LD_LIBRARY_PATH

3.4 開啟資料庫附件日誌

檢查附件日誌情況

select

SUPPLEMENTAL_LOG_DATA_MIN

,SUPPLEMENTAL_LOG_DATA_PK

,SUPPLEMENTAL_LOG_DATA_UI

,SUPPLEMENTAL_LOG_DATA_FK

,SUPPLEMENTAL_LOG_DATA_ALL from v$database;

開啟資料庫附件日誌

alter database add supplemental log data;

alter database add supplemental log data (primary key, unique,foreign key) columns;

alter system switch logfile;

--回退

alter database drop supplemental log data (primary key, unique,foreign key) columns;

alter database drop supplemental log data;

3.5 開啟資料庫強制日誌模式

alter database force logging;

3.6 生產端OGG軟體安裝

上傳安裝介質到生產端伺服器,並解壓:

(本次試驗將OGG的安裝目錄放在/home/oracle/ggate下)

--安裝軟體

cd /home/oracle/ggate

tar zxvf *.gz

--建立子目錄

/home/oracle/ggate目錄下,執行以下命令:  --如果沒有修改oracle環境變數,會在此步驟報錯

./ggsci

--GGSCI命令列為複製表新增transdata

Enabling schema-level supplemental logging

DBLOGIN USERID ggate, PASSWORD ggate

ADD TRANDATA SCOTT.*   

--sqlplus下檢視是否完整新增

select table_name from all_tables where owner='SCOTT' and table_name not in (select distinct table_name from dba_log_group_columns where owner='SCOTT');

4.      生產端OGG程式配置

4.1 配置GLOBALS引數

GGSCI>EDIT PARAMS ./GLOBALS

GGSCHEMA ggate指定進行DDL複製的資料庫使用者,DML可不配置

CHECKPOINTTABLE ggate.oggchkpt

4.2   配置MGR程式

GGSCI>edit params mgr

PORT 7839

DYNAMICPORTLIST  7840-7849

--AUTOSTART EXTRACT *

--AUTORESTART EXTRACT *, RETRIES 5, WAITMINUTES 7

PURGEOLDEXTRACTS ./dirdat/*, USECHECKPOINTS, MINKEEPDAYS 7

LAGREPORTHOURS 1

LAGINFOMINUTES 30

LAGCRITICALMINUTES 45

以下兩句用於DDL,單獨配置DML時,可不新增

PURGEDDLHISTORY MINKEEPDAYS 3, MAXKEEPDAYS 7

PURGEMARKERHISTORY MINKEEPDAYS 3, MAXKEEPDAYS 7

4.3   配置ext_scot程式(OGG抽取程式)

GGSCI> edit params ext_scot

EXTRACT ext_scot

SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")

DBOPTIONS   ALLOWUNUSEDCOLUMN

USERID ggate, PASSWORD ggate

--GETTRUNCATES這個引數可以在開啟DDL複製時登出掉

REPORTCOUNT EVERY 1 MINUTES, RATE

NUMFILES 5000

DISCARDFILE ./dirrpt/ext_scot.dsc, APPEND, MEGABYTES 100

DISCARDROLLOVER AT 2:00

WARNLONGTRANS 2h, CHECKINTERVAL 3m

EXTTRAIL ./dirdat/ga, MEGABYTES 200

DYNAMICRESOLUTION

TRANLOGOPTIONS CONVERTUCS2CLOBS

TRANLOGOPTIONS RAWDEVICEOFFSET 0

以下部分是DDL的配置,DML複製可以不配置

-----------------------------------------

DDL &

INCLUDE MAPPED OBJTYPE 'table' &

INCLUDE MAPPED OBJTYPE 'index' &

EXCLUDE OPTYPE COMMENT

DDLOPTIONS  NOCROSSRENAME  REPORT

------------------------------------------------------

TABLE      SCOTT.* ;

4.4 配置dpescot程式

GGSCI>edit params dpescot

EXTRACT dpescot

RMTHOST 192.168.150.129, MGRPORT 7839, COMPRESS

PASSTHRU

NUMFILES 5000

RMTTRAIL ./dirdat/ga

DYNAMICRESOLUTION

TABLE      SCOTT.* ;

注:配置檔案中的IP是目標端,也就是容災端的IP

4.4   配置repscob程式

(此程式用於主從切換,即原來的生產端變成目標端,原來的目標端變成生產端)

GGSCI>edit params repscob

REPLICAT repscob

SETENV (NLS_LANG = "AMERICAN_AMERICA.AL32UTF8")

USERID ggate, PASSWORD ggate

REPORT AT 00:59

REPORTCOUNT EVERY 1 MINUTES, RATE

REPORTROLLOVER AT 02:00

REPERROR DEFAULT, ABEND

NUMFILES 5000

GROUPTRANSOPS 10000

--HANDLECOLLISIONS

ASSUMETARGETDEFS

DISCARDFILE ./dirrpt/repylqb.dsc, APPEND, MEGABYTES 200

DISCARDROLLOVER AT 02:00

GETTRUNCATES

ALLOWNOOPUPDATES

以下部分是DDL的配置,DML複製可以不配置

-----------------------------------------

DDL include mapped

DDLOPTIONS report

-----------------------------------------

MAP SCOTT.*, TARGET  SCOTT.*;

4.5  建立OGGDDL物件

進入OGG安裝目錄下

cd /home/oracle/ggate

sqlplus "/ as sysdba"

SQL> @marker_setup.sql

Enter GoldenGate schema name:ggate

SQL> @ddl_setup.sql

Enter GoldenGate schema name:ggate

SQL> @role_setup.sql

Grant this role to each user assigned to the Extract, Replicat, GGSCI, and Manager processes, by using the following SQL command:

GRANT GGS_GGSUSER_ROLE TO

where is the user assigned to the GoldenGate processes.

手動執行以上授權SQL

GRANT GGS_GGSUSER_ROLE TO ggate;

啟動DDL觸發器(在OGG安裝目錄下)

SQL>@ddl_enable.sql

4.6  安裝效能提升工具

為了提供OGGDDL複製的效能,可以將ddl_pin指令碼加入到資料庫啟動的指令碼後面,該指令碼需要帶一個OGGDDL使用者(即安裝DDL物件的使用者,本例中是ggate)的引數(安裝過程中,會提示安裝dbms_shared_pool系統包,需要執行$ORACLE_HOME/rdbms/admin/dbmspool.sql)

SQL> @ddl_pin ggate

4.7  新增抽取/投遞程式與佇列檔案

GGSCI> ADD EXTRACT ext_scot,tranlog,begin now

GGSCI> ADD EXTTRAIL ./dirdat/ga, EXTRACT ext_scot, megabytes 100

GGSCI> ADD EXTRACT dpescot, EXTTRAILSOURCE ./dirdat/ga

GGSCI> ADD RMTTRAIL ./dirdat/ga, EXTRACT dpescot, MEGABYTES 100

注:這個需要關注的是,配置並未新增之前配置的repscob程式。

4.8  啟動MGR程式

GGSCI> start mgr

4.9  啟動ext_scot程式(抽取程式)

GGSCI> start extract ext_scot

記錄啟動extract程式的時間

可以透過以下方式,獲取當前啟動extract程式的時間,例如“2012-04-24 10:20:55”

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

======================以下初始化過程由資料泵來實現=================

5.      災備端資料庫的資料初始化

災備端資料庫的資料初始化主要目標是,透過生產端資料庫的全庫備份,恢復資料庫至災備端。主要採用RMAN備份恢復的方式來初始化資料庫。

透過RMAN備份全庫之前,需要檢視生產端資料庫中所有事務的start時間是否晚於啟動extract的時間。

可以透過以下的步驟檢視生產端資料庫中事務start時間

SQL>select  start_time  from v$transaction where to_date(start_time, 'yyyy-mm-dd hh24:mi:ss')

注:只有當所有事務的start時間晚於extract啟動的時間,才能進行全庫備份。

使用oracle使用者登入,透過RMAN進行全庫備份

--備份資料庫:

$ rman target /

rman> run {

ALLOCATE CHANNEL ch00 TYPE DISK;

ALLOCATE CHANNEL ch01 TYPE DISK;

CROSSCHECK BACKUPSET;

DELETE NOPROMPT EXPIRED BACKUPSET;

sql 'alter system archive log current';

BACKUP AS BACKUPSET SKIP INACCESSIBLE;

TAG hot_db_bk_level0 FORMAT '/rmanbak/ogg/full_%s_%p_%t';

FULL DATABASE;

RELEASE CHANNEL ch00;

RELEASE CHANNEL ch01;

}

--備份歸檔日誌以及控制檔案

run {

ALLOCATE CHANNEL ch00 TYPE DISK;

ALLOCATE CHANNEL ch01 TYPE DISK;

sql 'alter system switch logfile';

sql 'alter system switch logfile';

sql 'alter system switch logfile';

sql 'alter system archive log current';

BACKUP ARCHIVELOG ALL FORMAT '/rmanbak/ogg/ARCH_%U';

BACKUP CURRENT CONTROLFILE FORMAT /rmanbak/ogg/bk_controlfile';

RELEASE CHANNEL ch00;

RELEASE CHANNEL ch01;

}

注:這裡要保證最後備份控制檔案。

--檢視備份集,透過以下命令找到最近備份的歸檔LOW SCN

$ rman target /

RMAN> list backup;

注:記錄此SCN,在恢復的時候需要用到這個SCN

使用oracle使用者登入災備端執行恢復操作

在災備端建立相同的目錄結構,並正確設定:ORACLE_BASE,ORACLE_HOME,ORACLE_SID等環境變數。

複製生產端資料庫init{ORACLE_SID}.ora檔案到目標機,將引數job_queue_processes設定為0

生成口令檔案或者複製生產端資料庫口令檔案到災備端。

啟動資料庫nomount狀態

$ rman target /

RMAN> startup nomount;

恢復控制檔案

RMAN> restore controlfile from ‘/rmanbak/ogg/bk_controlfile’;

啟動資料庫到mount狀態

RMAN> alter database mount;

恢復資料庫

RMAN> crosscheck backup;

RMAN> restore database;

RMAN> run {

set UNTIL SCN ***;   --SCN為第二步中得到的SCN

recover database;

}

查詢災備端資料庫SCN(在啟動災備端複製程式時,需要該SCN)

SQL> SELECT CHECKPOINT_CHANGE#,CHECKPOINT_TIME FROM V$DATAFILE_HEADER;

災備端開啟資料庫

Alter database open resetlogs;

至此,容災端資料庫已經恢復出來。總結一下原理就是根據SCN將容災端資料庫恢復到生產庫的一個時間點。

=====================================================================

6.      災備端資料庫相關引數配置

6.1 檢查Goldengate使用者資訊

一般情況下,透過RMAN恢復出來的庫中已經存在ggate使用者,如果不存在重新建立該使用者,參考生產端建立ggate使用者指令碼。

6.2   關閉歸檔模式

archive log list;

shutdown immediate;

startup mount;

alter database noarchivelog;

atler database open;

6.3  關閉資料庫強制日誌模式

alter database no force logging;

6.4 禁用災備端資料庫觸發器

declare

v_sql varchar2(2000);

CURSOR c_trigger IS SELECT 'alter trigger '||owner||'.'||trigger_name||' disable' from dba_triggers where owner='SCOTT';

BEGIN

OPEN c_trigger;

LOOP

FETCH c_trigger INTO v_sql;

EXIT WHEN c_trigger%NOTFOUND;

execute immediate v_sql;

end loop;

close c_trigger;

end;

/

--檢查是否全部禁用

select owner||'.'||trigger_name,status from dba_triggers where owner='SCOTT' and STATUS='ENABLED';

6.5  禁用外來鍵

declare

v_sql varchar2(2000);

CURSOR c_trigger IS SELECT 'alter table '||owner||'.'||table_name||' disable constraint '||constraint_name from dba_constraints where constraint_type='R' and owner='SCOTT';

BEGIN

OPEN c_trigger;

LOOP

FETCH c_trigger INTO v_sql;

EXIT WHEN c_trigger%NOTFOUND;

execute immediate v_sql;

end loop;

close c_trigger;

end;

/

--檢視結果

select status, owner||'.'||table_name from dba_constraints where owner='SCOTT' and status='ENABLED' and  constraint_type='R';

6.6 禁用災備端JOB

在災備端資料庫恢復前,在pfile檔案中修改引數job_queue_processes0,預設值為10

alter system set job_queue_processes=0 scope=both;

job_queue_processes 0

6.7 配置災備端oracle使用者環境變數

參考生產端oracle環境變數

6.8 安裝OGG軟體

參考生產端OGG軟體的安裝,在這建立生產端和容災端安裝OGG軟體的家目錄一致。

a.      解壓檔案

b.      建立子目錄

c.       解除安裝DDL配置(這一步跟生產端不一致

在災備端的OGG安裝目錄下執行以下指令碼:

SQL>@ddl_disable.sql

SQL>@ddl_remove.sql

SQL>@marker_remove.sql

注:在執行上述指令碼的時候,會提示輸入安裝時所指定的schema名稱(這裡實驗是ggate)

7.      災備端OGG相關程式配置

7.1  配置GLOBALS

GGSCI> EDIT PARAMS ./GLOBALS

GGSCHEMA ggate

CHECKPOINTTABLE ggate.oggchkpt

--新增檢查表

GGSCI> DBLOGIN USERID ggate, PASSWORD ggate

GGSCI> ADD CHECKPOINTTABLE ggate.oggchkpt

7.2 配置MGR程式

PORT 7839

DYNAMICPORTLIST 7840-7849

--AUTOSTART REPLICAT *

--AUTORESTART REPLICAT *, RETRIES 5, WAITMINUTES 1

PURGEOLDEXTRACTS ./dirdat/*, USECHECKPOINTS, MINKEEPDAYS 7

LAGREPORTHOURS 1

LAGINFOMINUTES 30

LAGCRITICALMINUTES 45

注:在DDL複製中,目標端的MGR程式,不需要配置DDL引數。

7.3 配置repscot程式

REPLICAT repscot

SETENV (NLS_LANG = "AMERICAN_AMERICA.AL32UTF8")

USERID ggate, PASSWORD ggate

REPORT AT 00:59

REPORTCOUNT EVERY 1 MINUTES, RATE

REPORTROLLOVER AT 02:00

REPERROR DEFAULT, ABEND

NUMFILES 5000

GROUPTRANSOPS 10000

ASSUMETARGETDEFS

DISCARDFILE ./dirrpt/repscot.dsc, APPEND, MEGABYTES 200

DISCARDROLLOVER AT 02:00

ALLOWNOOPUPDATES

--------------------------------------DDL專用-----------

DDL include mapped

DDLOPTIONS report

----------------------------------

MAP SCOTT.*, TARGET  SCOTT.*;

7.4 配置ext_scob程式(主從切換時使用)

EXTRACT ext_scob

SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")

DBOPTIONS   ALLOWUNUSEDCOLUMN

USERID ggate, PASSWORD ggate

GETTRUNCATES

REPORTCOUNT EVERY 1 MINUTES, RATE

NUMFILES 5000

DISCARDFILE ./dirrpt/ext_scob.dsc, APPEND, MEGABYTES 100

DISCARDROLLOVER AT 2:00

WARNLONGTRANS 2h, CHECKINTERVAL 3m

EXTTRAIL ./dirdat/et, MEGABYTES 200

DYNAMICRESOLUTION

TRANLOGOPTIONS CONVERTUCS2CLOBS

TRANLOGOPTIONS  EXCLUDEUSER ggate

DDL &

INCLUDE MAPPED OBJTYPE 'table' &

INCLUDE MAPPED OBJTYPE 'index' &

EXCLUDE OPTYPE COMMENT

DDLOPTIONS  NOCROSSRENAME  REPORT

TABLE      SCOTT.* ;

7.5 配置dpescob程式(主從切換時使用)

EXTRACT dpescob

RMTHOST 192.168.150.128, MGRPORT 7839, COMPRESS

PASSTHRU

NUMFILES 5000

RMTTRAIL ./dirdat/et

DYNAMICRESOLUTION

TABLE      SCOTT.* ;

7.6  新增repscot程式

GGSCI> ADD REPLICAT repscot, EXTTRAIL ./dirdat/ga , EXTSEQNO 0, EXTRBA 0 , CHECKPOINTTABLE ggate.oggchkpt

7.7 啟動生產端以及災備端OGG相關程式

啟動容災端MGR程式

GGSCI>start mgr

啟動生產端dpescot程式

GGSCI> start ext dpescot

啟動災備端repscot程式

GGSCI>start repscot , at csn ****    --這裡的SCN就是恢復出來庫的那個SCN,本次實驗沒有使用SCN

到這,兩端的OGG配置完成,可以透過以下命令檢視OGG各個程式的狀態

cd /goldengate

./ggsci

GGSCI>Info all

可以做些測試,比如在生產端scott使用者下,新增或者刪除資料,以及建立或者Drop表。

刪除、增加、修改、drop、建立都試驗成功。

源端:

SQL> delete from scott.emp;

14 rows deleted.

SQL> commit;

Commit complete.

目標端:

SQL> select * from scott.emp

no rows selected

各位,到這如果能成功配置,應該對OGG有了一個初步的瞭解。至於反向的配置(在從將資料重新同步到生產端,讓生產端接管業務),需要幾個注意的幾點,思路如下:要做反向配置同步時,比如,在現在狀態是從生產端到災備端,突然生產端出現問題。這個時候,需要災備端接管業務,在使用災備端的資料庫之前,要保證先將之前資料庫相關引數修改回來,比如開啟歸檔,開啟強制日誌等等(如果需要DDL複製,需要建立DDL物件並啟動DDL全域性觸發器),接著將之前的複製關係刪除,並且災備端之前配置的抽取程式ext_scob啟動的時間要早於災備端資料庫接管業務的時間,不然OGG無法將修改的資料寫進trail檔案中。如果沒有這些trail檔案,那麼也無法直接透過OGG程式的配置完成資料同步。災備端的抽取程式啟動後,可以去配置生產端資料庫以及OGG引數。

=============================報錯=================================

2012-04-24 05:00:00  WARNING OGG-00869  No unique key is defined for table SALGRADE. All viable columns will be used to represent the key, but may not guarantee uniqueness.  KEYCOLS may be used to define the key.

GG的報錯說的很明白了,因為原表沒有主鍵或Unique Index,所以GG自動把原表所有的Column都拿來當主鍵用,但這樣會造成傳輸上的問題,因此GG在這種模式下,只能支援有限數量的Column表,所以報錯,建議對原表增加Unique Index,並推薦使用Keycols引數予以確認

源引:No unique key is defined for table BUSINESSSYSTEMSESSIONNUM5MIN. All viable columns will be used to represent the key, but may not guarantee uniqueness.  KEYCOLS may be used to define the key.

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

相關文章