Postgres pg_dump

时间:2016-05-03 19:22:51

标签: postgresql pentaho corruption jackrabbit

尝试备份postgres数据库时,我的自动化pg_dump进程失败了。我收到的错误消息:

错误消息:

  

pg_dump:来自服务器的错误消息:错误:内存分配无效   请求尺寸1249770967 pg_dump:命令是:COPY   public.data_store(id,length,last_modified,data)TO stdout;   自定义备份的jackrabbit pg_dump:SQL命令失败pg_dump:错误   来自服务器的消息:错误:无效的内存分配请求大小   1249770967 pg_dump:命令为:COPY public.data_store   (id,length,last_modified,data)TO stdout; [!!错误!!]失败了   生成自定义备份数据库jackrabbit pdi_logging的普通备份   pdi_logging的自定义备份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;

调用函数select find_bad_row('public.data_store')后,给出的结果为(0,2)。我在表格中搜索了ctid,select ctid, * from public.data_store,并删除了前一行。然后我执行了我的pg_dump脚本并收到了同样的错误。重新运行表上的函数将再次返回第一行的结果。刚接触postgres是我的方法完全错误,还有另一种解决方法吗?难道整个桌子都腐败了吗?

0 个答案:

没有答案