Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL,具有自定义功能的备份/恢复_Postgresql - Fatal编程技术网

PostgreSQL,具有自定义功能的备份/恢复

PostgreSQL,具有自定义功能的备份/恢复,postgresql,Postgresql,这是我第一次尝试在PostgreSQL中使用自定义函数,就像我们看到的一样 因为我通过.NET使用PostgreSQL,所以我有备份和恢复数据库的功能,这在很长一段时间内都是正常的。 现在,当我在PostgreSQL中使用自定义函数时,我无法取回存档的数据库。 这是从CMD窗口复制的系统说明: pg\u restore:首先创建函数\u agg(anyelement,anyelement) pg_restore:[archiver(db)]处理TOC时出错: pg_restore:[archiv

这是我第一次尝试在PostgreSQL中使用自定义函数,就像我们看到的一样

因为我通过.NET使用PostgreSQL,所以我有备份和恢复数据库的功能,这在很长一段时间内都是正常的。
现在,当我在PostgreSQL中使用自定义函数时,我无法取回存档的数据库。
这是从CMD窗口复制的系统说明:

pg\u restore:首先创建函数\u agg(anyelement,anyelement)
pg_restore:[archiver(db)]处理TOC时出错:
pg_restore:[archiver(db)]来自TOC条目208的错误;1255 42417功能优先_ agg(anyelement,anyelement)postgres
pg_restore:[archiver(db)]无法执行查询:错误:函数“first_agg” “已存在相同的参数类型
命令was:CREATE FUNCTION first_agg(anyelement,anyelement)返回anyel 电子束
语言sql不可变严格
作为$\u$SE…
pg\u restore:创建函数last\u agg(anyelement,anyelement)
pg_restore:[archiver(db)]来自TOC条目212的错误;1255 42419最后的功能 gg(任意元素,任意元素)postgres
pg_restore:[archiver(db)]无法执行查询:错误:函数“last_agg”
已存在相同的参数类型
命令was:CREATE函数last_agg(anyelement,anyelement)返回anyele 装饰
语言sql不可变严格
作为$\u$SEL…
pg_restore:首先创建聚合(anyelement)
pg_restore:[archiver(db)]来自TOC条目654的错误;1255 42418骨料优先 (任意元素)博士后
pg_restore:[archiver(db)]无法执行查询:错误:函数“first”al ready以相同的参数类型存在
命令是:首先创建聚合(anyelement)(
SFUNC=第一次聚集,
STYPE=anyelement
);
pg_restore:创建聚合最后一个(anyelement)
pg_restore:[archiver(db)]来自TOC条目655的错误;1255 42420总末( anyelement)postgres
pg_restore:[archiver(db)]无法执行查询:错误:函数“last”alr eady以相同的参数类型存在
命令是:创建聚合最后一个(anyelement)(
SFUNC=最后一次聚集,
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"

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

对此可以有两种解释

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


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

您似乎正在将备份还原到已包含这些函数(或其不同版本)的数据库中。您需要在运行
pg_restore
之前删除所有内容,或者在导入之前使用
--clean
选项删除所有内容。顺便说一句:您应该将函数的源代码存储在版本控制系统中(最好与Liquibase或Flyway等工具结合使用,以实现适当的部署过程)。这比备份整个数据库要好得多。@name,谢谢你的解释,我现在明白什么是问题了。你能给我一些正确部署过程的链接吗?我想现在明白了。在恢复之前,我会从数据库中删除所有表,所以现在我也需要删除函数,因为我并没有使用函数,所以以前不需要删除函数。手动删除这些函数可能比使用--clean更好,因为有些函数可能需要保留在那里。