Sample drop user ogg_maclean cascade; create user ogg_maclean identified by oracle; alter user ogg_maclean default tablespace users; grant connect,resource to OGG_MACLEAN; OGG_MACLEAN maclean_press conn ogg_maclean/oracle create table maclean_press1(a int constraint key1 primary key,b varchar2(100),c varchar2(100),d date default sysdate,e date); create table maclean_press2(a int constraint key2 primary key,b varchar2(100),c varchar2(100),d date default sysdate,e date); create table maclean_press3(a int constraint key3 primary key,b varchar2(100),c varchar2(100),d date default sysdate,e date); create table maclean_press4(a int constraint key4 primary key,b varchar2(100),c varchar2(100),d date default sysdate,e date); create table maclean_press5(a int constraint key5 primary key,b varchar2(100),c varchar2(100),d date default sysdate,e date); create table maclean_press6(a int constraint key6 primary key,b varchar2(100),c varchar2(100),d date default sysdate,e date); create table maclean_press7(a int constraint key7 primary key,b varchar2(100),c varchar2(100),d date default sysdate,e date); create table maclean_press8(a int constraint key8 primary key,b varchar2(100),c varchar2(100),d date default sysdate,e date); create table maclean_press9(a int constraint key9 primary key,b varchar2(100),c varchar2(100),d date default sysdate,e date); create table maclean_press10(a int constraint key10 primary key,b varchar2(100),c varchar2(100),d date default sysdate,e date); create or replace procedure trouble_ogg_sql as begin for i in 1..2000000 loop insert into maclean_press1(a,b,c,d) values(i,i,i,sysdate); insert into maclean_press2(a,b,c,d) values(i,i,i,sysdate); insert into maclean_press3(a,b,c,d) values(i,i,i,sysdate); insert into maclean_press4(a,b,c,d) values(i,i,i,sysdate); insert into maclean_press5(a,b,c,d) values(i,i,i,sysdate); insert into maclean_press6(a,b,c,d) values(i,i,i,sysdate); insert into maclean_press7(a,b,c,d) values(i,i,i,sysdate); insert into maclean_press8(a,b,c,d) values(i,i,i,sysdate); insert into maclean_press9(a,b,c,d) values(i,i,i,sysdate); insert into maclean_press10(a,b,c,d) values(i,i,i,sysdate); if mod(i,2000)=0 then commit; end if; end loop; delete from maclean_press1 where a <= 10000; commit; EXECUTE IMMEDIATE('alter table maclean_press1 move'); EXECUTE IMMEDIATE('alter index key1 rebuild'); delete from maclean_press2 where a <= 10000; commit; EXECUTE IMMEDIATE('alter table maclean_press2 move'); EXECUTE IMMEDIATE('alter index key2 rebuild'); delete from maclean_press3 where a <= 10000; commit; EXECUTE IMMEDIATE('alter table maclean_press3 move'); EXECUTE IMMEDIATE('alter index key3 rebuild'); delete from maclean_press4 where a <= 10000; commit; EXECUTE IMMEDIATE('alter table maclean_press4 move'); EXECUTE IMMEDIATE('alter index key4 rebuild'); delete from maclean_press5 where a <= 10000; commit; EXECUTE IMMEDIATE('alter table maclean_press5 move'); EXECUTE IMMEDIATE('alter index key5 rebuild'); delete from maclean_press6 where a <= 10000; commit; EXECUTE IMMEDIATE('alter table maclean_press6 move'); EXECUTE IMMEDIATE('alter index key6 rebuild'); delete from maclean_press7 where a <= 10000; commit; EXECUTE IMMEDIATE('alter table maclean_press7 move'); EXECUTE IMMEDIATE('alter index key7 rebuild'); delete from maclean_press8 where a <= 10000; commit; EXECUTE IMMEDIATE('alter table maclean_press8 move'); EXECUTE IMMEDIATE('alter index key8 rebuild'); delete from maclean_press9 where a <= 10000; commit; EXECUTE IMMEDIATE('alter table maclean_press9 move'); EXECUTE IMMEDIATE('alter index key9 rebuild'); delete from maclean_press10 where a <= 10000; commit; EXECUTE IMMEDIATE('alter table maclean_press10 move'); EXECUTE IMMEDIATE('alter index key10 rebuild'); for i in 1..1 loop update maclean_press1 set b=b+1 where a <= 20000; commit; update maclean_press2 set b=b+1 where a <= 20000; commit; update maclean_press3 set b=b+1 where a <= 20000; commit; update maclean_press4 set b=b+1 where a <= 20000; commit; update maclean_press5 set b=b+1 where a <= 20000; commit; update maclean_press6 set b=b+1 where a <= 20000; commit; update maclean_press7 set b=b+1 where a <= 20000; commit; update maclean_press8 set b=b+1 where a <= 20000; commit; update maclean_press9 set b=b+1 where a <= 20000; commit; update maclean_press10 set b=b+1 where a <= 20000; commit; end loop; for i in 1..1 loop delete from maclean_press1 where a > 30000 and a <= 40000; commit; delete from maclean_press2 where a > 30000 and a <= 40000; commit; delete from maclean_press3 where a > 30000 and a <= 40000; commit; delete from maclean_press4 where a > 30000 and a <= 40000; commit; delete from maclean_press5 where a > 30000 and a <= 40000; commit; delete from maclean_press6 where a > 30000 and a <= 40000; commit; delete from maclean_press7 where a > 30000 and a <= 40000; commit; delete from maclean_press8 where a > 30000 and a <= 40000; commit; delete from maclean_press9 where a > 30000 and a <= 40000; commit; delete from maclean_press10 where a > 30000 and a <= 40000; commit; end loop; end; / exec ogg_maclean.trouble_ogg_sql; select count(*),sum(a),sum(b) from maclean_press1; select count(*),sum(a),sum(b) from maclean_press2; select count(*),sum(a),sum(b) from maclean_press3; select count(*),sum(a),sum(b) from maclean_press4; select count(*),sum(a),sum(b) from maclean_press5; select count(*),sum(a),sum(b) from maclean_press6; select count(*),sum(a),sum(b) from maclean_press7; select count(*),sum(a),sum(b) from maclean_press8; select count(*),sum(a),sum(b) from maclean_press9; select count(*),sum(a),sum(b) from maclean_press10; 主键更新测试(针对Quest) create table tb1a (id number primary key, name varchar(30)); 执行以下sql进行主键更新: Begin for i in 1..1000 loop insert into tb1a values (i, 'aaa'); end loop; commit; update tb1a set id=id+100; commit; end; / select min(id),max(id),sum(id) from tb1a; 分区表 create table maclean_partition (acct_no number(12),person varchar2(30),week_no number(2)) partition by range (week_no) (partition jan values less than(4),partition feb values less than(8),partition others values less than (maxvalue)) enable row movement; insert into maclean_partition values(1,'a',2); insert into maclean_partition values(2,'b',6); insert into maclean_partition values(3,'c',10); insert into maclean_partition values(6,'d',6); insert into maclean_partition values(8,'e',8); insert into maclean_partition values(9,'e',9); commit; update maclean_partition set person='d' where acct_no=2; commit; delete maclean_partition where acct_no=1; commit; ========================================================================================================== ASM 的 tnsnames.ora 以及配置监听静态注册 =========================================================================================================== 解压软件,配置ogg.sh export GG_HOME=/goldengate export LD_LIBRARY_PATH=$ORACLE_HOME/lib GGSCI> create subdirs 打开归档 Select log_mode from v$database; shutdown immediate; startup mount; alter database archivelog; alter database open; 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; 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 force logging; 创建ogg 用户 --create tablespace create tablespace goldengate datafile size 1024M ; -- Create the user create user goldengate identified by &A default tablespace goldengate; -- Grant role privileges grant resource, connect, dba to goldengate; grant create any table to goldengate; grant create any view to goldengate; grant create any procedure to goldengate; grant create any sequence to goldengate; grant create any index to goldengate; grant create any trigger to goldengate; grant create any view to goldengate; =========================================================================================================== [oracle@vrh1 ~]$ cat ogg.sh export ORACLE_HOME=/s01/orabase/product/11.2.0/dbhome_1 export ORACLE_SID=VRAC1 export LD_LIBRARY_PATH=/ogg:$ORACLE_HOME/lib:$ORACLE_HOME/lib32 export PATH=/home/oracle/ogg:$PATH cd /home/oracle/ogg ggsci =========================================================================================================== ./GLOBALS GGSCHEMA goldengate CheckpointTable goldengate.ckpt UnlockedTrailFiles =========================================================================================================== MGR Port 7809 userid goldengate , password oracle DYNAMICPORTLIST 9101-9356 CheckMinutes 10 PurgeOldExtracts ./dirdat/*, UseCheckpoints, MinKeepHours 96 PurgeMarkerHistory MinKeepDays 3, MaxKeepDays 7, FrequencyMinutes 120 AutoRestart ER *, WaitMinutes 5, Retries 3 LagInfoMinutes 0 LagReportMinutes 10 =========================================================================================================== 源端DDL cd ogg GRANT EXECUTE ON UTL_FILE TO goldengate; ALTER SYSTEM SET RECYCLEBIN =OFF SCOPE =BOTH; 11g中 只能ALTER SYSTEM SET RECYCLEBIN =OFF SCOPE =SPFILE; 之后重启 @marker_setup.sql @ddl_setup.sql @role_setup.sql GRANT GGS_GGSUSER_ROLE TO goldengate; @ddl_enable.sql @ddl_pin.sql goldengate @sequence.sql dblogin userid goldengate , password oracle add checkpointtable goldengate.ckpt ADD TRANDATA XX.XX =========================================================================================================== add extract ext01, tranlog , begin now , threads 2 add exttrail ./dirdat/ml , extract ext01 , megabytes 200 extract ext01 SETENV (ORACLE_HOME="/s01/orabase/product/11.2.0/dbhome_1" ) SETENV (ORACLE_SID="VRAC1") SETENV (NLS_LANG = "AMERICAN_AMERICA.AL32UTF8") --TRANLOGOPTIONS EXCLUDEUSER <Replicat username> --CacheMgr CacheDirectory ./dirtmp 51980MB, CacheDirectory ./dirtmp/goldengate_tmp userid goldengate , password oracle --TranLogOptions ExcludeUser goldengate --TranLogOptions AltArchivedLogFormat Instance NETDB1 %t_%s_%r.dbf --TranLogOptions AltArchivedLogFormat Instance NETDB2 %t_%s_%r.dbf --TranLogOptions AltArchiveLogDest Primary Instance NETDB1 /arch1, AltArchiveLogDest Instance NETDB2 /arch2 tranlogoptions asmuser sys@ASM , ASMPASSWORD oracle --TRANLOGOPTIONS DBLOGREADER, DBLOGREADER BUFSIZE [x], BUFSIZE [y] ThreadOptions MaxCommitPropagationDelay 10000 IOLatency 3000 exttrail ./dirdat/ml DDL Include ALL --DDL INCLUDE ALL, EXCLUDE OBJNAME "<schema name>.<object name> " DDLOptions AddTranData, Report DDLOptions NoCrossRename, Report Table ogg_maclean.*; -- Prevent data looping. This is generally used in bi-directional -- configuration TRANLOGOPTIONS EXCLUDEUSER <Replicat username> =========================================================================================================== add extract pump01, EXTTRAILSOURCE ./dirdat/ml add rmttrail ./dirdat/ml , extract pump01, megabytes 200 pump extract pump01 SETENV (ORACLE_HOME = "<Oracle home path>" ) SETENV (ORACLE_SID="<Oracle sid>") passthru rmthost 192.168.1.179 , mgrport 7809 rmttrail ./dirdat/ml --DISCARDFILE <diacard file path/<discard file name.dsc>, APPEND Megabytes <n> table ogg_maclean.*; =========================================================================================================== add replicat rep01, exttrail ./dirdat/ml replicat replicat rep01 SETENV (ORACLE_HOME = "/s01/oracle/app/oracle/product/11.2.0/dbhome_1" ) SETENV (ORACLE_SID="PRODA") SETENV (NLS_LANG ="American_America.AL32UTF8") userid goldengate , password oracle --HandleCollisions AssumeTargetDefs DiscardFile ./dirrpt/rep1.dsc, APPEND Megabytes 800 , Purge DBOptions DeferrefConst DBOptions SuppressTriggers MaxTransOps 10000 GroupTransOps 1000 SQLEXEC "ALTER SESSION SET COMMIT_WRITE = BATCH,NOWAIT" BatchSQL --DDL INCLUDE ALL, EXCLUDE OBJNAME "<schema name>.<object name> " DDLOptions Report DDLError 24344 Ignore DDLError 4052 Ignore DDLError 955 Ignore DDLError 1408 Ignore DDLError 911 Ignore AllowNoOpUpdates CheckSequenceValue --IGNORETRUNCATES --DEFERAPPLYINTERVAL 1 MINUTES -- Sequence testgg.*, Target testgg.* MapExclude ogg_maclean.SYS_EXPORT_SCHEMA* ; map ogg_maclean.* , target ogg_maclean.* ; --DDLOPTIONS SUPPRESSTRIGGERS --The SUPPRESSTRIGGERS parameter prevents triggers from firing on target objects that are configured for replication with Oracle GoldenGate. This alleviates the need to manually disable triggers and constraints. To use this option, the Replicat user must be an Oracle Streams administrator which can be granted by invoking dbms_goldengate_auth.grant_admin_privilege. Available FROM ORACLE 10.2.0.5 AND Later Patches and Oracle 11.2.0.2 ================================================================================================ DROP TABLE gg_test; CREATE TABLE gg_test ( a number(10), b VARCHAR20(30), PRIMARY KEY (a) ); 4.8 100字段表测试脚本 create table table_100cols ( a1 number(10) not null, a2 number(10), a3 number(10), a4 number(10), a5 number(10), a6 number(10), a7 number(10), a8 number(10), a9 number(10), a10 number(10), a11 number(10), a12 number(10), a13 number(10), a14 number(10), a15 number(10), a16 number(10), a17 number(10), a18 number(10), a19 number(10), a20 number(10), a21 number(10), a22 number(10), a23 number(10), a24 number(10), a25 number(10), a26 number(10), a27 number(10), a28 number(10), a29 number(10), a30 number(10), a31 number(10), a32 number(10), a33 number(10), a34 number(10), a35 number(10), a36 number(10), a37 number(10), a38 number(10), a39 number(10), a40 number(10), a41 number(10), a42 number(10), a43 number(10), a44 number(10), a45 number(10), a46 number(10), a47 number(10), a48 number(10), a49 number(10), a50 number(10), a51 number(10), a52 number(10), a53 number(10), a54 number(10), a55 number(10), a56 number(10), a57 number(10), a58 number(10), a59 number(10), a60 number(10), a61 number(10), a62 number(10), a63 number(10), a64 number(10), a65 number(10), a66 number(10), a67 number(10), a68 number(10), a69 number(10), a70 number(10), a71 number(10), a72 number(10), a73 number(10), a74 number(10), a75 number(10), a76 number(10), a77 number(10), a78 number(10), a79 number(10), a80 number(10), a81 number(10), a82 number(10), a83 number(10), a84 number(10), a85 number(10), a86 number(10), a87 number(10), a88 number(10), a89 number(10), a90 number(10), a91 number(10), a92 number(10), a93 number(10), a94 number(10), a95 number(10), a96 number(10), a97 number(10), a98 number(10), a99 number(10), a100 number(10) ) alter table table_100cols add constraint PK_100cols primary key (a1) using index tablespace CS_stat pctfree 10 initrans 2 maxtrans 255 storage ( initial 64K minextents 1 maxextents unlimited ); alter table table_100cols add constraint PK_100cols primary key (a1) using index tablespace users pctfree 10 initrans 2 maxtrans 255 storage ( initial 64K minextents 1 maxextents unlimited ); insert into table_100cols values(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100); 4.9 性能测试脚本 create sequence seq_gg start with 1 INCREMENT BY 1 MAXVALUE 999999999 cache 500000; create or replace procedure gg_insert is begin for i in 1..1000000 loop insert into CM_USER (USER_ID,REGION_CODE,ACC_ID,CAUT_ID,USER_STATUS,USER_TYPE) values(seq_gg.nextval,571,1111,2222,3,4); if mod(i,1000)=0 then commit; end if; end loop; commit; end; / create or replace procedure gg_update is CURSOR c_gg IS SELECT rowid FROM CM_USER; v_rowid UROWID; i number(10); BEGIN OPEN c_gg; for i in 1..1000000 loop FETCH c_gg INTO v_rowid; EXIT WHEN c_gg%NOTFOUND; UPDATE CM_USER SET ACC_ID=seq_gg.nextval WHERE rowid = v_rowid; if mod(i,1000)=0 then commit; end if; end loop; commit; CLOSE c_gg; END; / create or replace procedure gg_delete is begin for i in 1..1000 loop delete from CM_USER where rownum<1001; commit; end loop; commit; end; /
attachment:
Oracle GoldenGate 在其新推出的版本11.2 中提供了全方位的多字节支持,
可实现对表名/列名,以及DDL 中常见多字节文字如中文的支持。
注意:不同字符集DML 复制必须要将目标的NLS_LANG 变量设置为源端的NLS_LANG 实际值。
实验证明,本版本可以支持相同和不同字符集之间带有多字节对象以及数据的DML 和DDL 复制。
新版本的 DDL 复制默认不再开启 addtrandata,需要手工配置ddloptions。Oracle 11.2.0.2以上版本则推荐使用schema level 附加日志,参考步骤:
改用schemal level trandata:
SQL> exec dbms_streams_auth.grant_admin_privilege(‘ogg’);
GGSCI (dbsrv64.localdomain) 2> dblogin userid ogg
GGSCI (dbsrv64.localdomain) 3> ADD SCHEMATRANDATA source
2012-02-23 03:26:04 INFO OGG-01788 SCHEMATRANDATA has
been added on schema source.
注意:目前似乎不支持在 map 或者 table 里面使用中文进行匹配,
需要进一步验证。例如下面的将全部被认为是unmapped:
map source.中文*, target target.*;
如果两端字符集不同,则需要将目标的 NLS_LANG 变量设置为源
端的NLS_LANG实际值,可参考之前的最佳实践。
使用defgen 可以指定生成的表定义文件编码,不过实际配置要注意环境变量与数据库环境变量的统一,例如中文环境参考如下:
NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
LANG=zh_CN.GBK
Oracle GoldenGate 在其新推出的版本11.2 中提供了两种模式抽取:
1 传统的挖掘日志模式;
2 新的整合捕获模式。该模式使用了Oracle XStream 接口进行数据捕捉。
schema level trandata 必须要Oracle 11.2.0.2 以上;
整合模式只有在11.2.0.3 以上才能支持更为广泛的数据类型。
1) 数据库打开最小附加日志;
alter database add supplemental log data;
2) 为source schema 加入schema level 附加日志:
SQL> exec dbms_streams_auth.grant_admin_privilege(‘ogg’);
GGSCI (dbsrv64.localdomain) 2> dblogin userid ogg
GGSCI (dbsrv64.localdomain) 3> ADD SCHEMATRANDATA source
2012-02-23 03:26:04 INFO OGG-01788 SCHEMATRANDATA has been
added on schema source.
3) 给抽取进程用户赋予admin 权限:
begin
DBMS_GOLDENGATE_AUTH.GRANT_ADMIN_PRIVILEGE(
grantee => ‘source’,
privilege_type => ‘capture’,
grant_select_privileges => true,
do_grants => TRUE
);
end;
/
4) 在数据库中注册抽取进程,此时会自动配置XStream:
DBLOGIN USERID source, PASSWORD oracle
REGISTER EXTRACT ext01 DATABASE
5) 配置OGG 的extract 和replicat 进程
ADD EXTRACT ext01, INTEGRATED TRANLOG, BEGIN NOW
Add exttrail ./dirdat/ml, ext ext01
Add rep rep01, exttrail ./dirdat/ia
GGSCI (dbsrv64.localdomain) 5> view param ext01
EXTRACT ext01
SETENV (ORACLE_SID = “oragbk”)
–SETENV (NLS_LANG = “AMERICAN_AMERICA.ZHS16GBK”)
SETENV (NLS_LANG = “SIMPLIFIED CHINESE_CHINA.ZHS16GBK”)
USERID source, PASSWORD oracle
ddl include all
–ddloptions addtrandata,report
ddloptions report
tranlogoptions dblogreader
EXTTRAIL ./dirdat/ml
dynamicresolution
tableexclude source.AQ*;
tableexclude source.OGG*;
tableexclude source.SYS*;
table source.*;
GGSCI (dbsrv64.localdomain) 6> view param rep01
replicat rep01
–checkparams
–SETENV (ORACLE_SID = “oragbk”)
SETENV (ORACLE_SID = “orautf”)
SETENV (NLS_LANG = “SIMPLIFIED CHINESE_CHINA.ZHS16GBK”)
–SETENV (NLS_LANG = “AMERICAN_AMERICA.AL32UTF8”)
userid target, password oracle
ddl include mapped
ddlerror 24344,ignore
ddlerror 955,ignore
–DDLOPTIONS REPORT
reperror default,discard
–reperror default, abend
discardfile ./dirrpt/repia.dsc,append
assumetargetdefs
map source.*, target target.*;
6) 确认进程启动后,在源端添加中文表,并增加和更新记录,成功。
注意:
使用整合模式会在extract 用户下建立一些AQ$/SYS/OGG$开头的表,建议使用一个专门用户。本例子中直接抽取了source 自己的表,需要将这些系统表排除掉
GGSCI (mlab2.oracle.com) 2> ADD SCHEMATRANDATA ogg_maclean
2013-11-24 00:42:48 ERROR OGG-01790 Failed to ADD SCHEMATRANDATA on schema ogg_maclean because of the following SQL error: ORA-26947: Oracle GoldenGate replication is not enabled.
ORA-06512: at “SYS.DBMS_CAPTURE_ADM_INTERNAL”, line 1565
ORA-06512: at “SYS.DBMS_CAPTURE_ADM_INTERNAL”, line 1074
ORA-06512: at “SYS.DBMS_CAPTURE_ADM”, line 722
ORA-06512: at line 1 SQL BEGIN sys.dbms_capture_adm.PREPARE_SCHEMA_INSTANTIATION(‘ogg_maclean’,’ALLKEYS_ON’); END;.
GGSCI (mlab2.oracle.com) 3> ADD SCHEMATRANDATA goldengate;
2013-11-24 00:43:29 ERROR OGG-01796 Schema: goldengate;, does not exist.
GGSCI (mlab2.oracle.com) 4> ADD SCHEMATRANDATA goldengate
2013-11-24 00:43:38 ERROR OGG-01790 Failed to ADD SCHEMATRANDATA on schema goldengate because of the following SQL error: ORA-26947: Oracle GoldenGate replication is not enabled.
ORA-06512: at “SYS.DBMS_CAPTURE_ADM_INTERNAL”, line 1565
ORA-06512: at “SYS.DBMS_CAPTURE_ADM_INTERNAL”, line 1074
ORA-06512: at “SYS.DBMS_CAPTURE_ADM”, line 722
ORA-06512: at line 1 SQL BEGIN sys.dbms_capture_adm.PREPARE_SCHEMA_INSTANTIATION(‘goldengate’,’ALLKEYS_ON’); END;.
11.2.0.4中需要设置
SQL> alter system set enable_goldengate_replication=true;
System altered.
WARNING OGG-02051 Not enough database memory to service Extract in integrated capture.
==>Streams: resolve low memory condition+LogMiner reader: buffer+LogMiner builder: memory=> Streams Pool Size 不足 增大streams_pool_size即可
source: HP-IA 192.168.174.201/202 root/roothp sys/sys or oracle target: Linux 192.168.110.200/116.180 root/roothp 安装目录:/app/ogg/va 复制表: unipostdb. T_PUB_JNL_SAV T_PUB_UNREG T_CDM_LEDGER TMP_CARD_LEDGER TABLE TMP_LEDGER TABLE TRIG_CDM_LEDGER TABLE T_CARD_ACC TABLE T_CARD_ATM TABLE T_CARD_LEDGER TABLE T_CDM_LEDGER TABLE T_PUB_JNL_SAV TABLE T_PUB_UNREG TABLE UNIPOSTDB_TEST TABLE UNREG_BAK TABLE conn unipostdb/unipostdb select count(*) from unipostdb.T_PUB_JNL_SAV; select count(*) from unipostdb.T_PUB_UNREG; select count(*) from unipostdb.T_CDM_LEDGER; truncate table unipostdb.T_PUB_JNL_SAV; truncate table unipostdb.T_PUB_UNREG; alter extga, begin now alter extgb, begin now alter extgc, begin now alter extgd, begin now Set pages 999 Set long 4000 Select dbms_metadata.get_ddl('TABLE', 'T_PUB_JNL_SAV', 'UNIPOSTDB') from dual; Select dbms_metadata.get_ddl('TABLE', 'T_PUB_UNREG', 'UNIPOSTDB') from dual; Select dbms_metadata.get_ddl('TABLE', 'T_CDM_LEDGER', 'UNIPOSTDB') from dual; ,CLT_SEQNO col table_name for a20 col constraint_name for a20 col column_name for a20 select cols.table_name,cols.constraint_name,cols.column_name from user_cons_columns cols, user_constraints cons where cons.table_name = 'T_PUB_UNREG' and cols.constraint_name=cons.constraint_name; GLOBALS: CHECKPOINTTABLE ogg.chkpt GGSCHEMA ogg ogg source: add checkpointtab add ext extga, tranlog, begin now, threads 2 add rmttrail ./dirdat/ra, ext extga, megabytes 100 add ext extgb, tranlog, begin now, threads 2 add rmttrail ./dirdat/rb, ext extgb, megabytes 100 add ext extgc, tranlog, begin now, threads 2 add rmttrail ./dirdat/rc, ext extgc, megabytes 100 EXTRACT extga USERID ogg, PASSWORD ogg rmthost 192.168.110.200, mgrport 7809 rmttrail ./dirdat/ra TRANLOGOPTIONS DBLOGREADER TRANLOGOPTIONS BUFSIZE 10000000, DBLOGREADERBUFSIZE 4194304 REPORTCOUNT EVERY 2 MINUTES, RATE --dynamicresolution --GETTRUNCATES table unipostdb.T_PUB_JNL_SAV; EXTRACT extgb USERID ogg, PASSWORD ogg rmthost 192.168.110.200, mgrport 7809 rmttrail ./dirdat/rb TRANLOGOPTIONS DBLOGREADER TRANLOGOPTIONS BUFSIZE 10000000, DBLOGREADERBUFSIZE 4194304 REPORTCOUNT EVERY 2 MINUTES, RATE --dynamicresolution --GETTRUNCATES table unipostdb.T_PUB_UNREG; EXTRACT extgc USERID ogg, PASSWORD ogg TRANLOGOPTIONS DBLOGREADER TRANLOGOPTIONS BUFSIZE 10000000, DBLOGREADERBUFSIZE 4194304 rmthost 192.168.110.200, mgrport 7809 rmttrail ./dirdat/rc REPORTCOUNT EVERY 2 MINUTES, RATE --dynamicresolution --GETTRUNCATES table unipostdb.T_CDM_LEDGER; ogg target: ----------------------------------------------------- add rep repaa, exttrail ./dirdat/ra replicat repaa userid ogg, password ogg reperror default, abend discardfile ./dirrpt/repaa.dsc,append, megabytes 10 REPORTCOUNT EVERY 2 MINUTES, RATE GROUPTRANSOPS 2000 BATCHSQL assumetargetdefs --allownoopupdates --dynamicresolution map unipostdb.T_PUB_JNL_SAV, target unipostdb.T_PUB_JNL_SAV, FILTER ( @RANGE (1, 3) ); add rep repab, exttrail ./dirdat/ra replicat repab userid ogg, password ogg reperror default, abend discardfile ./dirrpt/repab.dsc,append, megabytes 10 REPORTCOUNT EVERY 2 MINUTES, RATE GROUPTRANSOPS 2000 BATCHSQL assumetargetdefs --allownoopupdates --dynamicresolution map unipostdb.T_PUB_JNL_SAV, target unipostdb.T_PUB_JNL_SAV, FILTER ( @RANGE (2, 3) ); add rep repac, exttrail ./dirdat/ra replicat repac userid ogg, password ogg reperror default, abend discardfile ./dirrpt/repac.dsc,append, megabytes 10 REPORTCOUNT EVERY 2 MINUTES, RATE GROUPTRANSOPS 2000 BATCHSQL assumetargetdefs --allownoopupdates --dynamicresolution map unipostdb.T_PUB_JNL_SAV, target unipostdb.T_PUB_JNL_SAV, FILTER ( @RANGE (3, 3) ); ------------------------------------------- add rep repba, exttrail ./dirdat/rb edit param repba replicat repba userid ogg, password ogg reperror default, abend discardfile ./dirrpt/repba.dsc,append, megabytes 10 REPORTCOUNT EVERY 2 MINUTES, RATE GROUPTRANSOPS 2000 BATCHSQL assumetargetdefs --allownoopupdates --dynamicresolution map unipostdb.T_PUB_JNL_SAV, target unipostdb.T_PUB_UNREG, FILTER ( @RANGE (1, 3) ); add rep repbb, exttrail ./dirdat/rb edit param repbb replicat repbb userid ogg, password ogg reperror default, abend discardfile ./dirrpt/repbb.dsc,append, megabytes 10 REPORTCOUNT EVERY 2 MINUTES, RATE GROUPTRANSOPS 2000 BATCHSQL assumetargetdefs --allownoopupdates --dynamicresolution map unipostdb.T_PUB_JNL_SAV, target unipostdb.T_PUB_UNREG, FILTER ( @RANGE (2, 3) ); add rep repbc, exttrail ./dirdat/rb replicat repbc userid ogg, password ogg reperror default, abend discardfile ./dirrpt/repbc.dsc,append, megabytes 10 REPORTCOUNT EVERY 2 MINUTES, RATE GROUPTRANSOPS 2000 BATCHSQL assumetargetdefs --allownoopupdates --dynamicresolution map unipostdb.T_PUB_JNL_SAV, target unipostdb.T_PUB_UNREG, FILTER ( @RANGE (3, 3) ); ------------------------------------------------------------------- add rep repca, exttrail ./dirdat/rc edit param repca replicat repca userid ogg, password ogg reperror default, abend discardfile ./dirrpt/repca.dsc,append, megabytes 10 REPORTCOUNT EVERY 2 MINUTES, RATE GROUPTRANSOPS 2000 BATCHSQL assumetargetdefs --allownoopupdates --dynamicresolution map unipostdb.T_PUB_JNL_SAV, target unipostdb.T_CDM_LEDGER, FILTER ( @RANGE (1, 3) ); add rep repcb, exttrail ./dirdat/rc edit param repcb replicat repcb userid ogg, password ogg reperror default, abend discardfile ./dirrpt/repcb.dsc,append, megabytes 10 REPORTCOUNT EVERY 2 MINUTES, RATE GROUPTRANSOPS 2000 BATCHSQL assumetargetdefs --allownoopupdates --dynamicresolution map unipostdb.T_PUB_JNL_SAV, target unipostdb.T_CDM_LEDGER, FILTER ( @RANGE (2, 3) ); add rep repcc, exttrail ./dirdat/rc edit param repcc replicat repcc userid ogg, password ogg reperror default, abend discardfile ./dirrpt/repcc.dsc,append, megabytes 10 REPORTCOUNT EVERY 2 MINUTES, RATE GROUPTRANSOPS 2000 BATCHSQL assumetargetdefs --allownoopupdates --dynamicresolution map unipostdb.T_PUB_JNL_SAV, target unipostdb.T_CDM_LEDGER, FILTER ( @RANGE (3, 3) ); ---------------------------------- alter repba, extseqno 0, extrba 0 alter repbb, extseqno 0, extrba 0 alter repbc, extseqno 0, extrba 0 alter repca, extseqno 0, extrba 0 alter repcb, extseqno 0, extrba 0 alter repcc, extseqno 0, extrba 0 ----------------------------------------- linux: processor : 63 vendor_id : GenuineIntel cpu family : 6 model : 46 model name : Intel(R) Xeon(R) CPU X7560 @ 2.27GHz stepping : 6 cpu MHz : 2261.119 cache size : 24576 KB physical id : 7 siblings : 8 core id : 11 cpu cores : 4 apicid : 247 fpu : yes fpu_exception : yes cpuid level : 11 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx rdtscp lm constant_tsc ida nonstop_tsc pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm bogomips : 4522.22 clflush size : 64 cache_alignment : 64 address sizes : 44 bits physical, 48 bits virtual power management: [8] hp-unix 32c X 2 ------------------------------ PURGEOLDEXTRACTS ./dirdat/*, USECHECKPOINTS 35 + 40 G日志,产生24G队列 Log Read Checkpoint Oracle Redo Logs 2011-12-30 14:49:21 Thread 1, Seqno 1956, RBA 397949752 Log Read Checkpoint Oracle Redo Logs 2011-12-30 14:49:21 Thread 2, Seqno 1339, RBA 293856 ---------------------------------------------------------------------- add ext extgd, tranlog, begin now, threads 2 add rmttrail ./dirdat/rd, ext extgd, megabytes 100 EXTRACT extgd USERID ogg, PASSWORD ogg rmthost 192.168.110.200, mgrport 7809 rmttrail ./dirdat/rd TRANLOGOPTIONS DBLOGREADER TRANLOGOPTIONS BUFSIZE 10000000, DBLOGREADERBUFSIZE 4194304 REPORTCOUNT EVERY 2 MINUTES, RATE --dynamicresolution GETTRUNCATES table unipostdb.T_PUB_JNL_SAV, FILTER ( @RANGE (2, 2, CLT_SEQNO) ); ----------- add rep repda, exttrail ./dirdat/rd replicat repda userid ogg, password ogg reperror default, abend discardfile ./dirrpt/repda.dsc,append, megabytes 10 REPORTCOUNT EVERY 2 MINUTES, RATE GROUPTRANSOPS 2000 BATCHSQL assumetargetdefs --allownoopupdates --dynamicresolution map unipostdb.T_PUB_JNL_SAV, target unipostdb.T_PUB_JNL_SAV, FILTER ( @RANGE (1, 3) ); add rep repdb, exttrail ./dirdat/rd replicat repdb userid ogg, password ogg reperror default, abend discardfile ./dirrpt/repdb.dsc,append, megabytes 10 REPORTCOUNT EVERY 2 MINUTES, RATE GROUPTRANSOPS 2000 BATCHSQL assumetargetdefs --allownoopupdates --dynamicresolution map unipostdb.T_PUB_JNL_SAV, target unipostdb.T_PUB_JNL_SAV, FILTER ( @RANGE (2, 3) ); add rep repdc, exttrail ./dirdat/rd replicat repdc userid ogg, password ogg reperror default, abend discardfile ./dirrpt/repdc.dsc,append, megabytes 10 REPORTCOUNT EVERY 2 MINUTES, RATE GROUPTRANSOPS 2000 BATCHSQL assumetargetdefs --allownoopupdates --dynamicresolution map unipostdb.T_PUB_JNL_SAV, target unipostdb.T_PUB_JNL_SAV, FILTER ( @RANGE (3, 3) ); ----------------------------------- session_cached_cursors 50 -> 200
56k带宽,配置传输参数:flushcsecs 30RMTHOST 10.6.157.17, MGRPORT 7809, tcpbufsize 65536, tcpflushbytes 65535, compress, compressthreshold 1 Reduce repeated fetching of LOBs watch for DBMS_LOB.writeappend()FetchOptions SurppressDuplicates Reduce IO overhead by EOFDELAY Competes with LGWR for the same logEOFDelay 15Avoid scsi errors Other parameters to adjust:CheckpointSecsFlushSecsTCPBufsize COMPRESS specifies that outgoing blocks of captured changes are compressed. COMPRESSTHRESHOLD sets the minimum byte size for which compression will occur. Default is 1000 bytes.Example: RMTHOST newyork, MGRPORT 7809, COMPRESS, COMPRESSTHRESHOLD 750Tables with referential integrity to one another should be processed by the same process group.An increased value for the FLUSHSECS or TCPFLUSHBYTES parameters might allow more efficientuse of the network, but the benefit must be balanced with the risk of increased latency of the targetdata if activity on the source is low and the buffer has not been flushed.More on TCP parameters:TCPFLUSHBYTES and TCPBUFSIZE should only be used for online processes, not for initial loadconfigurations. Work with your network administrator to find a suitable value for TCPBUFSIZE.You can use the following formula as a guideline for further experimentation to determine the optimumbuffer size for your network. First, use the ping command from the operating system’s command shellto obtain the average round trip time (RTT), shown in the following example:
How to recover from an OGG-01028 Incompatible Record if the trail is not corrupt (Doc ID 1507462.1)Oracle GoldenGate – Version 9.5_EA and laterInformation in this document applies to any platform.GOALTo recover from error: OGG-01028 Incompatible record in /ggtrail/GGODSCF/dirdat/cf000325, rba 19018 (getting header).when it is known that the trail file is intact.This applies to both extract data pumps and replicats FIXIf a trail is not corrupt, a pump or replicat can be restarted by noting the point of failure (trail number and RBA) indicated in the report and discard file. Please do not attempt this if you are not familiar with reading these reports.This should be done on transaction boundaries or with RESTARTCOLLISIONS enabled. If you do not understand this, do not do this yourself; please have support assist you. >logdumplogdump> log to mycase.txtlogdump> open (/ggtrail/GGODSCF/dirdat/cf000325) <<<— the trail in the reportlogdump> ghdr onlogdump> pos (RBA 19018) <<<— the RBA in the report logdump> n this will give you a bad header messagelogdump> sfh prev this gives you the header of the previous record start,write down the RBA value <<<— If it’s the transaction boundary or only DML in transactionlogdump> count if this finishes Ok and gives you a count of tables and records, the trail is OK and you can use the RBA we saved for the alter later the trail is known to be undamaged if this does not finish with the count, you have a bad trail and must use another recovery method, contact support.logdump> exitYou now have a history of what you did in file mycase.txt and a written record of the RBA to use to ALTER the extract data pump or replicatggsci> alter , extseqno < the existing sequence number>, extrba ggsci> start
How to recover from Extract ERROR 180 encountered commit SCN that is not greater than the highest SCN already processedThis is the summary of Metalink Doc:987379.1This error occurs in an Oracle RAC environment after a transaction is written to the idle node but does not yet appear in the redo log when the current transaction is processed. This transaction will have a higher SCN then the previous transaction In order to avoid to live this problem the steps in (Encountered SCN That Is Not Greater Than The Highest SCN Already Processed ) articale must be done But If you have encountered this problem here is the solution Do an ETROLLOVER on Extract, and take note of the new sequence number of the trail file. ALTER EXTRACT [name], ETROLLOVERStart extract START EXTRACT [name]Send PUMP, LOGEND, to see if it’s at the end of the previous trail. SEND EXTRACT [pump_name], LOGENDOnce it is at the end of the trail file, You must stop the pump, and do an ETROLLOVER for it too. Take note of the new trail file sequence number that is created from this stepSTOP EXTRACT [pump_name] ALTER EXTRACT [pump_name], ETROLLOVERAlter the pump to SEQNO to the new trail file created from step #1. ALTER EXTRACT [pump_name], EXTSEQNO ##### EXTRBA 0Restart pump START EXTRACT [pump_name]Send Replicat, LOGEND to make sure it has processed all the remaining data, and stop Replicat. SEND REPLICAT [name], LOGEND STOP REPLICAT [name]If replicat is not at end of trail, generate a report and forcestop replicatSEND REPLICAT [name], REPORTSTOP REPLICAT [name]!Add the following parameters to replicat parameter file to allow replicat to process each trail record as a single transaction, or set them to 1 if you have any of these parametersGROUPTRANSOPS 1MAXTRANSOPS 1Restart replicatSTART REPLICAT [name]Once replicat has completely processed the trail, stop the replicatSTOP REPLICAT [name]Edit the replicat parameter file: Add parameter HANDLECOLLISIONS to Replicat parameter file Remove or comment out GROUPTRANSOPS and MAXTRANSOPS or revert them back to their original values.ALTER REPLICAT, SEQNO to the new trail file created in step #4. ALTER REPLICAT [name], EXTSEQNO ###### EXTRBA 0Start ReplicatSTART REPLICAT [name]Once Replicat has processed the out of order SCN operations, disable HANDLECOLLISIONS. You could also look for the CSN and wait for Replicat to checkpoint past it.SEND REPLICAT [name], NOHANDLECOLLISIONSEdit the replicat parameter and comment out the HANDLECOLLISIONS parameter. You do not need to stop/restart replicat. This will ensure that on any subsequent replicat restarts the parameter is disabled
GoldenGate performance tuning using the RANGE functionWe can improve performance by splitting large tables into row ranges and then assign processing of those ranges of rows to two or more Extract or Replicat process groups.We can use the RANGE function to divide the rows of table across processing groups.The syntax is @RANGE ({range}, {total ranges} [, {column}] [, {column}] [, …])For example here the replication workload is split into two ranges between two different Replicat processes based on the table column ‘ORDID’.The column name is optional. If not specified, GoldenGate uses the primary key of the table to allocate the ranges.(Replicat group 1 parameter file)MAP sh.orders, TARGET sh.orders, FILTER (@RANGE (1, 2, ORDID));(Replicat group 2 parameter file)MAP sh.orders, TARGET sh.orders, FILTER (@RANGE (2, 2, ORDID));While the above example shows the use of RANGE in the Replicat process groups, we can also use the RANGE function in the Extract process group.The GoldenGate documentation also states that it is better to use the RANGE function with Extract as opposed to Replicat process groups.“Using Extract to calculate the ranges is more efficient than using Replicat. Calculating ranges on the target side requires Replicat to read through the entire trail to find the data that meets each range specification.”Let us now have a look at an example where we are updating about 10 million rows in a table and we are using the RANGE function on the Replicat side of things to split the replication of these 10 mllion rows among three Replicat groups.Create the ExtractGGSCI (dvdb01) 2> add extract ext2 tranlog begin nowEXTRACT added.GGSCI (dvdb01) 3> add rmttrail /u01/oracle/goldengate/dirdat/aa, extract ext2RMTTRAIL added.Contents of parameter file for Extract ext2EXTRACT ext2USERID prd, PASSWORD prdRMTHOST sodb02, MGRPORT 7809RMTTRAIL /u01/oracle/goldengate/dirdat/aaTABLE prd.ac_entry;On Target server, add THREE Replicat groups Note that the trail file is the same for ALL the three replicat groupsGGSCI (sodb02) 1> add replicat rep2, exttrail /u01/oracle/goldengate/dirdat/aaREPLICAT added.GGSCI (sodb02) 2> add replicat rep3, exttrail /u01/oracle/goldengate/dirdat/aaREPLICAT added.GGSCI (sodb02) 3> add replicat rep4, exttrail /u01/oracle/goldengate/dirdat/aaREPLICAT added.Note the parameter file contents for each of the three Replicat groupsREPLICAT rep2ASSUMETARGETDEFSUSERID prd,PASSWORD prdMAP prd.ac_entry, TARGET prd.ac_entry, FILTER (@RANGE (1,3));REPLICAT rep3ASSUMETARGETDEFSUSERID prd,PASSWORD prdMAP prd.ac_entry, TARGET prd.ac_entry, FILTER (@RANGE (2,3));REPLICAT rep4ASSUMETARGETDEFSUSERID prd,PASSWORD prdMAP prd.ac_entry, TARGET prd.ac_entry, FILTER (@RANGE (3,3));Start the Extract on source serverGGSCI (dvdb01) 6> start extract ext2Sending START request to MANAGER …EXTRACT EXT2 startingGGSCI (dvdb01) 7> info extract ext2EXTRACT EXT2 Last Started 2011-03-11 14:24 Status RUNNINGCheckpoint Lag 00:18:36 (updated 00:00:00 ago)Log Read Checkpoint Oracle Redo Logs2011-03-11 14:06:02 Seqno 22, RBA 220007440On target, now start the replicat processesGGSCI (sodb02) 7> start replicat rep2Sending START request to MANAGER …REPLICAT REP2 startingGGSCI (sodb02) 8> start replicat rep3Sending START request to MANAGER …REPLICAT REP3 startingGGSCI (sodb02) 9> start replicat rep4Sending START request to MANAGER …REPLICAT REP4 startingUpdate 10 million rows in the tableSQL> update ac_entry set update_date=sysdate where id between 350000 and 11000000;10193820 rows updated.SQL> commit;Commit complete.After some time we check the status of the Extract process. We find that it has finished (note the EOF) and while the database log sequence has advanced from 22 to 28, GoldenGate has generated 311 trace files of 10MB each (the default size) in the location on the target server specified for the trail files.GGSCI (dvdb01) 23> send extract ext2 statusSending STATUS request to EXTRACT EXT2 …EXTRACT EXT2 (PID 23821)Current status: Recovery complete: At EOFCurrent read position:Sequence #: 28RBA: 1827632128Timestamp: 2011-03-11 14:39:26.000000Current write position:Sequence #: 311RBA: 1021232Timestamp: 2011-03-11 14:39:34.393944Extract Trail: /u01/oracle/goldengate/dirdat/aaOn the target server, we now check the status of the three Replicat groups, We find that all three are running and are currently processing the same trail file sequence # 217 (aa217).But the important point to note is that the processes are reading from different parts of the same trail file. Note that each process has a different RBA or relative byte address.GGSCI (sodb02) 31> send replicat rep* statusSending STATUS request to REPLICAT REP2 …Current status: Processing dataSequence #: 217RBA: 888147502538 records in current transactionSending STATUS request to REPLICAT REP3 …Current status: Processing dataSequence #: 217RBA: 890379502438 records in current transactionSending STATUS request to REPLICAT REP4 …Current status: Processing dataSequence #: 217RBA: 3219241502782 records in current transactionAfter some time, we run the same command again and find that all three replicat processes have now completed and are at trail file sequence 311 which was the last trail file that the extract process had generated. Note the EOF and the fact that the RBA now for all three replicat files is the same.GGSCI (sodb02) 6> send replicat rep* statusSending STATUS request to REPLICAT REP2 …Current status: At EOFSequence #: 311RBA: 25766950 records in current transactionSending STATUS request to REPLICAT REP3 …Current status: At EOFSequence #: 311RBA: 25766950 records in current transactionSending STATUS request to REPLICAT REP4 …Current status: At EOFSequence #: 311RBA: 25766950 records in current transactionIf we chcek the statistics of the three replicat processes, we find that using the RANGE function has spilt the 10 miilion row update task into three – each replicat process here has processed about 3.3 million rows each.GGSCI (sodb02) 28> stats replicat rep*Sending STATS request to REPLICAT REP2 …Start of Statistics at 2011-03-11 14:39:41.Replicating from PRD.AC_ENTRY to PRD.AC_ENTRY:*** Total statistics since 2011-03-11 14:36:38 ***Total inserts 0.00Total updates 3398392.00Total deletes 0.00Total discards 0.00Total operations 3398392.00End of Statistics.Sending STATS request to REPLICAT REP3 …Start of Statistics at 2011-03-11 14:39:42.Replicating from PRD.AC_ENTRY to PRD.AC_ENTRY:*** Total statistics since 2011-03-11 14:36:38 ***Total inserts 0.00Total updates 3397822.00Total deletes 0.00Total discards 0.00Total operations 3397822.00End of Statistics.Sending STATS request to REPLICAT REP4 …Start of Statistics at 2011-03-11 14:39:42.Replicating from PRD.AC_ENTRY to PRD.AC_ENTRY:*** Total statistics since 2011-03-11 14:36:38 ***Total inserts 0.00Total updates 3397822.00Total deletes 0.00Total discards 0.00Total operations 3397822.00End of Statistics.
replicate 上指定 map maclean.T_* , target maclean.*;不要指定成 map maclean.T_* , target maclean.T_*;