[PGSQL]PostgreSQL中的参数的类型解释:如哪些参数改变后需要重启服务器

在PostgreSQL中,参数的访问和设置也分多种多样的,有些参数改变了必须重启服务器才能生效,有些参数用户可以直接改变,而有些参数需要超级用户才能改变,在PostsgreSQL中把参数分为以下几类:

  • internal:这些参数是只读参数,有些参数是postgres程序写死的或一些不同的编辑选项确定的;有些参数是数据库实例初使化时后就确定的了,即是根据创建实例时运行initdb使用不同的命令行选项而确定了不同的值。这类参数值不能配置在postgresql.conf中,因为它是由postgres程序和初始化实例时就写死的。
  • postmaster:这些参数的值在启动PostgreSQL实例时被确定,在postgresql.onf文件中改变这类参数值需要重启PostgreSQL实例。
  • sighup:在postgresql.onf文件中改变这些参数的值,不需要重启数据库,只需要向postmaster进程发送SIGHUP信号,让其重启装载配置新的参数的值就可以了。当然postmaster进程接收到SIGHUP信号后,也会象它的子进程发送SIGHUP信号,让新的参数值在所有的进程中都生效。
  • backend:在postgresql.conf更改这些设置可以无需重新启动服务器,只需要postmaster发送一个SIGHUP信号,让它重新读取postgresql.conf中新的配置值,但新的配置值只会出现在这之后的新的连接中,已有的连接不会改变这些参数的值。这些参数的值也可以在新建连接时,由连接的一些参数改变。例如,通过libpq的PGOPTIONS环境变量就可以改变本连接的配置值。
  • superuser:这类参数可以由超级用户使用set来改变。如检测死锁的超时时间的参数“deadlock_timeout”。而超级用户改变此参数值时只会自己的sesssion的配置,而不会影响其它用户的此参数的配置。通过向postmaster进程发送SIGHUP信号,也只会影响后续建的连接,在不会影响现有的连接。
  • user:这类参数可以普通用户就可以使用set命令来改变本连接中的配置值,这类参数除了可以普通用户就可以改变外,与superuser类参数没有区别。

如果可以通过查询pg_settings表中的context字段值来知道改变这个参数在postgresql.conf中的配置值时,是否需要重启数据库,例如: 例如我们想知道改变参数“wal_buffers”的值是否需要重启数据库,可以用以下SQL查询:

osdba=# select name,context from pg_settings where name like 'wal_buffers';
    name     |  context   
-------------+------------
 wal_buffers | postmaster
(1 row)

上面查询的结果是“postmaster”,说明此参数必须重启服务器才会生效。 例如我们想知道改变参数“local_preload_libraries”的值是否需要重启数据库,我们再查询一下:

osdba=# select name,context from pg_settings where name like 'local_preload_libraries';
          name           | context 
-------------------------+---------
 local_preload_libraries | backend
(1 row)

从上面看出参数的类型是“backend”,说明改变这个参数我们不需要重启数据库,只需要运行pg_ctl reload命令就可以了:

osdba@osdba-laptop:~/pgdata$ pg_ctl reload -D /home/osdba/pgdata
server signaled