【 使用环境 】生产环境
【 使用版本 】ocp4.0
【问题描述】通过navicat同步过来的函数,执行报错User not exist,同时导入的函数在navicat看不到,在DBerver能看到
可以补充下操作流程么,还有observer的版本
navicat直接同步到ocp的数据库里面的,observer4.0版本
navicat版本呢,我这边尝试复现下。另外想问下有试过使用oms做迁移么
navicat版本12.1.27,没有使用oms,使用是数据传输的功能
方便提供下报错的日志么,报错User not exist看起来像配置问题,同批导入的其他sql没有报错?
DBeaver我这边试了下,是有报错的,但是是sql的问题,方便把你的sql报错发下么?此外observer应该也有对应User not exist的报错,麻烦传下日志
同时数据迁移这块建议试用下oms
函数内容可以用show create procedure ${plName};来看
不用所有的,${oceanbasehome}/log/ 下的文件都是可以删除的,值截取触发的log就行,也可以使用类似
tail -f *|grep "ret=-1449’这样的方式来获取新触发的日志,在获取到新触发的bug日志后有个 transId(YB带头的),再根据这个值进行整体筛选就行
[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也是报错,调整后通过,所以现在需要确定的有两点:
- 软件是否正确连接上observer;
- 所表示对应的函数是否正常
调整后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试下