文档首页> 数据复制服务 DRS> 故障排除> 失败案例> PostgreSQL->PostgreSQL实时同步> 全量同步失败报错,关键词“function *** does not exist”
更新时间: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任务。

  1. 登录源库,执行如下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';
    • 有查询结果,表示函数属于某个插件,结果中的extname字段即为插件名称,继续执行2
    • 无查询结果,表示函数不属于任何插件,为用户自建函数,执行3

  2. 如果函数属于某个插件,则在目标库RDS for PostgreSQL的管理页面中选择插件管理,安装对应的插件。
  3. 如果函数为用户自建函数,则在目标库创建与源库相同的函数,函数定义语句可参考如下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';

  4. 重试DRS任务。