首页 > 技术文章 > pg数据库参数重载的问题

easonbook 2019-11-07 10:57 原文

问题

pg数据库的参数都是在postgresql.conf中,一般情况下,initdb后,数据库会给一个初始的配置参数。但是很多业务场景下,需要进行针对性的调整。但是调整完后,生效就比较头疼,有的参数是需要重启数据库的,有的只需要重载一下配置 文件,有的可以是会话级别的。这里配置文件就没有每个参数都说明生效方式。生产数据库进行重启的话,有时候是不太好操作的,因为会强制暂停业务,影响到业务的连续性。本文探讨的就是这个问题。

参数重载

更改参数的类别

在pg数据库中,有一个视图pg_settings,该视图详细地记录了每一个参数的名称、设定值、类别,最小值,最大值,上下文等等,这里关注一个字段上下文context字段。

postgres=# select distinct(context) from pg_settings;
      context
-------------------
 backend
 user
 internal
 postmaster
 superuser
 sighup
 superuser-backend
(7 行记录)

官方文档没有对上下文做过多的解释,下面是一些用户可以更改内容的具体说明,按照更改的难度由难道易排序:

  • internal:这些设置主要是在编译期间的数据库内部进行设置。包含了用户新的的视图,如果需要更改,只能进行软件的重新编译来进行。
  • postmaster:只有在服务器重启后才进行更新。所有的共享内存都归到这个类别。
  • sighup:给服务器发送hup信号时会使服务器重新加载postgresql.conf的配置,并且对参数说做的更改会立即生效,这是在实际中影响最小的一种方式。
  • backend:这个与signup很像,但是所做的更改不会影响当前数据库正在运行的数据库后端的会话。只有在新的会话开始的时候才会生效。这个属性只有几个参数,很多影响行为的只在会话结束或者开始的时候才发生。只有启动log_connections后创建的新连接会被记录。
  • superuser:这个属性可由任意一个数据库superuser权限的用户(通常是postgres)随时进行修改,并且不用重新加载配置文件即可以生效。
  • user:单个用户的会话可以在任意时间调整这些参数。所做的变更只会影响到改会话。这里的大多数的参数会改变查询执行的方式,在每一个会话的基础上,允许调整查询的执行。

参数生效的方式

  • set
    可以在会话级别设置这种。
postgres=# set work_mem=262144;
SET
postgres=# show work_mem;
 work_mem
----------
 256MB
(1 行记录)

重新登录后

λ psql -U postgres     
psql (9.6.12, 服务器 9.6.3)                        
输入 "help" 来获取帮助信息.                              
                                                
postgres=# show work_mem;                       
 work_mem                                       
----------                                      
 4MB                                            
(1 行记录)                                         
  • pg_reload_conf函数
    更改完sighup类的参数,可以直接使用下面语句来重载
postgres=# select pg_reload_conf();
 pg_reload_conf
----------------
 t
(1 行记录)
  • pg_ctl
    使用pg_reload,这个操作会重载配置文件。
[postgres@localhost ~]$ pg_ctl reload
server signaled

  • 重启
    pg_ctl restart来重启数据库,这些会直接更改能改的一切参数,但是注意的是一些会话级别的参数可能因此会丢失。
[postgres@localhost ~]$ pg_ctl restart -D /data1/pgdata
waiting for server to shut down.... done
server stopped
server starting
[postgres@localhost ~]$ < 2019-11-07 10:44:19.478 CST > 日志:  日志输出重定向到日志收集进程
< 2019-11-07 10:44:19.478 CST > 提示:  后续的日志输出将出现在目录 "pg_log"中.

总结

上面说明了更改参数的类别和重载的方法。主要是方便线上的运维,参数一般会随着业务进行不断的调整,有利于提供数据库的性能,保证业务的高效运行。

推荐阅读