下面是测试用例和结果:
drop table if exists test1;
drop table if exists test2;
drop trigger if exists test1_tr on test1;
drop function if exists tf_test1;
create table test1 (name varchar(8) not null);
create table test2 (name varchar(8) not null);
\echo create trigger function tf_test1
CREATE OR REPLACE FUNCTION tf_test1() RETURNS trigger AS $BODY$
BEGIN
IF TG_OP = 'INSERT' THEN
INSERT INTO test2(name) VALUES (NEW.name);
END IF;
return new;
END
$BODY$
LANGUAGE 'plpgsql';
\echo create trigger test1_tr
CREATE TRIGGER test1_tr
AFTER INSERT OR UPDATE OR DELETE ON test1 FOR EACH ROW
EXECUTE PROCEDURE tf_test1();
\echo Insert
insert into test1 (name) values ('NAME_001');
insert into test1 (name) values ('NAME_002');
insert into test1 (name) values ('NAME_003');
insert into test1 (name) values ('NAME_004');
\echo Select test1
select * from test1;
\echo Select test2
select * from test2;DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TRIGGER
DROP FUNCTION
CREATE TABLE
CREATE TABLE
create trigger function tf_test1
CREATE FUNCTION
create trigger test1_tr
CREATE TRIGGER
Insert
INSERT 0 1
psql:test3.sql:28: ERROR: cache lookup failed for type 113
CONTEXT: SQL statement "INSERT INTO test2(name) VALUES (NEW.name)"
PL/pgSQL function tf_test1() line 4 at SQL statement
INSERT 0 1
INSERT 0 1
Select test1
name
----------
NAME_001
NAME_003
NAME_004
(3 rows)
Select test2
name
----------
NAME_001
NAME_003
NAME_004
(3 rows)我们有几台服务器运行不同风格的RHEL 7.x。所有Postgres实例都是v11。这发生在大约1/2的人身上。似乎没有任何一致的RH版本是罪魁祸首。
我已经在pg_class和pg_type中查询了作为缺失类型引用的OID。在所有情况下,结果集都是空的。
任何帮助都是非常感谢的。
我也希望能深入了解Postgres正在发生的事情。我是一名长期的Oracle DBA,但对Postgres来说还是个新手。这看起来像是Postgres的内部错误,并不是真正的代码问题,但网络搜索并没有找到太多。
发布于 2021-08-31 20:10:33
对此进行后续操作,以提供一些闭包。我们已经在Postgresql.conf文件中增加了缓冲区和有效的缓存大小,并且在PG内存配置参数超过机器的物理内存的机器上打开了(pgaudit ) full blast...For的审计,并且打开了审计,我们会得到缓存查找错误。关于这一点的一个线索是,错误会在作业流中四处跳跃,在机器之间不一致,并且是有效的不可压缩的错误(删除有问题的触发器只会导致作业流中其他地方的缓存错误)。
现在,我们已经增加了服务器的物理内存,并关闭了审计。缓存查找错误消失了。还需要进一步的调整,这样我们才能最终重新启用审计。
https://stackoverflow.com/questions/68956194
复制相似问题