天天看點

GoldenGate單向複制配置

本文中将示範下使用ogg在兩台oracle 10g資料庫伺服器間實作單向複制的配置!

一:環境介紹

db1:source端

ip位址:192.168.123.10

資料庫版本:10.2.0.1 64 bit

作業系統版本:centos 5.4 64 bit

ogg版本:fbo_ggs_Linux_x64_ora10g_64bit.tar

db2: target端

ip位址:192.168.123.20

二:準備工作,在source和target端都配置

1:配置環境變量和tnsnames.ora檔案

  1. [oracle@db1 ~]$ tail  .bash_profile   
  2. export ORACLE_SID=db1 
  3. export ORACLE_BASE=/u01/app/oracle  
  4. export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db1  
  5. export PATH=$ORACLE_HOME/bin:$PATH  
  6. export NLS_LANG=AMERICAN_AMERICA.AL32UTF8  
  7. export NLS_DATE_FORMAT='yyyy-mm-dd-hh24:mi:ss' 
  8. export EDITOR=vim 
  9. export TNS_ADMIN=$ORACLE_HOME/network/admin  
  10. export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib  
  11. export GGATE=$ORACLE_BASE/ogg  
  12. [oracle@db1 ~]$ source .bash_profile   
  13. [oracle@db1 ~]$ cat $TNS_ADMIN/tnsnames.ora  
  14. DB1 =  
  15.   (DESCRIPTION =  
  16.     (ADDRESS = (PROTOCOL = TCP)(HOST = db1)(PORT = 1521))  
  17.     (CONNECT_DATA =  
  18.       (SERVER = DEDICATED)  
  19.       (SERVICE_NAME = db1)  
  20.     )  
  21.   )  
  22. DB2 =  
  23.   (DESCRIPTION =  
  24.     (ADDRESS = (PROTOCOL = TCP)(HOST = db2)(PORT = 1521))  
  25.     (CONNECT_DATA =  
  26.       (SERVER = DEDICATED)  
  27.       (SERVICE_NAME = db2)  
  28.     )  
  29.   ) 

2:确定資料庫運作在歸檔模式,開啟資料庫附加日志,打開force logging,建立用于複制的資料庫賬号ogg,為了友善,這裡直接賦予dba權限,如果對資料庫安全要求高,可以去查詢ogg文檔,賦予複制需要的最小權限!(source和target端做相同的操作)

  1. [oracle@db1 ~]$ sqlplus /nolog  
  2. SQL> conn /as sysdba  
  3. Connected.  
  4. SQL> archive log list;  
  5. Database log mode              Archive Mode  
  6. Automatic archival             Enabled  
  7. Archive destination            USE_DB_RECOVERY_FILE_DEST  
  8. Oldest online log sequence     1  
  9. Next log sequence to archive   2  
  10. Current log sequence           2  
  11. SQL> select supplemental_log_data_min from v$database;  
  12. SUPPLEME  
  13. --------  
  14. NO  
  15. SQL> alter database add supplemental log data;         
  16. Database altered.  
  17. SQL> select supplemental_log_data_min from v$database;  
  18. SUPPLEME  
  19. --------  
  20. YES  
  21. SQL> alter database force logging;  
  22. Database altered.  
  23. SQL> create tablespace tbs_ogg;  
  24. Tablespace created.  
  25. SQL> create user ogg identified by ogg default tablespace tbs_ogg temporary tablespace temp account unlock;  
  26. User created.  
  27. SQL> grant connect,resource,dba to ogg;  
  28. Grant succeeded 

備注: 在oracle中可以通過rowid來定位某條記錄,但是目标端的資料庫和源端資料庫的資料庫可能完全不一樣,是以無法通過rowid來确定源端資料庫的邏輯變化,這時附加日志supplemental log便登上了表演的舞台。資料庫在開啟附加日志功能後,對于源端的修改操作,oracle會同時追加能夠唯一标示記錄的列到redo log。這樣目标端資料庫就可以知道源端發生了哪些具體的變化。

三:安裝ogg軟體,啟動mgr管理程序,source和target端做相同的操作

  1. [oracle@db1 ~]$ mkdir $GGATE   
  2. [oracle@db1 ~]$ cd $GGATE   
  3. [oracle@db1 ogg]$ tar -xvf /home/oracle/fbo_ggs_Linux_x64_ora10g_64bit.tar   
  4. [oracle@db1 ogg]$ ./ggsci   
  5. GGSCI (db1) 1> create subdirs  
  6. Creating subdirectories under current directory /u01/app/oracle/ogg  
  7. Parameter files                /u01/app/oracle/ogg/dirprm: already exists  
  8. Report files                   /u01/app/oracle/ogg/dirrpt: created  
  9. Checkpoint files               /u01/app/oracle/ogg/dirchk: created  
  10. Process status files           /u01/app/oracle/ogg/dirpcs: created  
  11. SQL script files               /u01/app/oracle/ogg/dirsql: created  
  12. Database definitions files     /u01/app/oracle/ogg/dirdef: created  
  13. Extract data files             /u01/app/oracle/ogg/dirdat: created  
  14. Temporary files                /u01/app/oracle/ogg/dirtmp: created  
  15. Stdout files                   /u01/app/oracle/ogg/dirout: created  
  16. GGSCI (db1) 2> edit params mgr  
  17. GGSCI (db1) 3> view params mgr  
  18. PORT 7809  
  19. GGSCI (db1) 4> start mgr  
  20. Manager started.  
  21. GGSCI (db1) 5> info mgr  
  22. Manager is running (IP port db1.7809). 

四:準備測試使用者和表

  1. SQL> conn /as sysdba  
  2. Connected.  
  3. SQL> alter user hr identified by hr account unlock;  
  4. User altered.  
  5. SQL> grant connect,resource,select_catalog_role to hr;  
  6. Grant succeeded.  
  7. SQL> conn hr/hr  
  8. Connected.  
  9. SQL> create table t1 as select * from dba_objects;  
  10. Table created.  
  11. SQL> alter table t1 add constraint pk_t1 primary key(object_id);  
  12. Table altered.  
  13. SQL> select count(*) from t1; //source端  
  14.   COUNT(*)  
  15. ----------  
  16.      50315  
  17. SQL> select count(*) from t1; //target端,隻複制表定義,不填充資料  
  18.   COUNT(*)  
  19. ----------  

 五:初始化加載資料,在異構資料庫平台(例如oracle-mysql),這個功能顯得非常的有用!而在oracle-oracle的資料複制條件下,oracle推薦使用expdp/impdp工具

1.source端添加extract程序

  1. GGSCI (db1) 1> add extract einig1,sourceistable  //sourceistable代表直接從表中讀取資料  
  2. EXTRACT added.  
  3. GGSCI (db1) 2> edit params einig1 //einig1代表extract initial load group 1縮寫  
  4. GGSCI (db1) 3> view params einig1  
  5. extract einig1  
  6. setenv (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)  
  7. userid ogg,password ogg  
  8. rmthost 192.168.123.20,mgrport 7809  
  9. rmttask replicat,group rinig1  
  10. table hr.t1; 

2.target端添加replicat程序

  1. GGSCI (db2) 1> add replicat rinig1,specialrun //specialrun代表隻運作一次  
  2. REPLICAT added.  
  3. GGSCI (db2) 2> edit params rinig1 //rinig1代表replicat initial load group 1縮寫  
  4. GGSCI (db2) 3> view params rinig1 //rinig1的名字必須同source端定義的group名字相同  
  5. replicat rinig1  
  6. setenv (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)  
  7. assumetargetdefs  
  8. userid ogg,password ogg  
  9. discardfile ./dirrpt/rinig1.dsc,purge  
  10. map hr.*,target hr.*; 

3.source端啟動extract程序,檢視日志輸出

  1. GGSCI (db1) 4> start extract einig1  
  2. Sending START request to MANAGER ...  
  3. EXTRACT EINIG1 starting 

 GGSCI (db1) 5> view report einig1

2012-06-20 09:40:55  INFO    OGG-01017  Wildcard resolution set to IMMEDIATE because SOURCEISTABLE is used.

***********************************************************************

                 Oracle GoldenGate Capture for Oracle

    Version 11.2.1.0.1 OGGCORE_11.2.1.0.1_PLATFORMS_120423.0230_FBO

   Linux, x64, 64bit (optimized), Oracle 10g on Apr 23 2012 07:44:10

Copyright (C) 1995, 2012, Oracle and/or its affiliates. All rights reserved.

                    Starting at 2012-06-20 09:40:55

Operating System Version:

Linux

Version #1 SMP Thu Sep 3 03:28:30 EDT 2009, Release 2.6.18-164.el5

Node: db1

Machine: x86_64

                         soft limit   hard limit

Address Space Size   :    unlimited    unlimited

Heap Size            :    unlimited    unlimited

File Size            :    unlimited    unlimited

CPU Time             :    unlimited    unlimited

Process id: 26185

Description:

***********************************************************************

**            Running with the following parameters                  **

2012-06-20 09:40:55  INFO    OGG-03035  Operating system character set identified as UTF-8. Locale: en_US, LC_ALL:

.

extract einig1

setenv (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)

Set environment variable (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)

userid ogg,password ***

rmthost 192.168.123.20,mgrport 7809

rmttask replicat,group rinig1

table hr.t1;

Using the following key columns for source table HR.T1: OBJECT_ID.

2012-06-20 09:40:59  INFO    OGG-01815  Virtual Memory Facilities for: COM

    anon alloc: mmap(MAP_ANON)  anon free: munmap

    file alloc: mmap(MAP_SHARED)  file free: munmap

    target directories:

    /u01/app/oracle/ogg/dirtmp.

CACHEMGR virtual memory values (may have been adjusted)

CACHESIZE:                               64G

CACHEPAGEOUTSIZE (normal):                8M

PROCESS VM AVAIL FROM OS (min):         128G

CACHESIZEMAX (strict force to disk):     96G

Database Version:

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi

PL/SQL Release 10.2.0.1.0 - Production

CORE    10.2.0.1.0      Production

TNS for Linux: Version 10.2.0.1.0 - Production

NLSRTL Version 10.2.0.1.0 - Production

Database Language and Character Set:

NLS_LANG         = "AMERICAN_AMERICA.AL32UTF8"

NLS_LANGUAGE     = "AMERICAN"

NLS_TERRITORY    = "AMERICA"

NLS_CHARACTERSET = "AL32UTF8"

Processing table HR.T1

*                   ** Run Time Statistics **                         *

Report at 2012-06-20 09:42:26 (activity since 2012-06-20 09:40:59)

Output to rinig1:

From Table HR.T1:

       #                   inserts:     50315

       #                   updates:         0

       #                   deletes:         0

       #                  discards:         0

REDO Log Statistics

  Bytes parsed                    0

  Bytes output             13168227

 4:target端驗證

  1. [oracle@db2 ogg]$ sqlplus hr/hr  
  2. SQL> select count(*) from t1;  
  3.   COUNT(*)  
  4. ----------  
  5.      50315 

六:配置db1,db2間的實時同步複制

1:在source上配置extract程序,程序的名字不能超過8個字元

  1. GGSCI (db1) 1> edit params eora_t1  
  2. GGSCI (db1) 2> view params eora_t1  
  3. extract eora_t1  
  4. setenv (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)  
  5. userid ogg,password ogg  
  6. exttrail ./dirdat/aa  
  7. table hr.*; 

  2:開啟hr使用者下所有表的附加日志 

  1. GGSCI (db1) 3> dblogin userid ogg, password ogg  
  2. Successfully logged into database.  
  3. GGSCI (db1) 4> add trandata hr.* 

3:添加extract程序,添加trail檔案,檔案名字首不能超過2個字元

  1. GGSCI (db1) 5> add extract eora_t1,tranlog,begin now  
  2. EXTRACT added.  
  3. GGSCI (db1) 6> add exttrail ./dirdat/aa,extract eora_t1,megabytes 100 //添加trail檔案  
  4. EXTTRAIL added.  
  5. GGSCI (db1) 7> start extract eora_t1  
  6. Sending START request to MANAGER ...  
  7. EXTRACT EORA_T1 starting  
  8. GGSCI (db1) 8> info extract eora_t1  
  9. EXTRACT    EORA_T1   Last Started 2012-06-20 10:06   Status RUNNING  
  10. Checkpoint Lag       00:00:00 (updated 00:00:02 ago)  
  11. Log Read Checkpoint  Oracle Redo Logs  
  12.                      2012-06-20 10:06:36  Seqno 3, RBA 21804544  
  13.                      SCN 0.562134 (562134)  
  14. GGSCI (db1) 9> info all  
  15. Program     Status      Group       Lag at Chkpt  Time Since Chkpt  
  16. MANAGER     RUNNING                                             
  17. EXTRACT     RUNNING     EORA_T1     00:08:24      00:00:05    

4:添加pump程序

  1. GGSCI (db1) 10> edit params pora_t1  
  2. GGSCI (db1) 11> view params pora_t1  
  3. extract pora_t1  
  4. setenv (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)  
  5. passthru  
  6. rmthost 192.168.123.20,mgrport 7809  
  7. rmttrail ./dirdat/pa  
  8. table hr.*;  
  9. GGSCI (db1) 12> add extract pora_t1,exttrailsource ./dirdat/aa  //這裡aa檔案名同前面extract程序參數檔案中定義的trail檔案名一  
  10. 緻  
  11. EXTRACT added.  
  12. GGSCI (db1) 13> add rmttrail ./dirdat/pa,extract pora_t1,megabytes 100 //添加傳輸到target資料庫的trail問檔案名,應該同參數文  
  13. 件中描述的一緻  
  14. RMTTRAIL added.  
  15. GGSCI (db1) 14> start extract pora_t1  
  16. Sending START request to MANAGER ...  
  17. EXTRACT PORA_T1 starting  
  18. GGSCI (db1) 15> info all  
  19. Program     Status      Group       Lag at Chkpt  Time Since Chkpt  
  20. MANAGER     RUNNING                                             
  21. EXTRACT     RUNNING     EORA_T1     00:00:00      00:00:02      
  22. EXTRACT     RUNNING     PORA_T1     00:00:00      00:00:22    

4:在target端添加檢查表,配置replicat程序

  1. GGSCI (db2) 1> edit params ./GLOBALS  
  2. GGSCI (db2) 2> view params ./GLOBALS  
  3. checkpointtable ogg.ggschkpt  
  4. GGSCI (db2) 3> exit //這裡需要退出ggsci終端  
  5. [oracle@db2 ~]$ sqlplus ogg/ogg  
  6. SQL> select tname from tab;  
  7. no rows selected  
  8. [oracle@db2 ogg]$ ggsci   
  9. GGSCI (db2) 1> dblogin userid ogg,password ogg  
  10. Successfully logged into database.  
  11. GGSCI (db2) 2> add checkpointtable  
  12. No checkpoint table specified, using GLOBALS specification (ogg.ggschkpt)...  
  13. Successfully created checkpoint table ogg.ggschkpt.  
  14. SQL> select tname from tab;  
  15. TNAME  
  16. ------------------------------  
  17. GGSCHKPT  
  18. GGSCHKPT_LOX  
  19. GGSCI (db2) 3> edit params rora_t1  
  20. GGSCI (db2) 4> view params rora_t1  
  21. replicat rora_t1  
  22. setenv (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)  
  23. userid ogg,password ogg  
  24. handlecollisions  
  25. assumetargetdefs  
  26. discardfile ./dirrpt/rora_t1.dsc,purge  
  27. map hr.* ,target hr.*;  
  28. GGSCI (db2) 5> add replicat rora_t1,exttrail ./dirdat/pa  
  29. REPLICAT added.  
  30. GGSCI (db2) 6> start replicat rora_t1  
  31. Sending START request to MANAGER ...  
  32. REPLICAT RORA_T1 starting  
  33. GGSCI (db2) 7> info replicat rora_t1  
  34. REPLICAT   RORA_T1   Last Started 2012-06-20 10:21   Status RUNNING  
  35. Checkpoint Lag       00:00:00 (updated 00:00:03 ago)  
  36. Log Read Checkpoint  File ./dirdat/t1000000  
  37.                      First Record  RBA 0  
  38. GGSCI (db2) 8> info all  
  39. Program     Status      Group       Lag at Chkpt  Time Since Chkpt  
  40. MANAGER     RUNNING                                             
  41. REPLICAT    RUNNING     RORA_T1     00:00:00      00:00:05     

備注:

在target端配置replicat程序之前,通常需要在目标端的資料庫中建立一個checkpoint表,這個表是基于ogg checkpoint檔案的,它記錄了所有ogg可恢複的checkpoint以及sequence,這個操作不是必須的,但oracle強烈建議使用它,因為它可以使得checkpoint包含在replicat的事務中,保證了可以從各類失敗場景中恢複!

七:測試同步

1:插入資料

  1. [oracle@db1 ogg]$ sqlplus hr/hr  
  2. SQL> desc t1  
  3.  Name                                      Null?    Type  
  4.  ----------------------------------------- -------- ----------------------------  
  5.  OWNER                                              VARCHAR2(30)  
  6.  OBJECT_NAME                                        VARCHAR2(128)  
  7.  SUBOBJECT_NAME                                     VARCHAR2(30)  
  8.  OBJECT_ID                                 NOT NULL NUMBER  
  9.  DATA_OBJECT_ID                                     NUMBER  
  10.  OBJECT_TYPE                                        VARCHAR2(19)  
  11.  CREATED                                            DATE  
  12.  LAST_DDL_TIME                                      DATE  
  13.  TIMESTAMP                                          VARCHAR2(19)  
  14.  STATUS                                             VARCHAR2(7)  
  15.  TEMPORARY                                          VARCHAR2(1)  
  16.  GENERATED                                          VARCHAR2(1)  
  17.  SECONDARY                                          VARCHAR2(1)  
  18. SQL> select max(object_id) from t1;  
  19. MAX(OBJECT_ID)  
  20. --------------  
  21.          52504  
  22. SQL> insert into t1 (object_id,object_name) values (52505,'ogg_test');  
  23. 1 row created.  
  24. SQL> commit;  
  25. Commit complete.  
  26. SQL> conn hr/hr@db2  
  27. Connected.  
  28. SQL> select max(object_id) from t1;  
  29. MAX(OBJECT_ID)  
  30. --------------  
  31.          52505 
  1. [root@db1 dirdat]# pwd  
  2. /u01/app/oracle/ogg/dirdat  
  3. [root@db1 dirdat]# strings aa000000   
  4. uri:db1::u01:app:oracle:ogg6  
  5. ./dirdat/aa0000007  
  6. 564200  
  7. Linux1  
  8. db12  
  9. 2.6.18-164.el53  
  10. "#1 SMP Thu Sep 3 03:28:30 EDT 20094  
  11. x86_642  
  12. DB12  
  13. db13  
  14. Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi  
  15. PL/SQL Release 10.2.0.1.0 - Production  
  16. CORE    10.2.0.1.0      Production  
  17. TNS for Linux: Version 10.2.0.1.0 - Production  
  18. NLSRTL Version 10.2.0.1.0 - Production  
  19. EORA_T11  
  20. ?Version 11.2.1.0.1 OGGCORE_11.2.1.0.1_PLATFORMS_120423.0230_FBO4  
  21. HR.T1  
  22. ogg_test  
  23. 52505  
  24. 1900-01-01:00:00:00  
  25. 1900-01-01:00:00:00  
  26. AAAM0YAAEAAAARlAAA  
  27. 5642006  
  28. 2.46.299Z  
  29. [root@db2 dirdat]# pwd  
  30. /u01/app/oracle/ogg/dirdat  
  31. [root@db2 dirdat]# strings pa000000   
  32. uri:db1::u01:app:oracle:ogg5  
  33. uri:db1::u01:app:oracle:ogg6  
  34. ./dirdat/pa0000007  
  35. Linux1  
  36. db12  
  37. 2.6.18-164.el53  
  38. "#1 SMP Thu Sep 3 03:28:30 EDT 20094  
  39. x86_642  
  40. DB12  
  41. db13  
  42. Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi  
  43. PL/SQL Release 10.2.0.1.0 - Production  
  44. CORE    10.2.0.1.0      Production  
  45. TNS for Linux: Version 10.2.0.1.0 - Production  
  46. NLSRTL Version 10.2.0.1.0 - Production  
  47. EORA_T11  
  48. ?Version 11.2.1.0.1 OGGCORE_11.2.1.0.1_PLATFORMS_120423.0230_FBO4  
  49. HR.T1  
  50. ogg_test  
  51. 52505  
  52. 1900-01-01:00:00:00  
  53. 1900-01-01:00:00:00  
  54. AAAM0YAAEAAAARlAAA  
  55. 5642006  
  56. 2.46.299Z 
  1. SQL> conn hr/hr  
  2. Connected.  
  3. SQL> delete from t1 where object_id > 1000;  
  4. 49362 rows deleted.  
  5. SQL> commit;  
  6. Commit complete  
  7. SQL> select max(object_id) from t1;  
  8. MAX(OBJECT_ID)  
  9. --------------  
  10.           1000  
  11. SQL> conn hr/hr@db2  
  12. Connected.  
  13. SQL> select max(object_id) from t1;  
  14. MAX(OBJECT_ID)  
  15. --------------  
  16.           1000