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

PostgreSQL, backup/restore with custom functions

我第一次尝试在PostgreSQL中使用自定义函数,就像第一次和最后一次好的,可能会在这里看到。

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

pg_restore: creating FUNCTION first_agg(anyelement, anyelement)
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 208; 1255 42417 FUNCTION first_
agg(anyelement, anyelement) postgres
pg_restore: [archiver (db)] could not execute query: ERROR: function"first_agg
" already exists with same argument types
Command was: CREATE FUNCTION first_agg(anyelement, anyelement) RETURNS anyel
ement
LANGUAGE sql IMMUTABLE STRICT
AS $_$ SE...
pg_restore: creating FUNCTION last_agg(anyelement, anyelement)
pg_restore: [archiver (db)] Error from TOC entry 212; 1255 42419 FUNCTION last_a
gg(anyelement, anyelement) postgres
pg_restore: [archiver (db)] could not execute query: ERROR: function"last_agg"
already exists with same argument types
Command was: CREATE FUNCTION last_agg(anyelement, anyelement) RETURNS anyele
ment
LANGUAGE sql IMMUTABLE STRICT
AS $_$ SEL...
pg_restore: creating AGGREGATE first(anyelement)
pg_restore: [archiver (db)] Error from TOC entry 654; 1255 42418 AGGREGATE first
(anyelement) postgres
pg_restore: [archiver (db)] could not execute query: ERROR: function"first" al
ready exists with same argument types
Command was: CREATE AGGREGATE first(anyelement) (
SFUNC = first_agg,
STYPE = anyelement
);
pg_restore: creating AGGREGATE last(anyelement)
pg_restore: [archiver (db)] Error from TOC entry 655; 1255 42420 AGGREGATE last(
anyelement) postgres
pg_restore: [archiver (db)] could not execute query: ERROR: function"last" alr
eady exists with same argument types
Command was: CREATE AGGREGATE last(anyelement) (
SFUNC = last_agg,
STYPE = anyelement
);

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

1
2
3
4
5
6
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"

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


可能有两种解释。

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

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