PostgreSQL(ERROR: cache lookup failed for function 1)错误解决

本文详细讲述了前端同事遇到的PostgreSQL中c存储过程创建失败问题,通过调试发现语言验证函数号错误,并提供了解决方案,包括更新pg_language表的lanvalidator。涉及数据库管理与后端技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨天接到同事求助,前端应用连接某个PostgreSQL 9.6.13库上后无法创建某个Type,远程发现是因为创建Type的时候需要创建c的存储过程,在创建c的存储过程中报错,导致无法创建该Type。

错误如下:   

test=# CREATE OR REPLACE FUNCTION sde.st_geometry_release()
RETURNS text
LANGUAGE c
IMMUTABLE PARALLEL SAFE STRICT
AS 'st_geometry', $function$ST_Geometry_Release$function$;
ERROR:  cache lookup failed for function 1

  由于extension后台也都是c的存储过程形式存在,因此也报同样的问题:

  test=# create extension pageinspect;
  ERROR:  cache lookup failed for function 1 

解决过程:

  打开PostgreSQL调试功能,进行代码调试(具体调试方式可以到网上查找相关资料,在此不进行详细介绍):

  发现在CreateFunction函数中,要先从pg_language字典表的lanvalidator中获取c的validator的函数号,通过查询

test=# select oid,ctid,* from pg_language;
  oid  |  ctid  | lanname  | lanowner | lanispl | lanpltrusted | lanplcallfoid | laninline | lanvalidator | lanacl
-------+--------+----------+----------+---------+--------------+---------------+-----------+--------------+--------
    12 | (0,1)  | internal |       10 | f       | f            |             0 |         0 |         2246 |
    14 | (0,3)  | sql      |       10 | f       | t            |             0 |         0 |         2248 |
 13315 | (0,4)  | plpgsql  |       10 | t       | t            |         13312 |     13313 |        13314 |
    13 | (0,25) | c        |       10 | f       | f            |             0 |         0 |            1 |

   发现c的验证函数号是1,这导致后续ProcedureCreate中执行这个函数的时候找不到,因此报上面的错误。

   查询了正常的库,c库的lanvalidator正常的号是2247,而且是是在0页的2的位置上,不清楚为什么被更新了这么多次。

解决方法:

test=# update pg_language set lanvalidator=2247 where oid=13;
UPDATE 1
test=# select oid,ctid,* from  pg_language;
  oid  |  ctid  | lanname  | lanowner | lanispl | lanpltrusted | lanplcallfoid | laninline | lanvalidator | lanacl
-------+--------+----------+----------+---------+--------------+---------------+-----------+--------------+--------
    12 | (0,1)  | internal |       10 | f       | f            |             0 |         0 |         2246 |
    14 | (0,3)  | sql      |       10 | f       | t            |             0 |         0 |         2248 |
 13315 | (0,4)  | plpgsql  |       10 | t       | t            |         13312 |     13313 |        13314 |
    13 | (0,26) | c        |       10 | f       | f            |             0 |         0 |         2247 |
(4 rows)
test=# select * from pg_proc where oid=2247;
-[ RECORD 1 ]---+-----------------
proname         | fmgr_c_validator
pronamespace    | 11
proowner        | 10
prolang         | 12
procost         | 1
prorows         | 0
provariadic     | 0
protransform    | -
proisagg        | f
proiswindow     | f
prosecdef       | f
proleakproof    | f
proisstrict     | t
proretset       | f
provolatile     | s
proparallel     | s
pronargs        | 1
pronargdefaults | 0
prorettype      | 2278
proargtypes     | 26
proallargtypes  |
proargmodes     |
proargnames     |
proargdefaults  |
protrftypes     |
prosrc          | fmgr_c_validator
probin          |
proconfig       |
proacl          |

test=#  CREATE OR REPLACE FUNCTION sde.st_geometry_release()
test-#  RETURNS text
test-#  LANGUAGE c
test-#  IMMUTABLE PARALLEL SAFE STRICT
test-# AS 'st_geometry', $function$ST_Geometry_Release$function$
test-# ;
CREATE FUNCTION
test=# create extension pageinspect;
CREATE EXTENSION

根据提供的引用内容,"cache lookup failed for type 7594"是一个报错信息,它表明在查询数据库时发生了一个缓存查找失败的错误。具体的解决方案可能因情况而异,但可以参考以下引用内容提供的一些建议。 引用中提到的报错信息显示了可能存在于数据库连接的问题,其中包括错误SQL语句以及与PostgreSQL相关的错误。在这种情况下,可以考虑检查数据库连接配置是否正确,并确保数据库是否正常运行。如果可能的话,还可以尝试重新启动数据库解决问题。 引用中提到的现场服务器配置信息显示了物理内存、共享缓存和数据库连接等参数。根据这些信息,可以考虑调整数据库的共享缓存大小,如将"shared_buffers"参数设置为更合适的大小。 引用中提到的解决方案包括将视图改为表,直接从表中获取数据,以及修改现场服务的PostgreSQL配置。具体来说,可以尝试将相关数据从视图改为表,并根据需要修改数据库的一些参数,如"shared_buffers"、"work_mem"和"effective_cache_size"等。修改完成后,需要重新启动数据库才能使更改生效。 综上所述,解决"cache lookup failed for type 7594"的问题可能需要检查数据库连接配置、重新启动数据库、调整数据库的共享缓存大小以及修改相关的PostgreSQL配置参数。具体的解决方法应根据情况来确定。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【索引类型、数据库版本】PSQL报错:cache lookup failed for type 0](https://blog.youkuaiyun.com/qq_40605238/article/details/122088111)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值