PostgreSQL教程FG194-PG服务端应用详解:postgres/pg_ctl全参数
本文档详细介绍PostgreSQL服务端应用postgres和pg_ctl的使用方法和参数说明,风哥教程参考PostgreSQL官方文档内容,适合数据库管理员在生产环境中使用这些工具进行数据库服务的管理和控制。
Part01-基础概念与理论知识
1.1 PostgreSQL服务端应用概述
PostgreSQL服务端应用是指在服务器端运行的PostgreSQL相关程序,主要包括postgres服务进程和pg_ctl控制工具。这些应用是PostgreSQL数据库系统的核心组成部分,负责数据库的启动、停止、重启等管理操作。更多视频教程www.fgedu.net.cn
- postgres:PostgreSQL数据库服务进程,是数据库的核心组件
- pg_ctl:PostgreSQL服务控制工具,用于管理数据库服务的启动、停止、重启等操作
- initdb:初始化PostgreSQL数据库集群的工具
- postgres:PostgreSQL数据库服务器主进程
1.2 postgres服务进程
postgres是PostgreSQL数据库的主服务进程,负责处理客户端连接、执行SQL语句、管理数据库文件等核心功能。它是PostgreSQL数据库系统的核心组件,所有的数据库操作都通过它来完成。学习交流加群风哥微信: itpux-com
1.3 pg_ctl控制工具
pg_ctl是PostgreSQL的服务控制工具,用于管理PostgreSQL服务的启动、停止、重启、重载配置等操作。它是数据库管理员日常管理PostgreSQL服务的重要工具。学习交流加群风哥QQ113257174
Part02-生产环境规划与建议
2.1 服务端配置建议
— 1. 内存配置
— – shared_buffers:建议设置为物理内存的25%
— – work_mem:根据并发连接数和查询复杂度调整
— – maintenance_work_mem:建议设置为物理内存的10%
— 2. WAL配置
— – wal_level:设置为replica或logical
— – max_wal_size:建议设置为1GB-4GB
— – min_wal_size:建议设置为80MB
— – checkpoint_completion_target:建议设置为0.9
— 3. 连接配置
— – max_connections:根据业务需求调整
— – listen_addresses:设置为’*’或具体IP地址
— – port:默认5432,可根据需要修改
— 4. 其他配置
— – logging_collector:设置为on
— – log_directory:设置为合适的日志目录
— – log_filename:设置为合适的日志文件名格式
— – log_rotation_size:设置为合适的日志轮换大小
2.2 服务端管理建议
服务端管理建议:
- 服务启动:使用pg_ctl start命令启动服务,建议使用系统服务管理工具(如systemd)管理
- 服务停止:使用pg_ctl stop命令停止服务,避免强制终止进程
- 服务重启:使用pg_ctl restart命令重启服务,或先停止再启动
- 配置重载:使用pg_ctl reload命令重载配置,无需重启服务
- 状态检查:定期使用pg_ctl status命令检查服务状态
2.3 服务端监控建议
服务端监控建议:
- 进程监控:监控postgres进程的运行状态和资源使用情况
- 连接监控:监控数据库连接数和连接状态
- 性能监控:监控查询性能、WAL写入、检查点等性能指标
- 空间监控:监控数据目录和表空间的使用情况
- 日志监控:监控数据库日志,及时发现错误和异常
Part03-生产环境项目实施方案
3.1 postgres命令使用详解
3.1.1 postgres命令基本语法
postgres [OPTIONS] [DATADIR]
— 常用选项
— -D, –pgdata=DATADIR 数据库数据目录
— -c, –config-file=FILE 配置文件路径
— -C, –core-file-size=SIZE 核心文件大小限制
— -d, –debug-level=LEVEL 调试级别
— -e, –echo-queries 打印所有执行的SQL语句
— -F, –fsync=BOOL 是否同步文件到磁盘
— -k, –unix-socket-directories=DIRECTORIES Unix套接字目录
— -l, –log-file=FILE 日志文件路径
— -n, –no-clean 退出时不清理共享内存
— -o, –single-option=NAME=VALUE 设置单个配置参数
— -p, –port=PORT 服务端口号
— -s, –silent 静默模式
— -S, –stats-file=FILE 统计信息文件路径
— -t, –trace-backend 启用后端跟踪
— -V, –version 显示版本信息
— -?, –help 显示帮助信息
3.1.2 postgres命令执行示例
— 1. 基本启动(指定数据目录)
$ postgres -D /postgresql/fgdata
— 2. 启动并指定端口
$ postgres -D /postgresql/fgdata -p 5432
— 3. 启动并设置配置参数
$ postgres -D /postgresql/fgdata -c shared_buffers=1GB -c work_mem=32MB
— 4. 启动并启用日志
$ postgres -D /postgresql/fgdata -l /postgresql/log/postgres.log
— 5. 启动并启用SQL语句打印
$ postgres -D /postgresql/fgdata -e
— 6. 查看版本
$ postgres -V
— 输出:
— postgres (PostgreSQL) 18.3
3.2 pg_ctl命令使用详解
3.2.1 pg_ctl命令基本语法
pg_ctl [OPTIONS] COMMAND [ARGUMENTS]
— 常用命令
— start 启动PostgreSQL服务
— stop 停止PostgreSQL服务
— restart 重启PostgreSQL服务
— reload 重载PostgreSQL配置
— status 查看PostgreSQL服务状态
— promote 提升备库为主库
— cluster 管理数据库集群
— 常用选项
— -D, –pgdata=DATADIR 数据库数据目录
— -l, –log=FILENAME 日志文件路径
— -t, –timeout=SECONDS 超时时间
— -s, –silent 静默模式
— -o, –options=OPTIONS 传递给postgres的选项
— -c, –core-file-size=SIZE 核心文件大小限制
— -V, –version 显示版本信息
— -?, –help 显示帮助信息
3.2.2 pg_ctl命令执行示例
— 1. 启动服务
$ pg_ctl start -D /postgresql/fgdata
— 2. 启动服务并指定日志文件
$ pg_ctl start -D /postgresql/fgdata -l /postgresql/log/postgres.log
— 3. 启动服务并传递参数给postgres
$ pg_ctl start -D /postgresql/fgdata -o “-c shared_buffers=1GB -c work_mem=32MB”
— 4. 停止服务(默认模式)
$ pg_ctl stop -D /postgresql/fgdata
— 5. 快速停止服务
$ pg_ctl stop -D /postgresql/fgdata -m fast
— 6. 立即停止服务
$ pg_ctl stop -D /postgresql/fgdata -m immediate
— 7. 重启服务
$ pg_ctl restart -D /postgresql/fgdata
— 8. 重载配置
$ pg_ctl reload -D /postgresql/fgdata
— 9. 查看服务状态
$ pg_ctl status -D /postgresql/fgdata
— 输出:
— pg_ctl: server is running (PID: 12345)
— /postgresql/bin/postgres “-D” “/postgresql/fgdata”
— 10. 提升备库为主库
$ pg_ctl promote -D /postgresql/fgdata
3.3 服务端管理最佳实践
— 1. 使用systemd管理服务
— 创建systemd服务文件
$ cat > /etc/systemd/system/postgresql.service << EOF
[Unit]
Description=PostgreSQL database server
After=network.target
[Service]
Type=forking
User=fgedu
Group=fgedudb
Environment=PGPORT=5432
Environment=PGDATA=/postgresql/fgdata
ExecStart=/postgresql/bin/pg_ctl start -D ${PGDATA} -s -o "-c config_file=/postgresql/fgdata/postgresql.conf"
ExecStop=/postgresql/bin/pg_ctl stop -D ${PGDATA} -s -m fast
ExecReload=/postgresql/bin/pg_ctl reload -D ${PGDATA} -s
PIDFile=/postgresql/fgdata/postmaster.pid
[Install]
WantedBy=multi-user.target
EOF
-- 启用并启动服务
$ systemctl enable postgresql
$ systemctl start postgresql
-- 2. 配置文件管理
-- 主配置文件:postgresql.conf
-- 客户端认证文件:pg_hba.conf
-- ident配置文件:pg_ident.conf
-- 3. 日志管理
-- 启用日志收集器
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d.log'
log_rotation_age = 1d
log_rotation_size = 100MB
log_truncate_on_rotation = on
-- 4. 定期维护
-- 定期执行VACUUM和ANALYZE
-- 定期检查数据库集群状态
-- 定期备份数据库
Part04-生产案例与实战讲解
4.1 postgres服务管理案例
— 1. 手动启动postgres服务
$ postgres -D /postgresql/fgdata -c config_file=/postgresql/fgdata/postgresql.conf
— 输出:
— 2026-04-07 10:00:00 CST [12345] LOG: starting PostgreSQL 18.3 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 11.2.0, 64-bit
— 2026-04-07 10:00:00 CST [12345] LOG: listening on IPv4 address “0.0.0.0”, port 5432
— 2026-04-07 10:00:00 CST [12345] LOG: listening on IPv6 address “::”, port 5432
— 2026-04-07 10:00:00 CST [12345] LOG: listening on Unix socket “/var/run/postgresql/.s.PGSQL.5432”
— 2026-04-07 10:00:00 CST [12346] LOG: database system was shut down at 2026-04-07 09:50:00 CST
— 2026-04-07 10:00:00 CST [12345] LOG: database system is ready to accept connections
— 2. 验证服务是否启动
$ ps aux | grep postgres
— 输出:
— fgedu 12345 0.1 5.0 1000000 500000 ? S 10:00 0:00 postgres -D /postgresql/fgdata -c config_file=/postgresql/fgdata/postgresql.conf
— fgedu 12346 0.0 0.5 1000000 50000 ? Ss 10:00 0:00 postgres: checkpointer
— fgedu 12347 0.0 0.5 1000000 50000 ? Ss 10:00 0:00 postgres: background writer
— fgedu 12348 0.0 0.5 1000000 50000 ? Ss 10:00 0:00 postgres: wal writer
— fgedu 12349 0.0 0.5 1000000 50000 ? Ss 10:00 0:00 postgres: autovacuum launcher
— fgedu 12350 0.0 0.5 1000000 50000 ? Ss 10:00 0:00 postgres: stats collector
— fgedu 12351 0.0 0.5 1000000 50000 ? Ss 10:00 0:00 postgres: logical replication launcher
4.2 pg_ctl使用案例
— 1. 启动服务
$ pg_ctl start -D /postgresql/fgdata -l /postgresql/log/postgres.log
— 输出:
— waiting for server to start…. done
— server started
— 2. 查看服务状态
$ pg_ctl status -D /postgresql/fgdata
— 输出:
— pg_ctl: server is running (PID: 12345)
— /postgresql/bin/postgres “-D” “/postgresql/fgdata”
— 3. 重载配置
$ pg_ctl reload -D /postgresql/fgdata
— 输出:
— server signaled
— 4. 重启服务
$ pg_ctl restart -D /postgresql/fgdata
— 输出:
— waiting for server to shut down…. done
— waiting for server to start…. done
— server started
— 5. 停止服务
$ pg_ctl stop -D /postgresql/fgdata -m fast
— 输出:
— waiting for server to shut down…. done
— server stopped
4.3 服务端管理实战案例
— 1. 创建systemd服务文件
$ sudo cat > /etc/systemd/system/postgresql.service << EOF
[Unit]
Description=PostgreSQL database server
After=network.target
[Service]
Type=forking
User=fgedu
Group=fgedudb
Environment=PGPORT=5432
Environment=PGDATA=/postgresql/fgdata
ExecStart=/postgresql/bin/pg_ctl start -D ${PGDATA} -s -o "-c config_file=/postgresql/fgdata/postgresql.conf"
ExecStop=/postgresql/bin/pg_ctl stop -D ${PGDATA} -s -m fast
ExecReload=/postgresql/bin/pg_ctl reload -D ${PGDATA} -s
PIDFile=/postgresql/fgdata/postmaster.pid
[Install]
WantedBy=multi-user.target
EOF
-- 2. 重新加载systemd配置
$ sudo systemctl daemon-reload
-- 3. 启用服务
$ sudo systemctl enable postgresql
-- 4. 启动服务
$ sudo systemctl start postgresql
-- 5. 查看服务状态
$ sudo systemctl status postgresql
-- 输出:
-- ● postgresql.service - PostgreSQL database server
-- Loaded: loaded (/etc/systemd/system/postgresql.service; enabled; vendor preset: disabled)
-- Active: active (running) since Mon 2026-04-07 10:00:00 CST; 1min ago
-- Main PID: 12345 (postgres)
-- Tasks: 7 (limit: 4915)
-- Memory: 500.0M
-- CPU: 1.2s
-- CGroup: /system.slice/postgresql.service
-- ├─12345 /postgresql/bin/postgres -D /postgresql/fgdata -c config_file=/postgresql/fgdata/postgresql.conf
-- ├─12346 postgres: checkpointer
-- ├─12347 postgres: background writer
-- ├─12348 postgres: wal writer
-- ├─12349 postgres: autovacuum launcher
-- ├─12350 postgres: stats collector
-- └─12351 postgres: logical replication launcher
-- 6. 停止服务
$ sudo systemctl stop postgresql
-- 7. 重启服务
$ sudo systemctl restart postgresql
Part05-风哥经验总结与分享
5.1 服务端应用使用技巧
服务端应用使用技巧:
- postgres技巧:
- 使用 -c 选项设置配置参数,便于临时调整配置
- 使用 -e 选项启用SQL语句打印,便于调试
- 使用 -l 选项指定日志文件,便于日志管理
- 对于生产环境,建议通过配置文件设置参数,而不是命令行选项
- pg_ctl技巧:
- 使用 -m 选项指定停止模式,根据需要选择合适的模式
- 使用 -t 选项设置超时时间,避免操作卡住
- 使用 -o 选项传递参数给postgres,便于临时调整配置
- 定期使用 status 命令检查服务状态,确保服务正常运行
- 服务管理技巧:
- 使用系统服务管理工具(如systemd)管理PostgreSQL服务
- 建立服务启动、停止、重启的标准化流程
- 定期检查服务状态和日志,及时发现问题
- 制定服务故障应急预案,确保服务快速恢复
5.2 服务端应用常见问题解决
— 1. 服务启动失败
— 问题:postgres服务无法启动
— 解决:
— – 检查数据目录权限是否正确
— – 检查配置文件是否有错误
— – 检查端口是否被占用
— – 检查磁盘空间是否充足
— – 查看日志文件了解具体错误原因
— 2. 服务停止失败
— 问题:pg_ctl stop命令无法停止服务
— 解决:
— – 检查服务是否真的在运行
— – 尝试使用 -m fast 或 -m immediate 选项
— – 检查进程是否被卡住
— – 作为最后的手段,使用kill命令终止进程
— 3. 配置重载失败
— 问题:pg_ctl reload命令无法重载配置
— 解决:
— – 检查配置文件是否有语法错误
— – 检查服务是否在运行
— – 查看日志文件了解具体错误原因
— 4. 服务状态检查失败
— 问题:pg_ctl status命令无法检查服务状态
— 解决:
— – 检查数据目录路径是否正确
— – 检查服务是否在运行
— – 检查postmaster.pid文件是否存在且有效
5.3 服务端应用性能优化
— 1. postgres性能优化
— – 合理配置内存参数:shared_buffers、work_mem、maintenance_work_mem
— – 优化WAL参数:wal_level、max_wal_size、checkpoint_completion_target
— – 调整连接参数:max_connections、idle_in_transaction_session_timeout
— – 优化查询性能:启用查询计划缓存、调整random_page_cost等参数
— – 配置合适的日志级别,避免过多的日志输出
— 2. pg_ctl使用优化
— – 使用 -s 选项启用静默模式,减少输出
— – 使用 -t 选项设置合理的超时时间
— – 对于大型数据库,使用 -m fast 选项停止服务,平衡速度和安全性
— 3. 服务管理优化
— – 使用systemd等系统服务管理工具,提高服务管理效率
— – 建立服务监控机制,及时发现性能问题
— – 定期进行服务维护,包括VACUUM、ANALYZE等操作
— – 制定合理的备份策略,确保数据安全
— – 优化服务启动参数,提高启动速度
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
