PostgreSQL教程FG064-PG服务端核心配置文件:postgresql.conf基础解读
本文档风哥主要介绍PostgreSQL数据库核心配置文件postgresql.conf相关知识,包括配置文件结构、参数分类、内存参数、连接参数、WAL参数、参数查看与修改方法等内容,风哥教程参考PostgreSQL官方文档Server Configuration章节,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
from oracle:www.itpux.com
Part01-基础概念与理论知识
1.1 PostgreSQL数据库postgresql.conf文件概述
postgresql.conf是PostgreSQL数据库的主要配置文件,包含了数据库服务器运行所需的所有参数设置。该文件位于数据目录中,初始化数据库集群时自动生成。通过修改postgresql.conf文件,可以调整数据库的内存分配、连接数、日志记录、查询优化等各项参数。更多视频教程www.fgedu.net.cn
- 位于数据目录($PGDATA)中
- 文本格式,可使用文本编辑器修改
- 支持参数分组和注释
- 支持include指令引入其他配置文件
- 部分参数支持热更新,无需重启
1.2 PostgreSQL数据库配置文件结构
postgresql.conf配置文件结构说明:
#——————————————————————————
# FILE LOCATIONS(文件位置)
#——————————————————————————
data_directory = ‘/postgresql/data’
#——————————————————————————
# CONNECTIONS AND AUTHENTICATION(连接与认证)
#——————————————————————————
listen_addresses = ‘localfgedu.net.cn’
port = 5432
max_connections = 100
#——————————————————————————
# RESOURCE USAGE(资源使用)
#——————————————————————————
shared_buffers = 128MB
work_mem = 4MB
#——————————————————————————
# WRITE-AHEAD LOG(预写式日志)
#——————————————————————————
wal_level = replica
fsync = on
#——————————————————————————
# QUERY TUNING(查询调优)
#——————————————————————————
enable_seqscan = on
random_page_cost = 4.0
#——————————————————————————
# LOGGING(日志记录)
#——————————————————————————
logging_collector = on
log_directory = ‘log’
log_filename = ‘postgresql-%Y-%m-%d.log’
#——————————————————————————
# AUTOVACUUM(自动清理)
#——————————————————————————
autovacuum = on
autovacuum_max_workers = 3
1.3 PostgreSQL数据库配置参数分类
PostgreSQL数据库配置参数按修改方式分类:
## 1. 需要重启数据库才能生效(postmaster级别)
– listen_addresses
– port
– max_connections
– shared_buffers
– wal_level
– max_wal_senders
## 2. 需要重新加载配置才能生效(sighup级别)
– log_destination
– log_directory
– log_filename
– autovacuum
– autovacuum_max_workers
## 3. 可在会话级别动态修改(fgedu级别)
– work_mem
– maintenance_work_mem
– effective_cache_size
– random_page_cost
## 4. 可在会话内部修改(superfgedu级别)
– log_min_duration_statement
– log_statement
– client_min_messages
# 查看参数修改级别
SELECT name, context FROM pg_settings WHERE name = ‘shared_buffers’;
name | context
————–+———–
shared_buffers | postmaster
Part02-生产环境规划与建议
2.1 PostgreSQL数据库内存参数规划
PostgreSQL数据库内存参数规划建议:
## shared_buffers(共享缓冲区)
– 建议值:总内存的25%
– 示例:shared_buffers = 8GB
– 说明:PostgreSQL使用的共享内存,用于缓存数据页
## effective_cache_size(有效缓存大小)
– 建议值:总内存的50%-75%
– 示例:effective_cache_size = 24GB
– 说明:优化器估计可用缓存大小,影响查询计划
## work_mem(工作内存)
– 建议值:总内存 / max_connections / 4
– 示例:work_mem = 64MB(100连接)
– 说明:每个查询操作可使用的内存
## maintenance_work_mem(维护工作内存)
– 建议值:512MB-2GB
– 示例:maintenance_work_mem = 1GB
– 说明:VACUUM、CREATE INDEX等维护操作使用的内存
## huge_pages(大页内存)
– 建议值:try或on
– 示例:huge_pages = try
– 说明:使用大页内存提高性能
# 计算大页数量
# shared_buffers = 8GB = 8192MB
# 大页大小通常为2MB
# 需要大页数 = 8192 / 2 = 4096
# 建议预留10%,设置为4500
2.2 PostgreSQL数据库连接参数规划
PostgreSQL数据库连接参数规划建议:
## max_connections(最大连接数)
– 建议值:100-500(根据应用需求)
– 示例:max_connections = 200
– 说明:数据库最大并发连接数
## superfgedu_reserved_connections(超级用户保留连接数)
– 建议值:3-10
– 示例:superfgedu_reserved_connections = 5
– 说明:为超级用户保留的连接数
## listen_addresses(监听地址)
– 建议值:’*’(所有地址)或特定IP
– 示例:listen_addresses = ‘*’
– 说明:数据库监听的IP地址
## port(端口)
– 建议值:5432(默认)或自定义
– 示例:port = 5432
– 说明:数据库监听端口
## authentication_timeout(认证超时)
– 建议值:60s-120s
– 示例:authentication_timeout = 60s
– 说明:客户端认证超时时间
## connection限制计算
# 每个连接约占用10MB内存
# 200连接约需2GB内存
# 需要预留足够内存给连接使用
2.3 PostgreSQL数据库WAL参数规划
PostgreSQL数据库WAL参数规划建议:
## wal_level(WAL级别)
– 建议值:replica(主从复制)或logical(逻辑复制)
– 示例:wal_level = replica
– 说明:WAL日志记录级别
## max_wal_senders(最大WAL发送进程数)
– 建议值:3-10(根据从库数量)
– 示例:max_wal_senders = 5
– 说明:最大WAL发送进程数
## wal_keep_size(WAL保留大小)
– 建议值:1GB-10GB
– 示例:wal_keep_size = 2GB
– 说明:保留的WAL文件大小
## checkpoint_completion_target(检查点完成目标)
– 建议值:0.8-0.9
– 示例:checkpoint_completion_target = 0.9
– 说明:检查点完成时间比例
## max_wal_size(最大WAL大小)
– 建议值:2GB-10GB
– 示例:max_wal_size = 4GB
– 说明:WAL最大大小
## min_wal_size(最小WAL大小)
– 建议值:512MB-2GB
– 示例:min_wal_size = 1GB
– 说明:WAL最小大小
Part03-生产环境项目实施方案
3.1 PostgreSQL数据库配置参数查看方法
3.1.1 使用psql查看参数
$ psql -U pgsql
psql (18.3)
输入 “help” 来获取帮助信息.
# 查看单个参数
postgres=# SHOW shared_buffers;
shared_buffers
—————-
128MB
(1 行记录)
postgres=# SHOW max_connections;
max_connections
—————–
100
(1 行记录)
postgres=# SHOW port;
port
——
5432
(1 行记录)
# 查看所有参数
postgres=# SHOW ALL;
name | setting | description
——————————————–+———+——————————————–
allow_in_place_fgedutbss | off | Allows fgedutbss directly inside pg_tbls
allow_system_table_mods | off | Allows modifications of the structure of
fgapplication_name | psql | Sets the fgapplication name to be reported i
archive_cleanup_command | | Sets the shell command that will be execut
archive_command | | Sets the shell command that will be called
archive_mode | off | Allows archiving of WAL files using archi
archive_timeout | 0 | Forces a switch to the next WAL file if a
…
(约400行)
# 查看参数详细信息
postgres=# SELECT name, setting, unit, context, source, short_desc
FROM pg_settings WHERE name IN (‘shared_buffers’, ‘max_connections’, ‘work_mem’);
name | setting | unit | context | source | short_desc
—————-+———+——+————+——————–+——————————————
max_connections | 100 | | postmaster | configuration file | Sets the maximum number of concurrent con
shared_buffers | 16384 | 8kB | postmaster | configuration file | Sets the number of shared memory buffers
work_mem | 4096 | kB | fgedu | configuration file | Sets the maximum memory to be used for q
(3 行记录)
3.1.2 查看配置文件内容
postgres=# SHOW config_file;
config_file
—————————————–
/postgresql/data/postgresql.conf
(1 行记录)
# 查看配置文件内容
$ cat /postgresql/data/postgresql.conf | grep -v “^#” | grep -v “^$”
data_directory = ‘/postgresql/data’
hba_file = ‘/postgresql/data/pg_hba.conf’
ident_file = ‘/postgresql/data/pg_ident.conf’
listen_addresses = ‘localfgedu.net.cn’
port = 5432
max_connections = 100
shared_buffers = 128MB
dynamic_shared_memory_type = posix
work_mem = 4MB
maintenance_work_mem = 64MB
wal_level = replica
fsync = on
log_destination = ‘stderr’
logging_collector = on
log_directory = ‘log’
log_filename = ‘postgresql-%Y-%m-%d.log’
3.2 PostgreSQL数据库配置参数修改方法
3.2.1 修改配置文件方式
$ vi /postgresql/data/postgresql.conf
# 修改参数示例
# 修改前
#shared_buffers = 128MB
# 修改后
shared_buffers = 8GB
# 修改前
#max_connections = 100
# 修改后
max_connections = 200
# 保存退出后重新加载配置
$ pg_ctl reload -D /postgresql/data
server signaled
# 或使用SQL命令重新加载
$ psql -U pgsql -c “SELECT pg_reload_conf();”
pg_reload_conf
—————-
t
(1 行记录)
# 对于postmaster级别参数,需要重启数据库
$ pg_ctl restart -D /postgresql/data
waiting for server to shut down…. done
server stopped
waiting for server to start…. done
server started
3.2.2 使用ALTER SYSTEM修改参数
$ psql -U pgsql
# 修改参数
postgres=# ALTER SYSTEM SET work_mem = ’64MB’;
ALTER SYSTEM
postgres=# ALTER SYSTEM SET maintenance_work_mem = ‘1GB’;
ALTER SYSTEM
postgres=# ALTER SYSTEM SET log_min_duration_statement = 1000;
ALTER SYSTEM
# 重新加载配置
postgres=# SELECT pg_reload_conf();
pg_reload_conf
—————-
t
(1 行记录)
# 验证修改结果
postgres=# SHOW work_mem;
work_mem
———-
64MB
(1 行记录)
postgres=# SHOW maintenance_work_mem;
maintenance_work_mem
———————-
1GB
(1 行记录)
# 恢复默认值
postgres=# ALTER SYSTEM RESET work_mem;
ALTER SYSTEM
postgres=# SELECT pg_reload_conf();
pg_reload_conf
—————-
t
(1 行记录)
# 查看postgresql.auto.conf内容
$ cat /postgresql/data/postgresql.auto.conf
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
work_mem = ’64MB’
maintenance_work_mem = ‘1GB’
3.2.3 会话级别修改参数
$ psql -U pgsql
# 修改当前会话参数
postgres=# SET work_mem = ‘256MB’;
SET
postgres=# SHOW work_mem;
work_mem
———-
256MB
(1 行记录)
# 修改为默认值
postgres=# RESET work_mem;
RESET
postgres=# SHOW work_mem;
work_mem
———-
64MB
(1 行记录)
# 修改所有会话的默认值
postgres=# ALTER DATABASE fgedudb SET work_mem = ‘128MB’;
ALTER DATABASE
postgres=# ALTER USER fgedu_fgedu SET work_mem = ‘256MB’;
ALTER ROLE
# 查看用户/数据库级别参数设置
postgres=# SELECT * FROM pg_db_role_setting;
setfgedudb | setrole | setconfig
————-+———+————————-
16384 | 0 | {work_mem=128MB}
0 | 16385 | {work_mem=256MB}
(2 行记录)
3.3 PostgreSQL数据库常用参数配置实战
3.3.1 生产环境基础参数配置
# 连接参数
listen_addresses = ‘*’
port = 5432
max_connections = 200
superfgedu_reserved_connections = 5
# 内存参数
shared_buffers = 8GB
effective_cache_size = 24GB
work_mem = 64MB
maintenance_work_mem = 1GB
huge_pages = try
# WAL参数
wal_level = replica
fsync = on
synchronous_commit = on
wal_sync_method = fdatasync
max_wal_senders = 5
wal_keep_size = 2GB
max_wal_size = 4GB
min_wal_size = 1GB
checkpoint_completion_target = 0.9
# 查询优化参数
random_page_cost = 1.1
effective_io_concurrency = 200
default_statistics_target = 100
# 日志参数
logging_collector = on
log_directory = ‘log’
log_filename = ‘postgresql-%Y-%m-%d.log’
log_rotation_age = 1d
log_rotation_size = 100MB
log_min_duration_statement = 1000
log_checkpoints = on
log_connections = on
log_disconnections = on
log_lock_waits = on
log_timezone = ‘Asia/Shanghai’
# 自动清理参数
autovacuum = on
autovacuum_max_workers = 3
autovacuum_naptime = 1min
autovacuum_vacuum_threshold = 50
autovacuum_analyze_threshold = 50
autovacuum_vacuum_scale_factor = 0.1
autovacuum_analyze_scale_factor = 0.05
# 时区
timezone = ‘Asia/Shanghai’
Part04-生产案例与实战讲解
4.1 PostgreSQL数据库性能优化参数配置
4.1.1 内存优化配置
# 查看当前内存参数
postgres=# SELECT name, setting, unit, short_desc
FROM pg_settings
WHERE name IN (‘shared_buffers’, ‘effective_cache_size’, ‘work_mem’, ‘maintenance_work_mem’);
name | setting | unit | short_desc
———————-+———+——+——————————————
effective_cache_size | 524288 | 8kB | Planner’s assumption about the size of t
maintenance_work_mem | 1048576 | kB | Sets the maximum memory to be used for m
shared_buffers | 1048576 | 8kB | Sets the number of shared memory buffers
work_mem | 65536 | kB | Sets the maximum memory to be used for q
(4 行记录)
# 优化内存参数
postgres=# ALTER SYSTEM SET shared_buffers = ‘8GB’;
ALTER SYSTEM
postgres=# ALTER SYSTEM SET effective_cache_size = ’24GB’;
ALTER SYSTEM
postgres=# ALTER SYSTEM SET work_mem = ’64MB’;
ALTER SYSTEM
postgres=# ALTER SYSTEM SET maintenance_work_mem = ‘1GB’;
ALTER SYSTEM
# 配置大页内存
# 首先在操作系统层面配置
$ cat /proc/meminfo | grep Huge
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
FileHugePages: 0 kB
HugePages_Total: 5120
HugePages_Free: 5120
HugePages_Rsvd: 0 kB
HugePages_Surp: 0 kB
Hugepagesize: 2048 kB
# 在PostgreSQL中启用大页
postgres=# ALTER SYSTEM SET huge_pages = ‘try’;
ALTER SYSTEM
# 重启数据库使shared_buffers生效
$ pg_ctl restart -D /postgresql/data
4.1.2 查询优化配置
# 查看当前查询优化参数
postgres=# SELECT name, setting, short_desc
FROM pg_settings
WHERE name LIKE ‘%cost%’ OR name LIKE ‘%enable%’ OR name LIKE ‘%statistics%’;
name | setting | short_desc
—————————–+———+———————————————————-
cpu_index_tuple_cost | 0.005 | Sets the planner’s estimate of the cost of processing ea
cpu_operator_cost | 0.0025 | Sets the planner’s estimate of the cost of processing ea
cpu_tuple_cost | 0.01 | Sets the planner’s estimate of the cost of processing ea
default_statistics_target | 100 | Sets the default statistics target.
effective_cache_size | 3145728 | Sets the planner’s assumption about the size of the data
enable_bitmapscan | on | Enables the planner’s use of bitmap-scan plans.
enable_gathermerge | on | Enables the planner’s use of gather merge plans.
enable_hashagg | on | Enables the planner’s use of hashed aggregation plans.
enable_hashjoin | on | Enables the planner’s use of hash-join plans.
enable_indexonlyscan | on | Enables the planner’s use of index-only-scan plans.
enable_indexscan | on | Enables the planner’s use of index-scan plans.
enable_material | on | Enables the planner’s use of materialization.
enable_memoize | on | Enables the planner’s use of memoization.
enable_mergejoin | on | Enables the planner’s use of merge-join plans.
enable_nestloop | on | Enables the planner’s use of nested-loop join plans.
enable_parallel_fgappend | on | Enables the planner’s use of parallel fgappend plans.
enable_parallel_hash | on | Enables the planner’s use of parallel hash plans.
enable_partition_pruning | on | Enables plan time partition pruning.
enable_partitionwise_join | off | Enables partitionwise join.
enable_partitionwise_aggreg | off | Enables partitionwise aggregation.
enable_seqscan | on | Enables the planner’s use of sequential-scan plans.
enable_sort | on | Enables the planner’s use of explicit sort steps.
enable_tidscan | on | Enables the planner’s use of TID scan plans.
parallel_setup_cost | 1000 | Sets the planner’s estimate of the cost of starting up wo
parallel_tuple_cost | 0.1 | Sets the planner’s estimate of the cost of passing each t
random_page_cost | 4 | Sets the planner’s estimate of the cost of a non sequenti
(26 行记录)
# SSD存储优化配置
postgres=# ALTER SYSTEM SET random_page_cost = 1.1;
ALTER SYSTEM
postgres=# ALTER SYSTEM SET effective_io_concurrency = 200;
ALTER SYSTEM
postgres=# ALTER SYSTEM SET default_statistics_target = 200;
ALTER SYSTEM
# 重新加载配置
postgres=# SELECT pg_reload_conf();
pg_reload_conf
—————-
t
(1 行记录)
4.2 PostgreSQL数据库配置常见问题处理
4.2.1 参数修改不生效问题
postgres=# SHOW work_mem;
work_mem
———-
4MB
(1 行记录)
# 检查参数来源
postgres=# SELECT name, setting, source, sourcefile, sourceline
FROM pg_settings WHERE name = ‘work_mem’;
name | setting | source | sourcefile | sourceline
———-+———+——————–+——————————–+————
work_mem | 4096 | configuration file | /postgresql/data/postgresql.co | 156
(1 行记录)
# 原因分析:修改了postgresql.auto.conf但postgresql.conf中也有设置
# 解决方案:检查配置优先级
# 查看postgresql.auto.conf
$ cat /postgresql/data/postgresql.auto.conf
# Do not edit this file manually!
work_mem = ’64MB’
# 查看postgresql.conf中的设置
$ grep work_mem /postgresql/data/postgresql.conf
work_mem = 4MB
# 解决方案1:注释postgresql.conf中的设置
$ sed -i ‘s/^work_mem/#work_mem/’ /postgresql/data/postgresql.conf
# 解决方案2:直接修改postgresql.conf
$ sed -i ‘s/work_mem = 4MB/work_mem = 64MB/’ /postgresql/data/postgresql.conf
# 重新加载配置
$ psql -U pgsql -c “SELECT pg_reload_conf();”
4.2.2 内存不足问题
$ pg_ctl start -D /postgresql/data
waiting for server to start…. stopped waiting
pg_ctl: could not start server
# 查看日志
$ cat /postgresql/data/log/postgresql-2026-04-02.log
2026-04-02 12:00:00.123 CST [12345] FATAL: could not map anonymous shared memory: Cannot allocate memory
2026-04-02 12:00:00.123 CST [12345] HINT: This error usually means that PostgreSQL’s request for a shared memory segment exceeded available memory, swap space, or huge pages. To reduce the request size (currently 8589934592 bytes), reduce PostgreSQL’s shared memory usage, perhaps by reducing shared_buffers or max_connections.
# 原因分析:shared_buffers设置过大,系统内存不足
# 解决方案1:减少shared_buffers
$ vi /postgresql/data/postgresql.conf
shared_buffers = 4GB
# 解决方案2:增加系统内存或交换分区
$ free -h
总计 已用 空闲 共享 缓冲/缓存 可用
内存: 15Gi 2.1Gi 12Gi 256Mi 1.2Gi 12Gi
交换: 8Gi 0B 8Gi
# 解决方案3:调整大页内存配置
$ cat /proc/sys/vm/nr_hugepages
0
$ sudo sysctl -w vm.nr_hugepages=4096
vm.nr_hugepages = 4096
# 重新启动数据库
$ pg_ctl start -D /postgresql/data
server started
4.3 PostgreSQL数据库配置审计与检查
4.3.1 配置参数审计脚本
$ cat > /postgresql/scripts/pg_config_audit.sql << 'EOF' -- pg_config_audit.sql -- from:www.itpux.com.qq113257174.wx:itpux-com -- web: http://www.fgedu.net.cn -- 查看非默认参数设置 SELECT name, setting, unit, source, short_desc FROM pg_settings WHERE source != 'default' ORDER BY name; -- 查看内存相关参数 SELECT name, setting, unit, context, short_desc FROM pg_settings WHERE name IN ( 'shared_buffers', 'effective_cache_size', 'work_mem', 'maintenance_work_mem', 'huge_pages', 'temp_buffers' ); -- 查看连接相关参数 SELECT name, setting, unit, context, short_desc FROM pg_settings WHERE name IN ( 'max_connections', 'superfgedu_reserved_connections', 'listen_addresses', 'port' ); -- 查看WAL相关参数 SELECT name, setting, unit, context, short_desc FROM pg_settings WHERE name LIKE '%wal%' OR name LIKE '%checkpoint%'; -- 查看日志相关参数 SELECT name, setting, unit, context, short_desc FROM pg_settings WHERE name LIKE '%log%'; EOF # 执行审计脚本 $ psql -U pgsql -f /postgresql/scripts/pg_config_audit.sql name | setting | unit | context | short_desc -----------------+---------+------+------------+------------------------------------------ autovacuum | on | | sighup | Starts the autovacuum subprocess. checkpoint_comp | 0.9 | | sighup | Time spent flushing dirty buffers during default_statist | 200 | | fgedu | Sets the default statistics target. effective_cache | 3145724 | 8kB | fgedu | Planner's assumption about the size of t effective_io_co | 200 | | fgedu | Number of simultaneous requests that can log_checkpoints | on | | superfgedu | Logs each checkpoint. log_connections | on | | superfgedu | Logs each successful connection. log_directory | log | | sighup | Directory where log files are written. log_disconnecti | on | | superfgedu | Logs end of a session, including duratio log_filename | postgre | | sighup | Log file name pattern. ... (25 行记录)
Part05-风哥经验总结与分享
5.1 PostgreSQL数据库配置管理最佳实践
PostgreSQL数据库配置管理最佳实践风哥教程风哥教程风哥教程总结:
- 备份配置文件:修改前备份原配置文件,便于回滚
- 分步修改:避免一次性修改多个参数,便于问题定位
- 测试验证:在测试环境验证后再应用到生产环境
- 记录变更:记录每次配置变更的原因和效果
- 定期审计:定期检查配置参数,确保符合最佳实践
- 监控告警:配置监控告警,及时发现配置问题
5.2 PostgreSQL数据库配置检查清单
## 内存配置检查
□ shared_buffers设置为总内存的25%
□ effective_cache_size设置为总内存的50%-75%
□ work_mem根据连接数合理设置
□ maintenance_work_mem设置合理
□ huge_pages已配置(如适用)
## 连接配置检查
□ max_connections满足业务需求
□ listen_addresses配置正确
□ port配置正确
□ pg_hba.conf配置正确
## WAL配置检查
□ wal_level配置正确
□ max_wal_senders满足复制需求
□ wal_keep_size设置合理
□ checkpoint参数配置合理
## 日志配置检查
□ logging_collector已启用
□ log_directory配置正确
□ log_filename配置正确
□ log_rotation配置正确
□ 关键日志开关已启用
## 性能配置检查
□ random_page_cost根据存储类型设置
□ effective_io_concurrency配置正确
□ default_statistics_target设置合理
□ 并行查询参数配置正确
5.3 PostgreSQL数据库配置管理工具推荐
PostgreSQL数据库配置管理相关工具推荐:
- pgTune:在线配置生成工具,根据硬件自动推荐参数
- pgConfig:配置参数检查和优化建议工具
- pgBadger:日志分析工具,帮助发现配置问题
- pg_stat_statements:SQL性能统计扩展
- PgHero:PostgreSQL性能监控和优化建议工具
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
