以下是解决4002的几种方式
1、选择源端数据库的日志读取方式错误。
解决方案:请仔细判断源端数据库是文件系统,还是ASM的磁盘管理模式。在添加数据库节点的时候,请正确选择“日志的读取方式”。
2.源端持续大量写入数据,源库未开启归档模式。
解决方案:源端开启归档模式后,规则重新全同步
3.远程部署,源库部署logreader服务,但页面源库数据库节点未勾选“远程文件代理”
解决方案:页面源端数据库节点按照手册正确配置。
如果是开启bakredo 那么需要在执行一下那个bakredo -u rule-uuid -n redolog-limit  这个  杀掉之前得进程,然后启动解析
 

2022/11/11
场景     4002 无法查找指定redolog序号

排查

1)从工作机(抽取,生产)节点查看iatrack.log

2022-11-10 14:13:17 fatal 29D162D8-4834-FF1B-E961-F39AE4D4FB62 Reader[1] get redolog 232 err -1

2022-11-10 14:13:18 err 29D162D8-4834-FF1B-E961-F39AE4D4FB62 OraFile.cpp::Open:131 Read redo /oradata/orcl/redo01.log off 0 len 512 err -9

2022-11-10 14:13:18 fatal 29D162D8-4834-FF1B-E961-F39AE4D4FB62 Reader[1] get redolog 232 err -1

2022-11-10 14:13:19 err 29D162D8-4834-FF1B-E961-F39AE4D4FB62 OraFile.cpp::Open:131 Read redo /oradata/orcl/redo01.log off 0 len 512 err -9

2)logreader(源机)工作进程

[oracle@localhost ~]$ ps -ef|grep logreader

oracle   25901     1  0 12:50 ?        00:00:00 /home/oracle/i2active/bin/logreader 26899 172.20.66.165 /oradata/orcl /u01/app/arch/

3)检查页面数据库节点,代理端口

代理端口需要和logreader指定端口一致。

检查以下几点

1)数据库节点页面配置信息和logreader参数一致;

2)logreader参数正确;

3)数据库节点页面配置,是否开启远程文件代理,代理端口是否正确;

当页面数据库节点未开启文件代理
 

4、客户物理删除了归档导致找不到redolog
解决方案:通过
rman target/
delete noprompt archivelog all completed before 'sysdate';
解决
注意事项,对数据库的操作需要征得客户同意
5、由于长期停止解析导致4002
解决方案
在数据库中查询长事物下的时间、以及占用Undo、以及当前的SQL,根据SID与serial#,判断当前没有SQL,同时对业务的影响做出判断。
set linesize 200
set pagesize 5000
col transaction_duration format a40
col program format a15
col username format a15
with transaction_details as
( select inst_id
,start_date
  , ses_addr
  , sysdate - start_date as diff
  ,xidusn
from gv$transaction
)
select s.username
, to_char(trunc(t.diff))
             || ' days, '
             || to_char(trunc(mod(t.diff * 24,24)))
             || ' hours, '
             || to_char(trunc(mod(t.diff * 24 * 60,24)))
             || ' minutes, '
             || to_char(trunc(mod(t.diff * 24 * 60 * 60,60)))
             || ' seconds' as transaction_duration
, s.program
, s.terminal
, s.status
, s.sid
, s.serial#
,t.start_date
,  r.rssize/1024/1024
,sq.sql_text
from gv$session s
, transaction_details t
,gv$rollstat r
,gv$sqltext  sq
where s.inst_id = t.inst_id
and s.saddr = t.ses_addr
and t.xidusn = r.usn
and s.sql_address=sq.address
order by t.diff desc;
如果没有结果,即对会话进行Kill
alter system kill session '999,40840' immediate;
长事务的影响下的4002错误情况下强制改断点让规则继续:
①、在解析停止情况下,任何时候我们都可以用dumpredo强制修改软件的复制位置,但是操作人员需要清楚自己在干什么,一般来说,这样做会丢数据,各别情况除外,比如残留事务导致的问题。
②、为尽量减少损失机率,我们要把断点设置在最早的REDO或者归档。
Select thread#,min(sequence#) from v$archived_log where (CREATOR='ARCH'  OR CREATOR='FGRD'  OR CREATOR='RMAN') and name is not null group by thread#;
③、查看源备缓存目录,哪里文件序号更大,就在哪里修改
源目录
/源机缓存目录/库UUID/Track/Dyn
备目录
/备机缓存目录/规则UUID/Back/ActData
④、在要修改的目录下执行dumpredo,格式如下
dumpredo -b seq.block,seq.block -o ./
比如前述查询输出结果为:
1   100
2   155
3   99
dumpredo -b 100.2,155.2,99.2 -o ./
seq要按线程顺序填写,block都填2。
建议先对目录做备份,修改完毕,继续规则。


6、20230509版本之后可以用
在遇到4002情况时,用iadebug track --resumeforce UUID 这个功能可以让解析继续