AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 278769
Accepted
Joe
Joe
Asked: 2020-10-28 12:16:31 +0800 CST2020-10-28 12:16:31 +0800 CST 2020-10-28 12:16:31 +0800 CST

调试 Postgres 为什么要为函数使用已卸载的扩展

  • 772

我最近将一个 Postgres 函数app_user_id从一个旧的自定义扩展名intpair移到了一个新的自定义扩展名heap_exts. 除了我从 Postgres 备份恢复的机器之外,这运行良好。

这是错误:

db=> select app_user_id(1, 2);
ERROR:  could not access file "$libdir/intpair": No such file or directory

intpair未安装并heap_exts已安装,如以下输出所示\dx:

-[ RECORD 3 ]-------------------------------------------------------------
Name        | heap_exts
Version     | 1.0
Schema      | public
Description | 

-- No mention of intpair

该功能app_user_id在系统目录中列为归heap_exts:

SELECT e.extname, ne.nspname AS extschema, p.proname, np.nspname AS proschema
FROM pg_catalog.pg_extension AS e
INNER JOIN pg_catalog.pg_depend AS d ON (d.refobjid = e.oid)
INNER JOIN pg_catalog.pg_proc AS p ON (p.oid = d.objid)
INNER JOIN pg_catalog.pg_namespace AS ne ON (ne.oid = e.extnamespace)
INNER JOIN pg_catalog.pg_namespace AS np ON (np.oid = p.pronamespace)
WHERE d.deptype = 'e'
  AND e.extname IN ('heap_exts')
  AND p.proname = 'app_user_id'
ORDER BY 1, 3;
-[ RECORD 1 ]----------
extname   | heap_exts
extschema | public
proname   | app_user_id
proschema | public

我最初使用以下代码将该功能从旧扩展迁移intpair到新扩展:heap_exts

-- version 0.1 in heap_exts--0.1.sql
ALTER EXTENSION intpair  DROP FUNCTION app_user_id(bigint, bigint);
ALTER EXTENSION heap_exts ADD FUNCTION app_user_id(bigint, bigint);

但是,对于通过旧机器备份恢复的新机器,我app_user_id直接创建了函数,因为旧扩展intpair不再存在:

CREATE FUNCTION app_user_id(BIGINT, BIGINT) RETURNS app_user_id
AS 'MODULE_PATHNAME', 'app_user_id_make' LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;

为什么 Postgres 试图查看函数的intpair扩展app_user_id而不是查看heap_exts?

postgresql functions
  • 2 2 个回答
  • 70 Views

2 个回答

  • Voted
  1. Best Answer
    Ian Barwick
    2020-10-28T19:54:42+08:002020-10-28T19:54:42+08:00

    为什么 Postgres 试图在 intpair 扩展中查找 app_user_id 函数而不是在 heap_exts 中查找?

    听起来您仍然有(或有)一个指向旧函数定义(将是)的条目pg_proc。app_user_id(bigint, bigint)probin$libdir/intpair

    假设那里有一个条目,我猜它与旧intpair扩展名没有正确关联(可能是手动添加的,或者代码早于 PostgreSQL 的扩展功能并且该功能被遗漏了CREATE EXTENSION FROM unpackaged或其他东西)所以当扩展名已被删除,因此仍存在于您恢复的实例中 - 当然,相关的扩展名库文件不再存在。

    问题是该pg_proc条目是否以某种方式最终与您的新扩展相关联,或者您有两个pg_proc用于该功能的条目。

    您的上述查询报告的这个修改版本是什么?

    SELECT e.extname, ne.nspname AS extschema, p.proname, np.nspname AS proschema, p.probin
    FROM pg_catalog.pg_extension AS e
    INNER JOIN pg_catalog.pg_depend AS d ON (d.refobjid = e.oid)
    INNER JOIN pg_catalog.pg_proc AS p ON (p.oid = d.objid)
    INNER JOIN pg_catalog.pg_namespace AS ne ON (ne.oid = e.extnamespace)
    INNER JOIN pg_catalog.pg_namespace AS np ON (np.oid = p.pronamespace)
    WHERE d.deptype = 'e'
      AND p.proname = 'app_user_id'
    ORDER BY 1, 3;
    
    • 2
  2. Joe
    2020-10-28T13:41:35+08:002020-10-28T13:41:35+08:00

    我找到了解决方法,但作为答案并不令人满意。我只是尝试安装旧的扩展。正如预期的那样,安装扩展失败,因为函数定义重叠。

    psql -c 'CREATE EXTENSION intpair'
    ERROR:  function "app_user_id" already exists with same argument types
    

    尽管有错误,但这似乎修复了函数到扩展的 Postgres 映射。

    • 0

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve