Tuning/restart 应用程序启动时来自代码的 postgresql 服务器

Tuning/restart postgresql server from code on application startup

我有一个 C# 应用程序,它应该在应用程序首次启动时将 postgresql 服务器的 shared_buffers 设置为至少 512MB。所以,我需要在我的代码中执行以下操作:

  1. 检查 shared_buffers 是否小于 512MB。
  2. shared_buffers 设置为 512MB。
  3. 重新启动 postgresql 服务器以应用更改。
  4. 重启完成后继续运行申请。

如何在代码中执行此操作?

PostgreSQL 9.4及以上版本可以使用ALTER SYSTEM SET修改postgresql.auto.conf增加参数

所以你可以:

SHOW shared_buffers;

如果太低:

ALTER SYSTEM
  SET shared_buffers = '512MB';

然后您必须重新启动 PostgreSQL。按照设计,这不能从 PostgreSQL 内部完成,因为如果在重新启动期间出现问题,那么您将无法再连接到它,因此您很容易将自己锁在外面。您可以 使用 SELECT pg_reload_conf() 重新加载配置 ,但 shared_buffers 仅在完全重启时生效,而不仅仅是配置重新加载。

因此,一旦您更改了配置,您的应用程序将需要使用特定于外部 OS 和特定于安装方法的方式来重新启动 PostgreSQL。或者只是告诉用户为您重新启动它。

重启:

  • 对于自定义安装和管理 PostgreSQL 的任何平台(Windows、Mac 或 Linux),请使用 pg_ctl restart.

  • 在 Windows 上,作为服务安装:使用 net stop [servicename] 然后 net start [servicename]

  • 在系统范围内安装了 PostgreSQL 的旧版 Linux(pre-systemd)上:使用 service 命令,例如service restart [servicename]。这必须是 运行 作为 root 或通过 sudo。

  • 在较新的 Linux (systemd) 上,系统范围内安装了 PostgreSQL:使用 systemctl restart [servicename].service


如果您使用的是没有 ALTER SYSTEM SET 的旧 PostgreSQL,则必须打开、修改并写入 postgresql.conf

为了避免解析和修改整个 postgresql.conf,我发现附加 include_dir = 'conf.d' 选项很有用,然后在数据目录中创建一个 conf.d/myapp.conf,仅使用配置覆盖我想。

include_dir is available in 9.3 and newer。对于更旧的版本,您只需直接修改 postgresql.conf


如果您的应用首先负责安装和设置 PostgreSQL,您可以在 initdb 之后和启动数据库之前在配置文件中设置所需的 shared_buffers

如果您在应用程序中捆绑 PostgreSQL,这是我强烈推荐的方法。不要使用安装程序,只需将二进制文件捆绑在安装程序中即可。通过直接调用 postgres 命令或使用 pg_ctl 在您的应用程序启动时启动 PostgreSQL。当你的程序退出时停止它。使用非默认端口(即不要使用端口 5432),在 postgres 用户下执行 not 安装,将数据目录放入 %PROGRAMDATA%\MyApp\postgres否则避免与官方 PostgreSQL 安装冲突。这会让你省去很多痛苦。

参见:

  • Installation of postgresql with NSIS
  • Adding PostgreSQL installer to my own application installer