一、查看pg数据库配置参数的基本信息!-----书本的图片来自pg修炼之道从小工到专家,是基于pg12版本;
可以通过context字段值来了解修改该参数是否需要重启数据库!具体如下图片所示:
postgres=# select name,context from pg_settings;

。。。。。。我的测试是基于pg14.6。。。。。
二、以参数maintenance_work_mem为例子,来说明alter system set 和 set两种方式修改参数的区别
2.1、先查看该参数的修改方式,如下所示发现是user类型的,可以直接set,也可以alter system set这样修改;
postgres=# select name,context from pg_settings where name='maintenance_work_mem';
name | context
----------------------+---------
maintenance_work_mem | user
(1 row)
2.2、两种方法修改的区别:
1、PostgreSQL9.4开始提供了类似Oracle的命令 ALTER SYSTEM 修改服务器参数并被持久化,通过system修改某个参数后,就自动在数据文件目录下生成一个名字为postgresql.auto.conf配置文件,用来存储刚才的修改(优先级高于postgresql.conf),需要重新reload下配置文件让修改生效,并且对所有的连接都生效,包括本连接以及已经建立的连接,同时最新的修改即使在下次重启也会生效。具体如下
会话1:
postgres=# show maintenance_work_mem;
maintenance_work_mem
256MB
(1 row)
postgres=# alter system set maintenance_work_mem='256MB';
ALTER SYSTEM
postgres=# show maintenance_work_mem; #发现无效
maintenance_work_mem
64MB
(1 row)
postgres=# select pg_reload_conf(); #reload下配置文件,另一中reload方法:pg_ctl -D $PGDATA reload
pg_reload_conf
----------------
t
(1 row)
postgres=# show maintenance_work_mem;
maintenance_work_mem
----------------------
256MB
(1 row)
会话2:
postgres=# show maintenance_work_mem;
maintenance_work_mem
----------------------
128MB
会话1reload后再次查看发现已经生效,说明对已经创建的连接也有效果!
postgres=# show maintenance_work_mem;
maintenance_work_mem
----------------------
256MB
2、类似于MySQL那样直接set 修改,但是只对当前连接有效,新建连接无效了,重启后自然也失效,具体如下所示
[postgres@B-JS25-BASE79-00 data]$ psql
psql (14.6)
Type "help" for help.
postgres=# show maintenance_work_mem;
maintenance_work_mem
256MB
(1 row)
postgres=# set maintenance_work_mem ='128MB';
SET
postgres=#
postgres=# show maintenance_work_mem;
maintenance_work_mem
128MB
(1 row)
postgres=# exit
[postgres@B-JS25-BASE79-00 data]$ psql
psql (14.6)
Type "help" for help.
postgres=# show maintenance_work_mem;
maintenance_work_mem
256MB
(1 row)
三、大部分类型的参数都可以通过 alter system set的方式修改,除了internal类型的参数不可以!但是生效方式不同;
具体如下:
3.1、sighup类型,可以通过alter system set的方式修改;reload就生效了,
postgres=# select name,context from pg_settings where name='archive_timeout';
name | context
-----------------+---------
archive_timeout | sighup
(1 row)
postgres=# show archive_timeout;
archive_timeout
-----------------
1s
(1 row)
postgres=# alter system set archive_timeout=2;
ALTER SYSTEM
postgres=# select pg_reload_conf();
pg_reload_conf
----------------
t
(1 row)
postgres=# show archive_timeout;
archive_timeout
-----------------
2s
(1 row)
3.2、superuser类型的参数,可以通过alter system set的方式修改;reload就生效了
postgres=# select name,context from pg_settings where name='allow_in_place_tablespaces';
name | context
----------------------------+-----------
allow_in_place_tablespaces | superuser
(1 row)
postgres=# show allow_in_place_tablespaces;
allow_in_place_tablespaces
----------------------------
on
(1 row)
postgres=# alter system set allow_in_place_tablespaces=off;
ALTER SYSTEM
postgres=# select pg_reload_conf();
pg_reload_conf
----------------
t
(1 row)
postgres=# show allow_in_place_tablespaces;
allow_in_place_tablespaces
----------------------------
off
(1 row)
3.3、postmaster类型的参数,可以通过alter system set的方式修改;reload无法生效,需要重启才能生效!
postgres=# select name,context from pg_settings where name='data_sync_retry';
name | context
-----------------+------------
data_sync_retry | postmaster
(1 row)
postgres=# show data_sync_retry;
data_sync_retry
-----------------
off
(1 row)
postgres=# alter system set data_sync_retry=on;
ALTER SYSTEM
postgres=# select pg_reload_conf();
pg_reload_conf
----------------
t
(1 row)
postgres=# show data_sync_retry;
data_sync_retry
-----------------
off
(1 row)
重启数据库后生效:
[postgres@B-JS25-BASE79-00 data]$ pg_ctl restart
waiting for server to shut down.... done
server stopped
waiting for server to start....2023-01-30 22:08:09.359 CST [122668] LOG: redirecting log output to logging collector process
2023-01-30 22:08:09.359 CST [122668] HINT: Future log output will appear in directory "log".
done
server started
[postgres@B-JS25-BASE79-00 data]$ psql
psql (14.6)
Type "help" for help.
postgres=# show data_sync_retry; #生效了
data_sync_retry
on
(1 row)
3.4、internal类型的参数无法通过alter system修改,只能在初始化的时候指定;
postgres=# select name,context from pg_settings where name='block_size';
name | context
------------+----------
block_size | internal
(1 row)
postgres=# show block_size;
block_size
------------
8192
(1 row)
postgres=# alter system set block_size=16384;
ERROR: parameter "block_size" cannot be changed
postgres=#
3.5、user前面已经介绍了也是可以通过alter system修改;
四、总结,针对pg14.6参数的修改的规则:
1、可以先通过select name,context from pg_settings查看context值来了解参数属于那个类型,
2、其中sighup,superuser,user这三种类型可以通过alter system set修改,并且reload就可以生效,并且对所有连接都有效果,包括已经创建的和未来创建的;
3、postmaster类型的也可以通过alter system set修改。但是需要重启数据库才可以生效;
4、通过alter system set修改的参数重启也有效果;
5、通过alter system set 修改的参数会自动记录到参数文件postgresql.auto.conf中,并且优先级高于postgresql.conf;
6、简单原则:针对pg9.4版本开始,参数修改可以就认准alter system set 这样修改即可!reload后生效就生效了,没生效就是需要重启数据库!