之前寫過的兩篇goldengate的操作實驗:
1: http://blog.csdn.net/bamuta/article/details/25703847
2: http://blog.csdn.net/bamuta/article/details/25704037
一.說明:
1. 本次要完成的OGG複製的特點
1) 異構平臺:linux到windows
2) 跨版本:11.2.0.1到10.2.01
3) 支持DDL
4) 同數據:oracle到oracle
5) 不同字符集
6) 不同的schema
2. 兩端環境對比
|
源端(單實例) |
目標端(單實例) |
hostname |
pera205 |
Dev_88 |
OS |
RHEL5.7_64位 |
Win2003server_64位 |
ip |
192.168.20.205 |
192.168.20.88 |
database |
11.2.0.1 |
10.2.0.1 |
ogg |
fbo_ggs_Linux_x64_ora11g_64bit.tar |
ggs_Windows_x86_ora10g_32bit.zip |
字符集 |
AL32UTF8 |
ZHS16GBK |
Schema |
Pera |
Peragg |
|
|
|
3. 關於DDL
Oracle的DDL複製本是基於數據庫全局trigger來實現,而dml是基於redo,DDL和DML的複製是相互獨立的,DDL複製和DML複製相互不影響。
配置ddl支持
grant execute on utl_file to ggs;
禁用recyclebin
運行必要的腳本:
sqlplus "/as sysdba"
@ marker_setup.SQL
@ddl_setup.SQL
@role_setup.SQL
@ ?/rdbms/admin/dbmspool
@ddl_pin
還需要在各個參數文件中加以下內容
DDL INCLUDE ALL
4. 清理過期的trail文件:
經過了半天時間在源端(./dirdat)和目標端(D:\oracle\product\ggs10\dirdat)分別都產生了2.5個G的trail文件。如果時間過得更久,產生的會更多,無疑對空間是個挑戰。
目標端修改mgr
port 7809
PURGEOLDEXTRACTSD:\oracle\product\ggs10\dirdat\rt*, USECHECKPOINTS, MINKEEPHOURS 2
源端
PURGEOLDEXTRACTS /home/oracle/app/gg11/dirdat/ex*,USECHECKPOINTS, MINKEEPHOURS 2
二.實施過程
1---3爲安裝部分,源端與目標端機器均需要相同操作。
1. 操作步驟簡介:
1) 源端:正常運行的生產庫,生產數據均在1個用戶pera下。
2) 目標端:安裝數據庫軟件,並創建相應表空間(略)
3) 兩端GoldenGate安裝配置
4) 啓動驗證程序
5) Init load:源端以flashback_scn的方法導出pera下的所有表。並在目標端導入。
6) 目標端使用aftercsn啓動replicat進程。
7) 完成ddl支持
2. 源端linux上安裝OGG
1) 配置數據庫
源端啓用歸檔:
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 295
Next log sequence to archive 298
Current log sequence 298
源端啓用supplementlog:
目標端可以不用打開
SQL> Select supplemental_log_data_minfrom V$database;
SQL> Alterdatabase add supplemental log data;
SQL> alter system switch logfile;
SQL> Select supplemental_log_data_minfrom V$database;
SUPPLEME
--------
YES
由於Oracle中每行記錄是由rowid來唯一標識的,但是邏輯複製(如goldengate,stream等)源端和目標端數據庫的數據塊的結構可能完全不一樣,Rowid無法定位。所以使用了supplement log後,就可以精準定位每一條記錄,解決了該問題。
源端啓用force log:
SQL> Select name,open_mode,force_logging,supplemental_log_data_minfrom V$database;
SQL> alter database force logging;
SQL> Select name,open_mode,force_logging,supplemental_log_data_min fromV$database;
創建管理用戶:
SQL> create tablespace ggs datafile'/home/oracle/app/oradata/pera205/ggs01.dbf' size 100m;
SQL> create user ggs identified by ggsdefault tablespace ggs;
SQL> grant dba to ggs;
grant execute on utl_file to ggs;
可以不用直接給dba僅限,給僅僅需要的權限,dba用戶會帶來安裝問題。具體參考官方文檔。
禁用recyclebin
如果啓用DDL 支持,必須關閉recyclebin。
Ifthe recyclebin is enabled, the Oracle GoldenGate DDL trigger session receivesimplicitrecycle bin DDL operations that cause the trigger to fail.
SQL> alter system set recyclebin=off scope=spfile;
2) 軟件解壓
[oracle@pera205 gg11]$ pwd
/home/oracle/app/gg11
[oracle@pera205 gg11]$ tar -xvffbo_ggs_Linux_x64_ora11g_64bit.tar
3) 環境變量:
新增:
export GG_HOME=/home/oracle/app/gg11
PATH=$GG_HOME
LD_LIBRARY_PATH=$GG_HOME:$ORACLE_HOME/lib
4) 安裝GoldenGate
[oracle@pera205 gg11]$ pwd
/home/oracle/app/gg11
[oracle@pera205 gg11]$ ggsci
GGSCI (pera205) 1>create subdirs
3. 目標端windows上安裝OGG
1) 配置數據庫
SQL> archive log list
數據庫日誌模式 非存檔模式
自動存檔 禁用
存檔終點 USE_DB_RECOVERY_FILE_DEST
最早的聯機日誌序列 2137
當前日誌序列 2139
SQL> Select name,open_mode,force_logging,supplemental_log_data_minfrom V$database;
NAME OPEN_MODE FOR SUPPLEME
--------- ---------- --- --------
PERA READ WRITE NO NO
創建管理用戶:
SQL> create tablespace ggs datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\PERA\ggs01.dbf'size 100m;
SQL> create user ggs identified by ggsdefault tablespace ggs;
SQL> grant dba to ggs;
--給golden gate數據庫用戶授予能執行ddl安裝腳本的權限。
grant execute on utl_file to ggs;
禁用recyclebin
如果啓用DDL 支持,必須關閉recyclebin。但是在目標端可以不用關閉。
SQL> alter system set recyclebin=off scope=spfile;
創建新的目標用戶
SQL> create tablespace peragg datafile
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\PERA\peragg01.dbf'size 100m;
SQL> create user peragg identified by peraggdefault tablespace peragg;
SQL> grant dba to peragg;
2) 軟件解壓
解壓到了D:\oracle\product\ggs10
3) 環境變量:
新增:
4) 安裝GoldenGate
D:\oracle\product\ggs10>ggsci.exe
系統無法執行指定的程序。
--需要安裝Visual C++ 2005 SP1 Redistributable Package(x86)
D:\oracle\product\ggs10>ggsci.exe
Oracle GoldenGate Command Interpreter forOracle
Version 11.1.1.1.2OGGCORE_11.1.1.1.2_PLATFORMS_111004.2100
Windows (optimized), Oracle 10g on Oct 5 2011 00:50:35
Copyright (C) 1995, 2011, Oracle and/or itsaffiliates. All rights reserved.
GGSCI (dev_88) 1> create subdirs
4. 配置GG
------下面兩步兩端都需要配置。
1) GLOBALS參數配置
> edit params ./globals
GGSCHEMA ggs
2) 配置mgr進程
> edit paramsmgr
port 7809
加外,爲了清理過期trail文件,源端加入:
PURGEOLDEXTRACTS /home/oracle/app/gg11/dirdat/ex*,USECHECKPOINTS, MINKEEPHOURS 2
目標端加入:
PURGEOLDEXTRACTSD:\oracle\product\ggs10\dirdat\rt*, USECHECKPOINTS, MINKEEPHOURS 2
> start mgr
> info all
3) 源端配置DDL
SQL> @marker_setup.sql;
Enter GoldenGate schema name:ggs
SQL> @ddl_setup
Enter GoldenGate schema name:ggs
Enter mode of installation:INITIALSETUP
SQL> @role_setup
Enter GoldenGate schema name:ggs
SQL> @ddl_enable
Trigger altered.
SQL> @marker_status.sql
Please enter the name of a schema for theGoldenGate database objects:ggs
SQL> @?/rdbms/admin/dbmspool.sql;
SQL> @ddl_pin.sql
Enter value for 1: ggs
4) 源端 add trandata
源端創建驗證表。
SQL> conn pera/pera
SQL> create table check_test
(id number,
name varchar2(30));
GGSCI (pera205) 13> dblogin userid ggs,password ggs
Successfully logged into database.
GGSCI (pera205) 14> add trandata pera.*
這一步時,部分表遇到以下問題:這個問題是缺少主鍵,可以忽略。
2014-05-09 17:07:19 WARNING OGG-00869 No unique key is defined for tableERM_USER_MAJOR. All viable columns will be used to represent the key, but maynot guarantee uniqueness. KEYCOLS may beused to define the key.
???
--下面報錯針對一張臨時表,忽略即可。
2014-07-2316:32:28 WARNING OGG-00706 Failed to add supplemental log group on tablePERA.RDM_MONITOR_STATISTICS_TEMP due to ORA-14450: attempt to access atransactional temp table already in use, SQL ALTER TABLE"PERA"."RDM_MONITOR_STATISTICS_TEMP" ADD SUPPLEMENTAL LOGGROUP "GGS_RDM_MONITOR_STA_144259"("TASK_ID","GROUP_ID","GROUP_NAME","GROUP_PATH","MODEL_ID","FINISHED_WB_COUNT","ALL_WB_COUNT",".
----如果一張表,其列的數量超過33列(含),且沒有primary key的話,則在執行add trandata命令時,會報OGG-01387錯誤,這個錯誤需要手工修復:
2014-07-2316:32:35 WARNING OGG-01387 Table PERA.RDM_PERMISSION_DATA has no validkey columns, added unconditional supplemental log group for all table columns.
以下SQL可以檢查哪些表的supplement log失敗。
select owner,table_name
from all_tables
where owner in ('PERA')
and table_name not in (select distinct table_name
from dba_log_group_columns
where owner in ('PERA'));
需要手動如下操作
alter table RDM_PERMISSION_DATA add supplemental log group ggs_pera_1(col1,col2,...,col33) always;
alter table RDM_PERMISSION_DATA add supplemental log group ggs_pera_2(col34,col35...,col40) always;
5) 源端 extract 進程文件
GGSCI (pera205) 6> edit params ex1
EXTRACT ex1
SETENV (NLS_LANG = AMERICAN_AMERICA.AL32UTF8)
USERID ggs, password ggs
EXTTRAIL ./dirdat/ex
DDL INCLUDE ALL
TABLE pera.*;
GGSCI (pera205) 3> view params ex1
GGSCI (pera205) 4> add extract ex1,tranlog, begin now
EXTRACT added.
GGSCI (pera205) 5> add exttrail./dirdat/ex, extract ex1
EXTTRAIL added.
6) 源端pump 進程
GGSCI (pera205) 13> edit params dp1
EXTRACT dp1
USERID ggs,PASSWORD ggs
RMTHOST 192.168.20.88, MGRPORT 7809
RMTTRAIL D:\oracle\product\ggs10\dirdat\rt
DDL INCLUDE ALL
TABLE pera.*;
--DDL的其他寫法
ddl include mapped objname pera.*;
DDL INCLUDE MAPPED
--最好別用ALL,ALL會傳遞過多的DDL信息,導致replication的時候容易失敗。
增加源端extract目錄
GGSCI (pera205) 7> add extract dp1exttrailsource ./dirdat/ex
EXTRACT added.
增加目錄端trail文件位置
GGSCI (pera205) 8> add rmttrail D:\oracle\product\ggs10\dirdat\rt,extract dp1
RMTTRAIL added.
7) 目標端 CHECKPOINT TABLE
GGSCI (DEV_88) 9> edit params ./GLOBALS
GGSCHEMA ggs
CHECKPOINTTABLE ggs.ggs_checkpoint
[oracle@DEV_88 gg11]$ ggsci
GGSCI (DEV_88) 1> dblogin userid ggs,password ggs
GGSCI (DEV_88) 4> add checkpointtable
SQL> conn ggs/ggs
Connected.
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ -----------------
GGS_CHECKPOINT TABLE
8) 目標端 REPLICAT進程
GGSCI (DEV_88) 7> edit params rt1
REPLICAT RT1
SETENV (NLS_LANG = AMERICAN_AMERICA.AL32UTF8)
ALLOWNOOPUPDATES
USERID ggs,PASSWORD ggs
ASSUMETARGETDEFS
DISCARDFILE ./discards.dsc, PURGE
DDL INCLUDE MAPPED
MAP pera.*, TARGET peragg.*;
GGSCI (dev_88) 4> add replicat rt1,exttrail D:\oracle\product\ggs10\dirdat\rt, checkpointtable ggs.ggs_checkpoint
REPLICAT added.
9) 源端創建驗證程序:
啓動驗證程序
declare
begin
for i in 1..100000 loop
insert into check_test values(i,'tan');
commit;
dbms_lock.sleep(1);
end loop;
end;
/
SQL> select * from check_test;
GGSCI (pera205) 7> info all
Program Status Group Lag Time Since Chkpt
MANAGER RUNNING
EXTRACT STOPPED DP1 00:00:00 02:00:09
EXTRACT STOPPED EX1 00:00:00 02:02:02
GGSCI (DEV_88) 11> info all
Program Status Group Lag Time Since Chkpt
MANAGER RUNNING
REPLICAT STOPPED RT1 00:00:00 00:20:40
1. 同步數據
1) 源端啓動extract,pump進程
GGSCI (pera205) 8> start ex1
GGSCI (pera205) 14> start dp1
GGSCI (pera205) 15> info all
Program Status Group Lag Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING DP1 00:00:00 02:03:02
EXTRACT RUNNING EX1 00:00:00 00:00:03
此時先不用啓動目標端的replicat進程。
2) 使用exp/imp完成init load
用帶FLASHBACK_SCN 的expdp/impdp初始化
SQL> select current_scn from V$database;
CURRENT_SCN
-----------
588375128
exp system/oracle@pera205file=pera.20140724.dmp log=gg.log owner=pera flashback_scn= 588375128 compress=n buffer=40960000
imp system/oracle file=pera.20140724.dmplog=imp.log fromuser=pera touser=peragg
3) 用SCN 啓動Replicat
GGSCI (DEV_88) 28> start rt1, aftercsn 588375128
Sending START request to MANAGER ...
REPLICAT RT1 starting
GGSCI (DEV_88) 29> info all
Program Status Group Lag Time Since Chkpt
MANAGER RUNNING
REPLICAT RUNNING RT1 00:00:00 00:00:04
2. 驗證:
DML驗證 通過
測試了數據傳遞、都能通過。(是通過前面創建的表check_test驗證的,驗證完後刪除)
DDL驗證 通過
對錶測試了create 、alter 、truncate、drop,都能正確傳遞到目標端。
字符集驗證通過
操作過程:源端插入漢字,查看字符編碼,在同步到目標端後,在目標端查看字符編碼再查看字符編碼。
源端驗證:
SQL> select dump('譚',1016) fromdual;
Typ=96 Len=3 CharacterSet=AL32UTF8:e8,b0,ad
SQL> select xid, dump(xname,1016) dumpfrom checks;
Typ=1 Len=3 CharacterSet=AL32UTF8: e8,b0,ad
目標庫字符正確的編碼
SQL> select dump('譚',1016) from dual;
DUMP('譚',1016)
-----------------------------------------
Typ=96 Len=2 CharacterSet=ZHS16GBK: cc,b7
目標庫驗證傳輸過來的漢字:
select xid, dump(xname,1016) dump fromchecks;
Typ=1 Len=2 CharacterSet=ZHS16GBK: cc,b7