PostgreSQL,使用自定义函数进行备份/恢复

时间:2014-01-25 22:59:36

标签: postgresql

我第一次尝试在PostgreSQL中使用自定义函数,例如first and last什么是好的,可能会看到here

由于我通过.NET使用PostgreSQL,我有备份和恢复数据库的功能,长期以来也很好用。
现在,当我在PostgreSQL中有自定义函数时,我无法获得归档数据库 这是从CMD窗口复制的系统说的:

  

pg_restore:创建FUNCTION first_agg(anyelement,anyelement)
  pg_restore:[archiver(db)]处理TOC时出错:
  pg_restore:[archiver(db)]来自TOC条目208的错误; 1255 42417功能first_   post(任意元素,任意元素)postgres
  pg_restore:[archiver(db)]无法执行查询:ERROR:function“first_agg   “已存在相同的参数类型
      命令是:CREATE FUNCTION first_agg(anyelement,anyelement)RETURNS anyel   EMENT
      LANGUAGE sql IMMUTABLE STRICT
      AS $ _ $ SE ...
  pg_restore:创建FUNCTION last_agg(anyelement,anyelement)
  pg_restore:[archiver(db)]来自TOC条目212的错误; 1255 42419功能last_a   postgres gg(anyelement,anyelement)   pg_restore:[archiver(db)]无法执行查询:ERROR:function“last_agg”
   已经存在相同的参数类型
      命令是:CREATE FUNCTION last_agg(anyelement,anyelement)RETURNS anyele   换货
      LANGUAGE sql IMMUTABLE STRICT
      AS $ _ $ SEL ...
  pg_restore:首先创建AGGREGATE(任意元素)
  pg_restore:[archiver(db)]来自TOC条目654的错误; 1255 42418首先聚集   (任何元素)postgres
  pg_restore:[archiver(db)]无法执行查询:ERROR:function“first”al   ready存在与相同的参数类型
      命令是:首先创建AGGREGATE(任意元素)(
      SFUNC = first_agg,
      STYPE = anyelement
  );
  pg_restore:最后创建AGGREGATE(anyelement)
  pg_restore:[archiver(db)]来自TOC条目655的错误; 1255 42420 AGGREGATE last(   postgres
  pg_restore:[archiver(db)]无法执行查询:错误:函数“last”alr   eady存在相同的参数类型
      命令是:CREATE AGGREGATE last(anyelement)(
      SFUNC = last_agg,
      STYPE = anyelement
  );

这是我的备份和恢复命令:

C:\Program Files (x86)\PostgreSQL\9.3\bin\pg_dump.exe" --host localhost 
--port 5432 --username "postgres" --no-password --verbose -F t 
--file "C:\Archives\mydatabase.tar" "mydatabase"   

C:\Program Files (x86)\PostgreSQL\9.3\bin\pg_restore.exe"  -i -h localhost 
-p 5432 -U "postgres" -d "mydatabase" -v "C:\Archives\mydatabase.tar"

目前我没有任何损坏,但问题如何在涉及自定义功能时进行备份和恢复?它们也可以与数据一起传输吗?或者必须从备份中排除?如何改进显示备份和恢复命令,这些过程如前所述顺利和正确?

1 个答案:

答案 0 :(得分:1)

可能有两种解释。

首先,您可能正在将备份还原到非空的数据库中,实际上已经包含这些功能(尽管不能保证它们的定义相同!) - 根据马的评论。您可以使用pg_restore的--clean选项来删除此类定义。您还可以添加--create选项,以便它可以删除然后重新创建整个数据库。

另一种可能性是你在template1数据库中定义了这些函数。该数据库中定义的任何内容都将复制到您创建的任何新数据库中。在这种情况下,最好在恢复之前从template1中删除这些定义。