更新时间:2023-10-16 GMT+08:00
全量同步失败报错,关键词“function *** does not exist”
场景描述
全量同步期间DRS任务报错,同步日志界面提示:service DATAMOVE failed, cause by: apply event=[type=table_structure, index=%s, schema_name=%s, object_name=%s] occur error, msg=ERROR: function *** does not exist Hint: No function matches the given name and argument types. You might need to add explicit type casts.
可能原因
目标库未提前创建表结构依赖的函数。DRS PostgreSQL->PostgreSQL表级同步场景下,不支持函数和插件对象的同步,所以需要手动在目标库创建表结构依赖的函数。
可登录至目标库RDS for PostgreSQL的相应库(database),执行如下SQL查看对应函数是否存在,其中f_name为对应函数名称:
select n.nspname,p.proname,pg_get_functiondef(p.oid) as funcdef from pg_proc p left join pg_namespace n on p.pronamespace=n.oid where proname ='f_name';
解决方案
缺少的函数可能属于某个插件,也可能是用户自建的函数。可按照如下步骤在源库检查函数的来源,并在目标库创建对应插件或者自建函数后,重试DRS任务。
- 登录源库,执行如下SQL查询函数所属的插件,其中f_name为对应函数名称。
select extname, nspname, proname,pg_get_function_arguments(c.oid) as funcargs from pg_extension e join pg_depend d on (d.refobjid=e.oid) join pg_proc c on (d.objid=c.oid) join pg_namespace n on c.pronamespace=n.oid where proname ='f_name';
- 如果函数属于某个插件,则在目标库RDS for PostgreSQL的管理页面中选择插件管理,安装对应的插件。
- 如果函数为用户自建函数,则在目标库创建与源库相同的函数,函数定义语句可参考如下SQL在源库执行的结果,其中f_name为对应函数名称。
select n.nspname,p.proname,pg_get_functiondef(p.oid) as funcdef from pg_proc p left join pg_namespace n on p.pronamespace=n.oid where proname ='f_name';
- 重试DRS任务。