同步需求:
增加生产库表 t_order_group到目的镜像库的ogg同步。
源用户jyc1到目标库jyc2,表名不变
源端和目标端:
数据库版本均oracle 11.2.0.4
ogg版本:
Oracle GoldenGate Command Interpreter for Oracle
Version 12.2.0.1.170919 27731916_FBO
Linux, x64, 64bit (optimized), Oracle 11g on Sep 4 2018 20:23:18
处理思路:(同步多表的思路一致)
1.源端检查表是否满足同步要求(主键)
2.目标端是否存在该表(不存在)
3.配置步骤:
- 1) 源端附加表日志
- 2) 源端抽取进程增加表,并重新启动抽取进程
- 3) 源端推送进程增加表,重新启动推送进程
- 4) 目标端停止复制进程
- 5) 源端获取scn(确认该表无事务存在)
- 6) 源端exp/expdp根据scn导出表dmp
- 7) 源端dmp拷贝到目标端
- 8) 目标端导入表
- 9) 目标端复制进程增加表带过滤filter csn
- 10)目标端启动复制进程,待同步完成后,去掉fiter,重新启动复制进程
- 11)源端和目标端检查记录是否一致
详细步骤:
1.源端检查源jyc1用户下t_order_group表信息,是否有主键或唯一索引(无主键的表要求加上主键,彻底避免性能问题和数据同步不一致的问题)
select a.constraint_name, a.column_name from user_cons_columns a, user_constraints b where a.constraint_name = b.constraint_name and b.constraint_type = 'P' and a.table_name = 'T_ORDER_GROUP'; CONSTRAINT_NAME COLUMN_NAME ------------------------ PK_T_ORDER_GROUP SUBORDERID SQL> select count(*) from T_ORDER_GROUP; COUNT(*) ---------- 1594 SQL> set time on 15:27:09 SQL> / COUNT(*) ---------- 1594 15:27:11 SQL> / COUNT(*) ---------- 1595 15:30:38 SQL> / COUNT(*) ---------- 1597
复制
确认结果:有主键并且dml操作数据变化频繁。由此,我们需要采用scn标准的步骤来配置ogg同步。
2.目标端是否存在该表(不存在)
在目标端conn jyc2/xxx检查表desc T_ORDER_GROUP提示不存在,后续无需考虑drop表操作
3.配置步骤:
- 1) 源端附加表日志
dblogin userid oggadm,password xxxxxx
add trandata JYC1.T_ORDER_GROUP
- 2) 源端抽取进程增加表,并重新启动抽取进程
edit param cq
TABLE JYC1.T_ORDER_GROUP;
start cq
- 3) 源端推送进程增加表,重新启动推送进程
edit param ts
TABLE JYC1.T_ORDER_GROUP;
start cq
- 4) 目标端停止复制进程
stop fz
- 5) 源端获取scn(确认该表无事务存在)
col current_scn for 9999999999999999 SELECT d.spid,a.sid,e.event,b.status,C.SQL_TEXT,B.USERNAME,B.OSUSER,B.MACHINE,B.PROGRAM FROM V$SESS_IO A,V$SESSION B,V$SQL C,V$PROCESS D,v$session_wait e WHERE A.SID=B.SID AND B.SQL_HASH_VALUE=C.HASH_VALUE and B.sid=E.sid and upper(C.sql_text) like '%T_ORDER_GROUP%' AND B.PADDR=D.ADDR and b.sid in( select a.sid from v$transaction b, v$session a where b.addr=a.taddr ); 上述SQL的关联查询根据网友【秋枫暮霞】建议,改成如下更合适: select s.sid,t.start_time,osuser o, username u,sa.sql_text from v$session s, v$transaction t, dba_rollback_segs r, v$sqlarea sa where s.taddr=t.addr and t.xidusn=r.segment_id(+) and s.sql_address=sa.address(+) and upper(sa.sql_text) like '%T_ORDER_GROUP%'; select current_scn from v$database; no rows selected --查询无事务,则该scn可用,否则重新执行上述语句查询,直到无记录为止。 CURRENT_SCN ----------------- 17461233119488 SQL>
复制
- 6) 源端exp/expdp根据scn导出表dmp
注意使用flashback_SCN=17461233119488和排除触发器trigger(目标端无需触发器)
[oracle@racj1 ~]$ expdp jyc1/xxx directory=dmp tables=jyc1.T_ORDER_GROUP dumpfile=T_ORDER_GROUP.dmp parallel=1 logfile=T_ORDER_GROUP.log flashback_SCN=17461233119488 cluster=n exclude=trigger Export: Release 11.2.0.4.0 - Production on Thu Dec 2 16:19:24 2021 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP, Data Mining and Real Application Testing options FLASHBACK automatically enabled to preserve database integrity. Starting "jyc1"."SYS_EXPORT_TABLE_01": jyc1/******** directory=dmp tables=jyc1.T_ORDER_GROUP dumpfile=T_ORDER_GROUP.dmp parallel=1 logfile=T_ORDER_GROUP.log flashback_SCN=17461233119488 cluster=n exclude=trigger Estimate in progress using BLOCKS method... Processing object type TABLE_EXPORT/TABLE/TABLE_DATA Total estimation using BLOCKS method: 2 MB Processing object type TABLE_EXPORT/TABLE/PROCACT_INSTANCE Processing object type TABLE_EXPORT/TABLE/TABLE Processing object type TABLE_EXPORT/TABLE/COMMENT Processing object type TABLE_EXPORT/TABLE/INDEX/INDEX Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT Processing object type TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS . . exported "jyc1"."T_ORDER_GROUP" 1.705 MB 1607 rows Master table "jyc1"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded ****************************************************************************** Dump file set for jyc1.SYS_EXPORT_TABLE_01 is: /bak/dmp/T_ORDER_GROUP.dmp Job "jyc1"."SYS_EXPORT_TABLE_01" successfully completed at Thu Dec 2 16:21:24 2021 elapsed 0 00:01:49
复制
- 7) 源端dmp拷贝到目标端
[oracle@racj1 ~]$ scp /bak/dmp/T_ORDER_GROUP.dmp 192.168.52.245:/oradata/dmp/ The authenticity of host '192.168.52.245 (192.168.52.245)' can't be established. ECDSA key fingerprint is SHA256:i68dRBpIH6rfI/vNPpClkLgy4WXuMJJJBhQNyCno83g. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '192.168.52.245' (ECDSA) to the list of known hosts. oracle@192.168.52.245's password: T_ORDER_GROUP.dmp 100% 2564KB 62.7MB/s 00:00
复制
- 8) 目标端导入表
注意检查dmp路径及导入到不同用户参数REMAP_SCHEMA=JYC1:JYC2 tables=JYC1.T_ORDER_GROUP
SQL> set line 132 SQL> set wrap off SQL> select * from dba_directories; OWNER DIRECTORY_NAME DIRECTORY_PATH ------------------------------ ------------------------------ ---------------------------------------------- SYS DMP /oradata/dmp [oracle@zyjxnew dmp]$ impdp jyc2/xxx directory=dmp REMAP_SCHEMA=JYC1:JYC2 tables=JYC1.T_ORDER_GROUP dumpfile=T_ORDER_GROUP.dmp parallel=1 logfile=T_ORDER_GROUP.log cluster=n Import: Release 11.2.0.4.0 - Production on Thu Dec 2 16:21:36 2021 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options Master table "JYC2"."SYS_IMPORT_TABLE_01" successfully loaded/unloaded Starting "JYC2"."SYS_IMPORT_TABLE_01": JYC2/******** directory=dmp REMAP_SCHEMA=JYC1:JYC2 tables=JYC1.T_ORDER_GROUP dumpfile=T_ORDER_GROUP.dmp parallel=1 logfile=T_ORDER_GROUP.log cluster=n Processing object type TABLE_EXPORT/TABLE/PROCACT_INSTANCE Processing object type TABLE_EXPORT/TABLE/TABLE Processing object type TABLE_EXPORT/TABLE/TABLE_DATA . . imported "JYC2"."T_ORDER_GROUP" 1.705 MB 1607 rows Processing object type TABLE_EXPORT/TABLE/COMMENT Processing object type TABLE_EXPORT/TABLE/INDEX/INDEX Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT Processing object type TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS Job "JYC2"."SYS_IMPORT_TABLE_01" successfully completed at Thu Dec 2 16:21:47 2021 elapsed 0 00:00:11
复制
- 9) 目标端复制进程增加表带过滤filter csn
edit param fz
MAP JYC1.T_ORDER_GROUP TARGET JYC2.T_ORDER_GROUP, filter ( @getenv(‘TRANSACTION’, ‘CSN’) >17461233119488);
提示:如果ogg版本是11.x的,需要使用双引号"transaction",“csn”,如果ogg版本>=12.x的使用单引号,如上。
- 10)目标端启动复制进程,待同步完成后,去掉fiter,重新启动复制进程
start fz
info fz
info all
edit param fz
MAP JYC1.T_ORDER_GROUP TARGET JYC2.T_ORDER_GROUP;
stop fz
start fz
info all
info fz
- 11)源端和目标端检查记录是否一致
源端和目标端同时查询即可。还可以检查./dirrpt/fz.dsc日志是否有异常,根据问题处理即可。
SQL> set time on 16:24:52 SQL> select count(*) from T_ORDER_GROUP; COUNT(*) ---------- 1609 16:24:54 SQL> / COUNT(*) ---------- 1609 16:25:03 SQL> / COUNT(*) ---------- 1611 16:26:40 SQL> / COUNT(*) ---------- 1611
复制
生产遇到的问题:
1.源端附加日志时卡住,无法取消
2021-12-02 15:55:45 WARNING OGG-00706 Failed to add supplemental log group on table JYC1.T_ORDER_GROUP due to ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired SQL ALTER TABLE "JYC1"."T_ORDER_GROUP" ADD SUPPLEMENTAL LOG GROUP "GGS_2948562" ("SUBORDERID") ALWAYS /* GOLDENGATE_DDL_REPLICATION */. ^C ^C ^C^C^Z ^C
复制
处理方法:断开该ssh连接,并检查处理锁问题
SQL> select * from (select a.inst_id, a.sid, a.serial#, a.sql_id, a.event, a.status, connect_by_isleaf as isleaf, sys_connect_by_path(a.SID||'@'||a.inst_id, ' <- ') tree, level as tree_level from gv$session a start with a.blocking_session is not null connect by (a.sid||'@'||a.inst_id) = prior (a.blocking_session||'@'||a.blocking_instance)) where isleaf = 1 order by tree_level asc rows will be truncated INST_ID SID SERIAL# SQL_ID EVENT STATUS ISLEAF TREE ---------- ---------- ---------- ------------- ---------------------------------------------------------------- -------- ---------- ------------------------------------------------ 1 7183 54211 SQL*Net message from client INACTIVE 1 <- 7832@1 <- 7183@1 1 7183 54211 SQL*Net message from client INACTIVE 1 <- 2532@1 <- 7183@1 SQL> SQL> SQL> SQL> alter system kill session '7183,54211,@1' immediate; System altered.
复制
2.拓展思考:
如果源端表是新表,无记录,那么就只需要1)2)3)+目标端创建新表+同步测试验证即可。
如果源端表有记录,但使用不频繁,记录数少(不超过十万条),比如几个小时才有数据变化,那么只需要1)2)3)+如下参考方法
- create target table,dblink truncate, insert into
- exp/expdp/imp/impdp
- create target table,ogg initial load
如果源端的整个数据同步ogg是新搭建,那么处理步骤就又不同了,更简单些。
总之ogg属于逻辑同步复制,只要把握好数据变化的时间点即可灵活应对。
评论





