Postgresql 博士后pg_转储

Postgresql 博士后pg_转储,postgresql,pentaho,corruption,jackrabbit,Postgresql,Pentaho,Corruption,Jackrabbit,我的自动pg_转储过程在尝试备份postgres数据库时失败。我收到的错误消息: 错误消息: pg_转储:来自服务器的错误消息:错误:内存分配无效 请求大小1249770967 pg_dump:命令为:COPY public.data_存储(id、长度、上次修改、数据)到标准输出; jackrabbit pg_转储的自定义备份:SQL命令失败pg_转储:错误 来自服务器的消息:错误:内存分配请求大小无效 1249770967 pg_dump:命令为:COPY public.data_store

我的自动pg_转储过程在尝试备份postgres数据库时失败。我收到的错误消息:

错误消息:

pg_转储:来自服务器的错误消息:错误:内存分配无效 请求大小1249770967 pg_dump:命令为:COPY public.data_存储(id、长度、上次修改、数据)到标准输出; jackrabbit pg_转储的自定义备份:SQL命令失败pg_转储:错误 来自服务器的消息:错误:内存分配请求大小无效 1249770967 pg_dump:命令为:COPY public.data_store (id、长度、上次修改、数据)到标准输出;[!!错误!!]无法删除 生成自定义备份数据库jackrabbit pdi_日志的普通备份 pdi_日志的自定义备份postgres的普通备份 postgres石英普通备份石英定制备份

根据我的发现,一切似乎都指向表中损坏的数据,因此我创建了一个函数来查询表并提取ctid,这样我就可以找到罪魁祸首并删除损坏的行

功能:

CREATE OR REPLACE FUNCTION find_bad_row(tablename text)
 RETURNS tid AS
$BODY$
DECLARE
result tid;
curs REFCURSOR;
row1 RECORD;
row2 RECORD;
tabName TEXT;
count BIGINT := 0;
BEGIN
SELECT reverse(split_part(reverse($1), '.', 1)) INTO tabName;

OPEN curs FOR EXECUTE 'SELECT ctid FROM ' || tableName;

count := 1;
FETCH curs INTO row1;

WHILE row1.ctid IS NOT NULL LOOP
result = row1.ctid;

count := count + 1;
FETCH curs INTO row1;

EXECUTE 'SELECT (each(hstore(' || tabName || '))).* FROM '
|| tableName || ' WHERE ctid = $1' INTO row2
USING row1.ctid;

IF count % 100000 = 0 THEN
RAISE NOTICE 'rows processed: %', count;
END IF;
END LOOP;

CLOSE curs;
RETURN row1.ctid;
EXCEPTION
WHEN OTHERS THEN
RAISE NOTICE 'LAST CTID: %', result;
RAISE NOTICE '%: %', SQLSTATE, SQLERRM;
RETURN result;
END
$BODY$
 LANGUAGE plpgsql VOLATILE
 COST 100;
ALTER FUNCTION find_bad_row(text)
 OWNER TO pentaho;

调用函数
选择find\u bad\u row('public.data\u store')
后,给出的结果是(0,2)。我从public.data\u store中搜索表中的ctid,
选择ctid,*并删除了前一行。然后我执行了我的pg_dump脚本并收到了相同的错误。在表上重新运行函数将再次返回第一行的结果。作为博士后的新手,我的方法完全是错误的,有没有其他方法来解决这个问题?是否整个表都已损坏

可能您的表都没有损坏,只是行太大,无法容纳1GB的文本。您能否共享函数的整个输出,其中应包括通知和错误消息?输出仅显示一列和一行-“find_bad_row”,并始终从表的第一行生成第一个CTID。我没有收到任何错误消息。当尝试从仅有9k行的整个表中选择*时,我收到以下错误:“与服务器失去同步:获取消息类型“D”,长度659014525”,并且我已断开与服务器的连接。请尝试
设置要注意的客户端最小消息
在运行函数之前,如果仍然看不到通知输出,请切换到具有显示它们功能的SQL客户端,如
psql
。当该函数在一行中出现任何错误时,它会发出
raisenotice“%:%”、SQLSTATE、SQLERRM
,并且(我认为)您真的不想错过该错误消息。