我们有一个使用postgres作为其数据库的C#程序,因此我们希望将安装程序中的postgres捆绑为半静默安装,即用户将收到有关强制安装的通知,但安装本身将自动无需用户输入即可完成。
在研究了对WiX,Inno Setup和NSIS的意见后,我们决定使用NSIS。 我认为最简单的方法是包含postgres的二进制.zip分配并在脚本中执行以下操作:
我对这种情况有几个疑问:
Q1:我是否在正确的轨道上?
Q2:我可以以某种方式将超级用户密码传递给initdb.exe,因此它不会要求用户通过控制台输入吗?
问题3:在哪里以及如何更改postgres将侦听的端口,以便我不与其他已安装的实例发生冲突?
问题4:卸载时是否只需使用pg_ctl.exe取消注册该服务并删除所有文件夹即可?
PS:我觉得这些问题是相互联系的,所以我把它们放在一起。但如果需要,我可以在不同的问题中将它们分开。答案 0 :(得分:3)
这是正确的。
请不使用端口5432进行PostgreSQL。选择一个远离该范围的非默认端口,如5599或其他东西。通过修改postgresql.conf并设置port
指令来更改端口。您可能会发现只需在主include_dir = conf.d
中添加postgresql.conf
或类似内容,然后使用配置覆盖创建datadir\conf.d\myapp.conf
即可。
要在没有提示的情况下设置initdb
的密码,请传递--pwfile=/path/to/file
选项。第一行将被读作密码。请参阅initdb。
您的卸载计划合理且正确。
考虑升级 - 不要把自己描绘成一个角落。您希望能够并行安装9.5到9.4和pg_upgrade
,除非您只想使用转储和恢复。
我建议将PostgreSQL二进制文件安装到%PROGRAMFILES%\MyApp\PostgreSQL\9.4
。您应该将数据库放入%PROGRAMDATA%\MyApp\PostgreSQL\9.4
而不是应用程序的%PROGRAMFILES%
目录。 (PostgreSQL安装程序也应该这样做;它的当前行为是一个应该修复的历史工件。)
请记录您的应用程序捆绑PostgreSQL,以便没有人"清理"它,所以我们还没有另一个应用程序喷出混淆用户的pgsql-general。对于愤怒的用户而言,这是令人厌倦的解释"我们"没有在他们的系统上安装PostgreSQL,我们无法删除它,它可能在那里,因为它是由他们使用的东西安装的,如果他们删除它,那么它就会停止工作。同样地,对刚刚杀死PostgreSQL进程并删除了他们的PostgreSQL数据目录的用户来说很难解释我们无法获得他们的Poker Tracker(或其他)数据库因为他们刚刚删除了它...
确保您的应用程序公开了为用户执行PostgreSQL转储和还原的功能。
用户手册必须明确说明他们需要采取额外的备份步骤来保护应用中的数据。您不能只使用Windows备份来获得可靠的PostgreSQL备份,因为它必须一起复制多个文件;它会复制每个文件,但除非PostgreSQL在备份之前停止,否则合并后的结果将无法使用。要进行实时备份,您需要采取特殊步骤 - pg_start_backup()
,复制,pg_stop_backup()
并存档额外的WAL段,或使用pg_basebackup
。