问题描述
早上对KFS同步链路巡检时发现KES到Oracle这条链路中目标端同步服务离线,KFS管控平台中显示批处理中出现错误: ORA-00923: 未找到要求的 FROM 关键字,以下是分析过程。


分析过程
查看同步日志
cd /topsoft/kfs/replicator/flysync/flysync-replicator/log
tail -300f fsrepsvc.log输出如下:
2025-05-20 17:22:17 | | [target_oracle_3112 - pool-2-thread-1-q-to-dbms-0] ERROR applier.JdbcApplier Statement failed: create or replace view BZGSV5_ICIS_ALTERPUNISHINFO as
SELECT bg.casealtid AS id,
wfcf.pendecno,
(bg.alt)::character varying(1000 char) AS alt,
bg.altdate,
cast(dsr.pripid as number(19,0)) AS marprid,
bg.type AS busitype,
bg.caseid,
cast(bg.penauth as number(19,0)) AS penorgid,
bg.penauth_cn AS penauth,
bg.s_ext_datatime AS "timestamp"
FROM ((case_pub_alter bg
LEFT JOIN case_cf_partyinfo dsr ON (((dsr.caseid)::text = (bg.caseid)::text)))
LEFT JOIN case_cf_irregpunishinfo wfcf ON (((wfcf.caseid)::text = (bg.caseid)::text)))
WHERE ((wfcf.pendecissdate)::timestamp without time zone >= (to_date('2014-10-01'::text, 'yyyy-mm-dd'::text))::timestamp without time zone)
UNION ALL
SELECT qt.casealtid AS id,
NULL::varchar AS pendecno,
(qt.alt)::character varying(1000 char) AS alt,
qt.altdate,
( SELECT cast(e_ot_case.pripid as number(19,0))
FROM e_ot_case
WHERE (((e_ot_case.caseid)::text = (qt.caseid)::text) AND (ROWNUM = 1))) AS marprid,
'01'::varchar AS busitype,
qt.caseid,
cast(NULL as number(19,0)) AS penorgid,
qt.penauth,
qt.s_ext_datatime AS "timestamp"
FROM e_ot_casalt qt
2025-05-20 17:22:17 | | [target_oracle_3112 - pool-2-thread-1-q-to-dbms-0] ERROR applier.JdbcApplier This error may be unexpected
com.kingbase.flysync.replicator.applier.ApplierException: java.sql.BatchUpdateException: 批处理中出现错误: ORA-00923: 未找到要求的 FROM 关键字
at com.kingbase.flysync.replicator.applier.JdbcApplier.applyStatementData(JdbcApplier.java:982)
at com.kingbase.flysync.replicator.applier.OracleApplier.applyStatementData(OracleApplier.java:1319)
at com.kingbase.flysync.replicator.applier.JdbcApplier.apply(JdbcApplier.java:2604)
at com.kingbase.flysync.replicator.applier.ApplierWrapper.apply(ApplierWrapper.java:99)
at com.kingbase.flysync.replicator.pipeline.SingleThreadStageTask.apply(SingleThreadStageTask.java:963)
at com.kingbase.flysync.replicator.pipeline.SingleThreadStageTask.runTask(SingleThreadStageTask.java:646)
at com.kingbase.flysync.replicator.pipeline.SingleThreadStageTask.run(SingleThreadStageTask.java:206)
at java.lang.Thread.run(Thread.java:750)查看断点
dsctl -service target_oracle_3112 get -ascmd输出如下:
[kfs@xzsbk log]$ dsctl -service target_oracle_3112 get -ascmd
dsctl set -seqno 7910 -epoch 0 -event-id "kb:1599460595648:1599470540552" -source-id "kesbzk"查看断点下一个事务对应的sql语句
语法:kufl -service target_oracle_3112 list -seqno seqno号
kufl -service target_oracle_3112 list -seqno 7911输出如下:
[kfs@xzsbk kfs]$ kufl -service target_oracle_3112 list -seqno 7911
SEQ# = 7911 / FRAG# = 0 (last frag)
- TIME = 2025-05-16 18:24:41.21
- EPOCH# = 0
- EVENTID = kb:1599460595648:1599473027176
- SOURCEID = kesbzk
- METADATA = [tz_aware=true;dbms_type=kingbase;client_id;all_tables=#UNKNOWN;bidi_unsafe=true;service=source_kesv8r6_3112;shard=#UNKNOWN]
- TYPE = com.kingbase.flysync.replicator.event.ReplDBMSEvent
- OPTIONS = []
- OPTIONS = [TG_TAG = CREATE VIEW, TABLE = NULL]
- SQL(0) =
- SCHEMA = SJTBK
- DDL = create or replace view BZGSV5_ICIS_ALTERPUNISHINFO as
SELECT bg.casealtid AS id,
wfcf.pendecno,
(bg.alt)::character varying(1000 char) AS alt,
bg.altdate,
cast(dsr.pripid as number(19,0)) AS marprid,
bg.type AS busitype,
bg.caseid,
cast(bg.penauth as number(19,0)) AS penorgid,
bg.penauth_cn AS penauth,
bg.s_ext_datatime AS "timestamp"
FROM ((case_pub_alter bg
LEFT JOIN case_cf_partyinfo dsr ON (((dsr.caseid)::text = (bg.caseid)::text)))
LEFT JOIN case_cf_irregpunishinfo wfcf ON (((wfcf.caseid)::text = (bg.caseid)::text)))
WHERE ((wfcf.pendecissdate)::timestamp without time zone >= (to_date('2014-10-01'::text, 'yyyy-mm-dd'::text))::timestamp without time zone)
UNION ALL
SELECT qt.casealtid AS id,
NULL::varchar AS pendecno,
(qt.alt)::character varying(1000 char) AS alt,
qt.altdate,
( SELECT cast(e_ot_case.pripid as number(19,0))
FROM e_ot_case
WHERE (((e_ot_case.caseid)::text = (qt.caseid)::text) AND (ROWNUM = 1))) AS marprid,
'01'::varchar AS busitype,
qt.caseid,
cast(NULL as number(19,0)) AS penorgid,
qt.penauth,
qt.s_ext_datatime AS "timestamp"
FROM e_ot_casalt qt解决办法
目标库中创建表
在目标库中创建一个空表,用于做语法转换用。会把报错的DDL给转换为truncate这张表。
create table sjtbk.kfs2(id number(10,0));停止同步服务
fsrepctl offline
--如果有多个服务,指定要停止的服务进行停止
fsrepctl -service 同步服务名称 offline查看服务状态,确保已经offline
目标端从断点开始purge
kufl -service target_oracle_3112 purge -low 7910 -y查看purge后是不是已经删除了断点后的kufl
kufl -service target_oracle_3112 index开启同步服务
fsrepctl online查看服务状态,确保已经online
禁用掉源端ddlSupport.json中的视图
vi /topsoft/kfs/replicator/filters-config/replaceStatement.csv
#################################################
# ReplaceStatementFilter sample definition file #
#################################################
# CSV format:
#
# originalPattern,newPattern
#
# In case of multiple entries matching the same request, order of preference is
# important. Consider the following example:
#
# SET SESSION AUTHORIZATION "SYSTEM";SET search_path = "$USER",PUBLIC;,
select[\\s\\S]+,truncate table kfs2;
create or replace view[\\s\\S]+,truncate table kfs2;配置ddl同步配置
将存储过程、视图、触发器、函数等过滤掉。
cd /topsoft/kfs/replicator/filters-config
vi ddl_support.json将以下参数值都配置成N
"VIEW": {
"DEFAULT": {
"CREATE": "N",
"DROP": "N",
"ALTER": "N"
}
},
"PROCEDURE": {
"DEFAULT": {
"CREATE": "N",
"DROP": "N",
"ALTER": "N"
}
},
"FUNCTION": {
"DEFAULT": {
"CREATE": "N",
"DROP": "N",
"ALTER": "N"
}
},
"TRIGGER": {
"DEFAULT": {
"CREATE": "N",
"DROP": "con'g'qi重启同步服务
--重启同步服务
replicator restart
--查看同步服务状态
fsrepctl services最后修改时间:2025-05-22 09:55:56
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




