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

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

原创 jieguo 2021-12-03
4045

同步需求:

增加生产库表 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论