PostgreSQL 12中public.powa_take_snapshot()函数报错求助
PostgreSQL 12中POWA快照报错的解决思路
问题现象
数据库日志中出现POWA后台worker报错:
2023-10-07 16:03:06 UTC:LOG: POWA connected to database powa 2023-10-07 16:03:06 UTC:ERROR: query returned more than one row 2023-10-07 16:03:06 UTC:HINT: Make sure the query returns a single row, or use LIMIT 1. 2023-10-07 16:03:06 UTC:CONTEXT: PL/pgSQL function powa_take_snapshot(integer) line 31 at SQL statement SQL statement "SELECT public.powa_take_snapshot()" 2023-10-07 16:03:06 UTC:LOG: background worker "powa" (PID 34049) exited with exit code 1
手动执行无参的SELECT public.powa_take_snapshot();时,提示函数不存在:
ERROR: function public.powa_take_snapshot() does not exist LINE 1: SELECT public.powa_take_snapshot() ^ TIP: No function matches the given name and argument types. You may need to add an explicit type conversion
解决步骤
确认函数的正确调用方式与所在数据库
日志显示POWA连接的是powa数据库,且报错的是带整数参数的powa_take_snapshot(integer)函数,而非无参版本。先切换到powa数据库,执行\df powa_take_snapshot查看函数的参数定义,调用时需传入正确参数,比如SELECT public.powa_take_snapshot(1);(参数值需根据POWA配置确定)。修复函数内部多返回行问题
报错根源是powa_take_snapshot(integer)函数第31行的SQL语句返回了多行,需调整该语句确保仅返回一行:- 切换到
powa数据库,执行以下语句查看函数源码:SELECT prosrc FROM pg_proc WHERE proname = 'powa_take_snapshot' AND pronargs = 1; - 定位到第31行的SQL查询,添加
LIMIT 1或者修改查询条件,保证结果唯一。 - 重新创建该函数(如果需要)。
- 切换到
重新安装POWA扩展
如果函数本身存在损坏或定义异常,可尝试卸载并重新安装POWA扩展:-- 切换到powa数据库 \c powa -- 卸载扩展 DROP EXTENSION powa; -- 重新安装 CREATE EXTENSION powa;注意操作前备份POWA相关监控数据。
检查POWA后台worker配置
确认postgresql.conf中的以下配置正确:shared_preload_libraries = 'powa' # 确保包含powa powa.database = 'powa' # 指定POWA使用的数据库修改配置后重启数据库,检查后台worker是否正常启动。
内容的提问来源于stack exchange,提问作者lk2_89
相关产品推荐
相关产品推荐

