Npgsql能否倾/恢复整个数据库?

3

是否有可能使用Npgsql以一种基本上模仿pg_dumpall的方式到一个单独的输出文件,而无需迭代遍历数据库中的每个表?相反,如果可能的话,我也想能够使用Npgsql来恢复整个数据库。

我知道在较新的Npgsql版本中,我可以使用BeginBinaryExportBeginTextExportBeginRawBinaryCopy方法将数据从数据库导出到STDOUT或文件中。在另一方面的过程中,我可以使用BeginBinaryImportBeginTextImportBeginRawBinaryCopy方法从STDIN或现有文件中进行导入。然而,根据我目前所能找到的资料,这些方法使用COPY SQL语法,该语法(据我所知)仅限于一张表。

我为什么要问这个问题? 我现在有一个旧的批处理文件,用于使用pg_dumpall.exe将生产数据库导出到文件中,然后再使用psql.exe<操作将其导入到我的测试环境中。这已经运行得相当顺畅了一段时间,但我们最近将服务器迁移到了外部托管环境,导致延迟,阻止了批处理文件的成功完成。由于其他连接/超时问题的可能性,我考虑将批处理文件的功能移植到.NET应用程序中,但这部分让我有点困惑。

感谢您的帮助,如果需要进一步的澄清,请告诉我。

1个回答

1

这个问题已经在https://github.com/npgsql/npgsql/issues/1397中提出。

简而言之,Npgsql没有任何支持整个数据库转储/恢复的功能。实现这一点需要相当大的努力,几乎需要重复所有pg_dump逻辑,并且存在遗漏和错误的风险。

如果您只需要为某些表转储数据,则如您所提到的,COPY API非常适合此类操作。但是,如果您还需要保存模式本身以及其他非表实体(序列状态、扩展等),则目前唯一的选择是作为外部进程执行pg_dump(或使用其他备份/恢复选项)。


1
感谢您的回复。根据您在这里和Github问题线程中的回答,我认为目前没有任何意图永远实现这样的功能。我知道我可以在我的.NET应用程序中使用Process对象来启动pg_dump可执行文件(我将努力实现以替换我的批处理文件),并且我了解尝试在Npgsql中实现功能的“危险”。即便如此,如果能够有一个可用于此目的的方法而无需诉诸于这种策略,那将是很好的。如果您决定这样做,我很乐意帮助测试。 - G_Hosa_Phat
1
由于这种功能存在的风险、涉及的工作量较大并且请求不多(只有第二次有人要求),我认为没有必要实现它。如果更多的人提出此类需求,情况可能会改变。 - Shay Rojansky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接