ocp4.0同步过来的函数报错

【 使用环境 】生产环境
【 使用版本 】ocp4.0
【问题描述】通过navicat同步过来的函数,执行报错User not exist,同时导入的函数在navicat看不到,在DBerver能看到

可以补充下操作流程么,还有observer的版本

navicat直接同步到ocp的数据库里面的,observer4.0版本

navicat版本呢,我这边尝试复现下。另外想问下有试过使用oms做迁移么

navicat版本12.1.27,没有使用oms,使用是数据传输的功能

方便提供下报错的日志么,报错User not exist看起来像配置问题,同批导入的其他sql没有报错?


直接用别的库同步函数,在navicat看不到函数,能看到存储过程,执行函数报错。
在DBeaver中执行也是同样的错误

DBeaver我这边试了下,是有报错的,但是是sql的问题,方便把你的sql报错发下么?此外observer应该也有对应User not exist的报错,麻烦传下日志

同时数据迁移这块建议试用下oms

函数内容可以用show create procedure ${plName};来看

不用所有的,${oceanbasehome}/log/ 下的文件都是可以删除的,值截取触发的log就行,也可以使用类似
tail -f *|grep "ret=-1449’这样的方式来获取新触发的日志,在获取到新触发的bug日志后有个 transId(YB带头的),再根据这个值进行整体筛选就行

observer.log.wf.20221125105504158.zip (4.1 MB)

[2022-11-25 10:45:39.629559] WARN [RPC.OBRPC] decode (ob_rpc_net_handler.cpp:198) [21044][RpcIO][T0][Y0-0000000000000000-0-0] [lt=83] packet fly cost too much time(pcode=330, fly_ts=663940, send_timestamp=1669344338965609, connection=“133.197.204.3:2882_133.197.206.92:53908_103_0x7fd557b80b90 tp=0 t=1669095917457440-1669344339629531 s=0 r=0 io=15999589890/5295293987 sq=5295290702”)
[2022-11-25 10:45:39.638179] WARN [RPC.OBRPC] decode (ob_rpc_net_handler.cpp:198) [21040][RpcIO][T0][Y0-0000000000000000-0-0] [lt=25] packet fly cost too much time(pcode=1815, fly_ts=663969, send_timestamp=1669344338974202, connection=“133.197.204.3:2882_133.197.206.92:53886_91_0x7fd557cd7d40 tp=0 t=1669095915454134-1669344339638156 s=0 r=0 io=16330805900/5407234352 sq=5407228529”)
[2022-11-25 10:45:39.641129] USER_ERR resolve_sp_definer (ob_create_routine_resolver.cpp:163) [18650][T1002_TNT_L0_G0][T1002][YB4285C5CC03-0005EE08C2C7C654-0-0] [lt=33] User not exist
[2022-11-25 10:45:39.654202] WARN [LIB] ~ObTimeGuard (utility.h:853) [21431][T1_TenantWeakRe][T1][Y0-0000000000000000-0-0] [lt=30] destruct(*this=time guard ‘[WRS] [TENANT_WEAK_READ_SERVICE] tenant_id=1, thread_timer_task’ cost too much time, used=11405, time_dist: do_cluster_heartbeat=10, generate_cluster_version=11316, cluster_service_self_check=34)
[2022-11-25 10:45:39.659076] WARN [LIB] ~ObTimeGuard (utility.h:853) [12387][T1002_TenantWea][T1002][Y0-0000000000000000-0-0] [lt=43] destruct(*this=time guard ‘[WRS] [TENANT_WEAK_READ_SERVICE] tenant_id=1002, thread_timer_task’ cost too much time, used=14245, time_dist: do_cluster_heartbeat=7, generate_cluster_version=9304)
[2022-11-25 10:45:39.670532] WARN [PALF] inner_append_log (palf_handle_impl.cpp:1677) [12305][T1002_IOWorker][T1002][Y0-0000000000000000-0-0] [lt=28] write log cost too much time(ret=0, this={palf_id:1002, self:“133.197.204.3:2882”, has_set_deleted:false}, lsn_array=[{lsn:6372654658}], log_ts_array=[1669344339598735464], time_cost=13285)

CREATE DEFINER = root@% FUNCTION wcn.wcn.getChildList

(

rootId varchar (100)

) RETURNS longtext begin

DECLARE sTemp longtext ;

DECLARE sTempChd longtext;

SET sTemp = ‘$’;

SET sTempChd :=rootId ;

WHILE sTempChd is not null DO

SET sTemp = concat(sTemp,’,’,sTempChd);

SELECT group_concat(id) INTO sTempChd FROM tbl_org where FIND_IN_SET(pid,sTempChd)>0;

END WHILE ;

RETURN sTemp;

END

感觉和sql没什么关系,我这边直接执行这几句sql也是报错,调整后通过,所以现在需要确定的有两点:

  1. 软件是否正确连接上observer;
  2. 所表示对应的函数是否正常

调整后sql如下,可以直接导入尝试:

CREATE DEFINER = root@`%` FUNCTION getChildList(rootId varchar (100)) RETURNS longtext
begin
    DECLARE sTemp longtext ;
DECLARE sTempChd longtext;
SET sTemp = '$';
SET sTempChd :=rootId ;
WHILE sTempChd is not null DO
 SET sTemp = concat(sTemp,',',sTempChd);
SELECT group_concat(id) INTO sTempChd FROM tbl_org where FIND_IN_SET(pid,sTempChd)>0;
END WHILE ;
RETURN sTemp;
END

老师,我们用您的这个是好使。知道问题出在哪里了,CREATE DEFINER = root@%是好使的。CREATE DEFINER = root@localhost有问题,应该是分布式数据库无法识别localhost。
感谢老师了

不客气,这个可以作为使用navicat迁移到OceanBase的一个经验,迁移失败有时候是生成的数据问题,所以得实际看对应的sql是否匹配,所以我们还有作为迁移类生态工具的oms会做对应的检查,navicat高版本已经支持了原生oceanbase,也可以试用下,可能和版本也有关系

好的。我们后续升级下navicat试下