暂无图片
暂无图片
12
暂无图片
暂无图片
17
暂无图片

OGG业务不停机在线增加同步表 for oracle11.2.0.4(生产实战)

原创 jieguo 2021-12-03
4917

同步需求:

增加生产库表 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属于逻辑同步复制,只要把握好数据变化的时间点即可灵活应对。

最后修改时间:2021-12-07 12:11:06
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

Nightll
暂无图片
1年前
评论
暂无图片 0
使用scn号在已有的同步进程中新增表,需要停止投递进程吗做吗,我这用scn号追,有时候不停投递进程,最后表不会同步
1年前
暂无图片 点赞
1
jieguo
暂无图片
1年前
回复
暂无图片 0
增加表param配置文件变更了就需要启停一下进程。
1年前
暂无图片 点赞
回复
墨天轮福利君
暂无图片
3年前
评论
暂无图片 0
🎁您好,您的文章阅读量已经达到1000,为您派送100墨值的流量收益!
3年前
暂无图片 点赞
评论
徐国奇
暂无图片
3年前
评论
暂无图片 0
我以为不需要停进程😂
3年前
暂无图片 点赞
1
jieguo
暂无图片
3年前
回复
暂无图片 0
不停业务应用哈
3年前
暂无图片 点赞
回复
墨天轮福利君
暂无图片
3年前
评论
暂无图片 0
您好,您的文章已入选合格奖,10墨值奖励已经到账请查收! ❤️我们还会实时派发您的流量收益。
3年前
暂无图片 点赞
评论
秋枫暮霞
暂无图片
3年前
评论
暂无图片 0
3-5步骤是有问题的,查看当前表是否有事务在进行,不能够根据坐着写的语句来查看,只有执行事务当前会话查询才会有结果,应该根据传输表当前是否被上锁来确定是否有事务正在传输表上执行:select a.session_id,a.locked_mode,b.object_name, c.USERNAME,c.OSUSER,c.MACHINE,c.PROGRAM from v$locked_object A , all_objects B, v$session C where a.OBJECT_ID=b.OBJECT_ID and a.session_id =c.sid and b.object_name='D_TEST_2';
3年前
暂无图片 点赞
4
jieguo
暂无图片
3年前
回复
暂无图片 0
V$TRANSACTION lists the active transactions in the system. When the transaction is complete, (either COMMIT or ROLLBACK), the entry should go away。根据这个视图判断就OK的。
3年前
暂无图片 点赞
回复
jieguo
暂无图片
3年前
回复
暂无图片 0
OGG只捕获提交的事务。
3年前
暂无图片 点赞
回复
秋枫暮霞
暂无图片
3年前
回复
暂无图片 0
@jieguo 这个视图是没问题的,但是v$session中SQL_HASH_VALUE和status在执行事务的当前会话中和其他会话中查询的结果会不一样,如果事务未提交,其他会话查询的SQL_HASH_VALUE为空,以此做连接查询需要传输对象是否存在事务是不准确的。
3年前
暂无图片 点赞
回复
jieguo
暂无图片
3年前
回复
暂无图片 0
有道理,改成下面的更合适: 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%';
3年前
暂无图片 点赞
回复
三人禾
暂无图片
3年前
评论
暂无图片 0
标题有迷惑性,老OGGer也想看看神操作
3年前
暂无图片 点赞
1
jieguo
暂无图片
3年前
回复
暂无图片 0
望指点一二:)
3年前
暂无图片 点赞
回复
查看更多 >
jieguo
关注
暂无图片
获得了588次点赞
暂无图片
内容获得280次评论
暂无图片
获得了353次收藏
目录
  • 同步需求:
  • 处理思路:(同步多表的思路一致)
  • 详细步骤:
    • 1.源端检查源jyc1用户下t_order_group表信息,是否有主键或唯一索引(无主键的表要求加上主键,彻底避免性能问题和数据同步不一致的问题)
    • 2.目标端是否存在该表(不存在)
    • 3.配置步骤:
      • - 1) 源端附加表日志
      • - 2) 源端抽取进程增加表,并重新启动抽取进程
      • - 3) 源端推送进程增加表,重新启动推送进程
      • - 4) 目标端停止复制进程
      • - 5) 源端获取scn(确认该表无事务存在)
      • - 6) 源端exp/expdp根据scn导出表dmp
      • - 7) 源端dmp拷贝到目标端
      • - 8) 目标端导入表
      • - 9) 目标端复制进程增加表带过滤filter csn
      • - 10)目标端启动复制进程,待同步完成后,去掉fiter,重新启动复制进程
      • - 11)源端和目标端检查记录是否一致
  • 生产遇到的问题: