Skip to content

PostgreSQL 服务管理命令

PostgreSQL服务管理是数据库运维的基础,掌握常用的服务管理命令对于DBA来说至关重要。本文将介绍PostgreSQL服务管理的常用命令,结合实际生产运维场景,帮助DBA高效管理PostgreSQL服务。

使用pg_ctl管理服务

pg_ctl是PostgreSQL自带的服务管理工具,可以用于启动、停止、重启PostgreSQL服务,以及检查服务状态。它是跨平台的,适用于所有PostgreSQL版本。

启动服务

bash
# 基本启动(指定数据目录)
pg_ctl start -D /var/lib/postgresql/14/main

# 后台启动(等待启动完成,生产环境常用)
pg_ctl start -D /var/lib/postgresql/14/main -w

# 带日志文件启动(指定日志输出位置)
pg_ctl start -D /var/lib/postgresql/14/main -l /var/log/postgresql/postgresql-14-main.log

# 带额外配置参数启动(生产环境调试常用)
pg_ctl start -D /var/lib/postgresql/14/main -o "-c config_file=/etc/postgresql/14/main/postgresql.conf -c log_min_messages=debug5"

# 生产环境安全启动(验证配置文件)
pgt_ctl start -D /var/lib/postgresql/14/main -w -o "-c config_file=/etc/postgresql/14/main/postgresql.conf"

# 版本差异:PostgreSQL 10+支持--if-not-running选项
pg_ctl start -D /var/lib/postgresql/14/main --if-not-running

停止服务

停止服务时,需要根据业务需求选择合适的停止模式。生产环境中推荐使用智能停止或快速停止,避免使用立即停止。

bash
# 智能停止(默认):等待当前事务完成,不接受新连接
pg_ctl stop -D /var/lib/postgresql/14/main

# 快速停止:回滚当前事务,立即停止,生产环境常用
pg_ctl stop -D /var/lib/postgresql/14/main -m fast

# 立即停止:立即终止所有进程,可能导致数据损坏,仅用于紧急情况
pg_ctl stop -D /var/lib/postgresql/14/main -m immediate

# 等待停止完成(生产环境脚本中常用)
pg_ctl stop -D /var/lib/postgresql/14/main -w -m fast

# 版本差异:PostgreSQL 12+支持--if-exists选项
pg_ctl stop -D /var/lib/postgresql/14/main --if-exists

重启服务

bash
# 基本重启
pg_ctl restart -D /var/lib/postgresql/14/main

# 快速重启(生产环境常用)
pg_ctl restart -D /var/lib/postgresql/14/main -m fast

# 带配置参数重启(更新配置后重启)
pg_ctl restart -D /var/lib/postgresql/14/main -o "-c max_connections=200 -c shared_buffers=512MB"

# 等待重启完成
pg_ctl restart -D /var/lib/postgresql/14/main -w -m fast

检查服务状态

bash
# 检查服务状态
pg_ctl status -D /var/lib/postgresql/14/main

# 脚本化检查服务是否运行
if pg_ctl status -D /var/lib/postgresql/14/main > /dev/null 2>&1; then
    echo "PostgreSQL is running"
else
    echo "PostgreSQL is not running"
fi

# 查看详细状态(包含PID、数据目录等)
pg_ctl status -D /var/lib/postgresql/14/main -v

重新加载配置

重新加载配置是生产环境中常用的操作,可以在不重启服务的情况下应用配置更改。

bash
# 重新加载配置文件(生产环境常用)
pg_ctl reload -D /var/lib/postgresql/14/main

# 使用SQL命令重新加载配置(远程操作常用)
psql -h localhost -U postgres -c "SELECT pg_reload_conf();"

# 版本差异:PostgreSQL 9.5+支持pg_reload_conf()函数返回布尔值

检查配置

bash
# 检查配置文件语法(生产环境配置更改前必做)
pg_ctl check -D /var/lib/postgresql/14/main

# 显示配置参数值
psql -c "SHOW all;" > postgresql_config.txt
psql -c "SHOW shared_buffers;"
psql -c "SHOW max_connections;"

# 查看非默认配置参数
psql -c "SELECT name, setting FROM pg_settings WHERE source != 'default';"

使用systemctl管理服务

在systemd系统中(CentOS 7+, Ubuntu 16.04+, Debian 8+),可以使用systemctl命令管理PostgreSQL服务。这是生产环境中最常用的服务管理方式。

启动服务

bash
# 启动默认PostgreSQL服务
sudo systemctl start postgresql

# 启动特定版本和实例的PostgreSQL服务(生产环境常用)
sudo systemctl start postgresql@14-main

# 设置开机自启动(生产环境必做)
sudo systemctl enable postgresql
sudo systemctl enable postgresql@14-main

# 查看服务是否开机自启动
sudo systemctl is-enabled postgresql@14-main

停止服务

bash
# 停止默认PostgreSQL服务
sudo systemctl stop postgresql

# 停止特定版本和实例的PostgreSQL服务
sudo systemctl stop postgresql@14-main

# 禁用开机自启动
sudo systemctl disable postgresql
sudo systemctl disable postgresql@14-main

重启服务

bash
# 重启默认PostgreSQL服务
sudo systemctl restart postgresql

# 重启特定版本和实例的PostgreSQL服务(生产环境常用)
sudo systemctl restart postgresql@14-main

检查服务状态

bash
# 检查默认PostgreSQL服务状态
sudo systemctl status postgresql

# 检查特定版本和实例的PostgreSQL服务状态(生产环境常用)
sudo systemctl status postgresql@14-main -l

# 检查服务是否活跃(脚本化检查常用)
sudo systemctl is-active postgresql@14-main

# 生产环境健康检查脚本示例
if sudo systemctl is-active postgresql@14-main > /dev/null; then
    echo "PostgreSQL service is healthy"
else
    echo "PostgreSQL service is unhealthy"
    # 可以添加告警逻辑
fi

重新加载配置

bash
# 重新加载默认PostgreSQL配置
sudo systemctl reload postgresql

# 重新加载特定版本和实例的PostgreSQL配置(生产环境常用)
sudo systemctl reload postgresql@14-main

查看服务日志

bash
# 查看PostgreSQL服务日志
sudo journalctl -u postgresql
sudo journalctl -u postgresql@14-main

# 实时查看日志(生产环境调试常用)
sudo journalctl -u postgresql@14-main -f

# 查看特定时间段的日志(生产环境故障排查常用)
sudo journalctl -u postgresql@14-main --since "2024-01-01 10:00:00" --until "2024-01-01 11:00:00"

# 查看包含错误信息的日志
sudo journalctl -u postgresql@14-main -p err

使用service命令管理服务

在SysV init系统中(较旧的Linux发行版,如CentOS 6, Ubuntu 14.04),可以使用service命令管理PostgreSQL服务。

启动服务

bash
# 启动PostgreSQL服务
sudo service postgresql start

# 启动特定版本的PostgreSQL服务
sudo service postgresql-14 start

停止服务

bash
# 停止PostgreSQL服务
sudo service postgresql stop

# 停止特定版本的PostgreSQL服务
sudo service postgresql-14 stop

重启服务

bash
# 重启PostgreSQL服务
sudo service postgresql restart

# 重启特定版本的PostgreSQL服务
sudo service postgresql-14 restart

检查服务状态

bash
# 检查PostgreSQL服务状态
sudo service postgresql status

# 检查特定版本的PostgreSQL服务状态
sudo service postgresql-14 status

重新加载配置

bash
# 重新加载PostgreSQL配置
sudo service postgresql reload

# 重新加载特定版本的PostgreSQL配置
sudo service postgresql-14 reload

数据库初始化命令

使用initdb初始化数据库集群

initdb命令用于初始化PostgreSQL数据库集群,创建数据库系统的目录结构和初始数据库。这是数据库安装后的第一个关键操作。

bash
# 基本初始化(指定数据目录)
initdb -D /var/lib/postgresql/14/main

# 指定超级用户名初始化(生产环境常用)
initdb -D /var/lib/postgresql/14/main -U postgres

# 指定编码、排序规则和时区初始化(生产环境标准配置)
initdb -D /var/lib/postgresql/14/main -E UTF8 --locale=en_US.UTF-8 -T Asia/Shanghai

# 启用WAL归档和校验和初始化(生产环境高可用配置)
initdb -D /var/lib/postgresql/14/main -W --enable-wal-log-hints --data-checksums

# 初始化备用数据库集群(用于级联复制)
initdb -D /var/lib/postgresql/14/standby -U postgres -E UTF8 --locale=en_US.UTF-8

# 版本差异:PostgreSQL 9.3+支持--data-checksums选项
# PostgreSQL 10+支持--wal-segsize选项指定WAL段大小

使用pg_basebackup初始化从库

pg_basebackup命令用于创建PostgreSQL数据库集群的基础备份,常用于初始化从库。这是生产环境中构建主从复制架构的关键命令。

bash
# 基本备份(用于初始化从库,生产环境常用)
pg_basebackup -h primary_host -p 5432 -U replication_user -D /var/lib/postgresql/14/standby -R -P -X stream

# 使用压缩备份(节省网络带宽,适合远程备份)
pg_basebackup -h primary_host -p 5432 -U replication_user -D /var/lib/postgresql/14/standby -R -P -F t -z -X stream

# 使用压缩级别0-9(0最快,9最小)
pg_basebackup -h primary_host -p 5432 -U replication_user -D /var/lib/postgresql/14/standby -R -P -F t -Z 5 -X stream

# 使用复制槽备份(防止WAL被过早删除,生产环境高可用配置)
pg_basebackup -h primary_host -p 5432 -U replication_user -D /var/lib/postgresql/14/standby -R -P -X stream -S standby_slot

# 版本差异:PostgreSQL 9.4+支持-R选项自动生成recovery.conf文件
# PostgreSQL 12+会生成standby.signal和postgresql.auto.conf文件
# PostgreSQL 13+支持--slot选项替代-S

连接管理命令

使用psql连接数据库

psql是PostgreSQL自带的命令行客户端工具,用于连接和管理PostgreSQL数据库。它是DBA日常工作中最常用的工具之一。

bash
# 连接本地默认数据库
psql

# 连接本地指定数据库
psql -U postgres -d app_db

# 连接远程数据库(生产环境常用)
psql -h db.example.com -p 5432 -U app_user -d app_db

# 使用连接字符串连接(生产环境脚本常用)
psql postgresql://app_user:password@db.example.com:5432/app_db?sslmode=require

# 执行单条SQL命令并退出(生产环境脚本常用)
psql -h localhost -U postgres -c "SELECT version();"

# 执行SQL脚本文件(生产环境部署常用)
psql -h localhost -U postgres -d app_db -f /path/to/deploy.sql

# 输出查询结果为CSV格式(生产环境数据导出常用)
psql -h localhost -U postgres -d app_db -c "COPY (SELECT * FROM users) TO STDOUT WITH CSV HEADER" > users.csv

# 版本差异:PostgreSQL 9.3+支持--csv选项
# PostgreSQL 12+支持--single-transaction选项确保脚本原子执行

查看连接状态

生产环境中,监控数据库连接状态是DBA的重要工作,可以及时发现连接泄漏、慢查询等问题。

sql
-- 查看所有连接
SELECT * FROM pg_stat_activity;

-- 查看活跃连接(生产环境常用)
SELECT 
    pid,
    usename,
    datname,
    client_addr,
    application_name,
    state,
    query_start,
    now() - query_start AS duration,
    query
FROM pg_stat_activity 
WHERE state = 'active';

-- 查看连接数统计(生产环境监控常用)
SELECT 
    usename,
    application_name,
    state,
    count(*) AS connection_count
FROM pg_stat_activity 
GROUP BY usename, application_name, state
ORDER BY connection_count DESC;

-- 查看长时间运行的查询(生产环境故障排查常用)
SELECT 
    pid,
    usename,
    datname,
    now() - query_start AS duration,
    query
FROM pg_stat_activity
WHERE state = 'active' 
    AND now() - query_start > interval '5 minutes'
ORDER BY duration DESC;

-- 版本差异:PostgreSQL 9.6+支持wait_event_type和wait_event字段
-- PostgreSQL 10+支持backend_type字段

终止连接

当遇到慢查询、连接泄漏或数据库维护时,需要终止特定连接。生产环境中需要谨慎使用,避免影响正常业务。

sql
-- 终止特定连接
SELECT pg_terminate_backend(12345);

-- 终止所有非超级用户连接(维护前常用)
SELECT pg_terminate_backend(pid) 
FROM pg_stat_activity 
WHERE usename != 'postgres';

-- 终止特定数据库的所有连接(数据库维护常用)
SELECT pg_terminate_backend(pid) 
FROM pg_stat_activity 
WHERE datname = 'app_db' AND pid <> pg_backend_pid();

-- 终止长时间运行的查询(生产环境应急常用)
SELECT pg_terminate_backend(pid) 
FROM pg_stat_activity
WHERE state = 'active' 
    AND now() - query_start > interval '10 minutes';

-- 版本差异:PostgreSQL 9.2+支持pg_terminate_backend()
-- PostgreSQL 13+支持pg_cancel_backend()取消查询但不终止连接

日志管理命令

查看日志文件

日志管理是DBA日常工作的重要组成部分,通过日志可以排查故障、优化性能。

bash
# 查看PostgreSQL日志文件(Debian/Ubuntu默认位置)
tail -n 100 /var/log/postgresql/postgresql-14-main.log

# 查看PostgreSQL日志文件(RHEL/CentOS默认位置)
tail -n 100 /var/lib/pgsql/14/data/log/postgresql-Mon.log

# 实时查看日志(生产环境故障排查常用)
tail -f /var/log/postgresql/postgresql-14-main.log

# 搜索日志中的错误信息(生产环境故障排查常用)
grep -i error /var/log/postgresql/postgresql-14-main.log
# 搜索特定时间段的错误
 grep -i "2024-01-01 10:" /var/log/postgresql/postgresql-14-main.log | grep -i error

# 统计日志中各类消息的数量(生产环境监控常用)
grep -o "LOG:" /var/log/postgresql/postgresql-14-main.log | wc -l
grep -o "ERROR:" /var/log/postgresql/postgresql-14-main.log | wc -l
grep -o "WARNING:" /var/log/postgresql/postgresql-14-main.log | wc -l

日志轮转

生产环境中,需要定期轮转日志文件,避免日志文件过大占用磁盘空间。

bash
# 手动轮转日志(生产环境应急常用)
pg_ctl logrotate -D /var/lib/postgresql/14/main

# 或者使用postgres用户执行
pg_logrotate

# 查看日志轮转配置(Debian/Ubuntu)
cat /etc/logrotate.d/postgresql-common

# 查看日志轮转配置(RHEL/CentOS)
cat /etc/logrotate.d/postgresql14

生产环境常用系统命令

查看PostgreSQL进程

bash
# 查看PostgreSQL进程
ts aux | grep postgres
pgrep -f postgres

# 查看PostgreSQL进程树(生产环境调试常用)
pstree -p $(pgrep -f postgres)

# 查看PostgreSQL进程资源使用情况(生产环境性能监控常用)
ps aux --sort=-%cpu | grep postgres | head -10
ps aux --sort=-%mem | grep postgres | head -10

# 使用top查看PostgreSQL进程资源使用情况
top -p $(pgrep -f postgres)

查看PostgreSQL端口

bash
# 查看PostgreSQL监听端口(生产环境网络调试常用)
ss -tuln | grep 5432
netstat -tuln | grep 5432

# 查看端口占用情况(生产环境故障排查常用)
lsof -i :5432

# 查看PostgreSQL实际监听地址和端口(生产环境配置验证常用)
ps aux | grep postgres | grep -i "-p"

查看磁盘使用情况

bash
# 查看数据库目录磁盘使用情况(生产环境容量管理常用)
du -sh /var/lib/postgresql/14/main

# 查看数据库目录详细使用情况(生产环境容量分析常用)
du -h /var/lib/postgresql/14/main | sort -hr | head -20

# 查看WAL日志目录使用情况(生产环境WAL管理常用)
du -sh /var/lib/postgresql/14/main/pg_wal

# 查看文件系统使用情况(生产环境磁盘监控常用)
df -h

# 查看inode使用情况(生产环境磁盘监控常用)
df -i

查看内存使用情况

bash
# 查看系统内存使用情况(生产环境性能监控常用)
free -h

# 查看PostgreSQL内存使用情况(生产环境性能分析常用)
ps aux --sort=-%mem | grep postgres | head -10

# 使用pmap查看特定PostgreSQL进程内存映射(生产环境调试常用)
pmap -x $(pgrep -f "postgres: postmaster")

版本兼容性说明

功能/命令PostgreSQL 9.xPostgreSQL 10+PostgreSQL 12+PostgreSQL 14+
服务管理pg_ctl/servicepg_ctl/systemctl增强systemctl支持统一systemctl管理
数据库初始化initdb基本功能支持--wal-segsize支持IDENTITY列增强校验和支持
基础备份pg_basebackup支持-R选项生成standby.signal增强并行备份
连接管理基本pg_stat_activity增强pg_stat_activity支持wait_event_type增强连接控制
终止连接pg_terminate_backend()增强函数功能支持pg_cancel_backend()增强权限控制
日志管理基本日志功能增强日志格式支持JSON日志增强日志过滤
psql工具基本功能支持--csv选项支持--single-transaction增强元命令

生产环境最佳实践

服务管理

  • 使用systemctl管理服务,便于系统集成和自动化(生产环境推荐)
  • 定期检查服务状态,建议每5分钟检查一次,使用监控工具如Prometheus+Grafana
  • 设置服务开机自启动,避免系统重启后服务无法自动恢复
  • 配置适当的日志级别,生产环境建议使用info级别,调试时使用debug级别
  • 使用专用的系统用户运行PostgreSQL,避免使用root用户

数据库初始化

  • 初始化数据库时,启用数据校验和(--data-checksums),提高数据完整性
  • 初始化数据库时,设置合适的编码和排序规则,避免后续更改困难
  • 初始化从库时,使用pg_basebackup的-R选项,自动生成复制配置
  • 生产环境建议使用较大的WAL段大小(如64MB),减少WAL切换频率

连接管理

  • 限制最大连接数(max_connections),建议根据系统内存设置,一般为CPU核心数的10-20倍
  • 使用连接池管理数据库连接,如PgBouncer、Pgpool-II等,减少连接开销
  • 定期清理长时间运行的查询,建议设置statement_timeout参数,默认为0(无限制)
  • 监控连接数变化,设置连接数告警阈值,一般为最大连接数的80%
  • 为不同应用设置不同的数据库用户,便于权限管理和审计

日志管理

  • 配置适当的日志级别和日志格式,生产环境建议使用csvlog或jsonlog格式
  • 定期轮转日志,建议每天轮转一次,保留30-90天的日志
  • 将日志存储在独立的磁盘分区,避免影响数据库性能
  • 监控日志中的错误和警告信息,设置日志告警规则
  • 使用集中日志管理系统,如ELK Stack、Graylog等,便于日志分析和检索

性能监控

  • 定期检查PostgreSQL进程资源使用情况,关注CPU、内存、I/O等指标
  • 监控数据库连接状态,及时发现连接泄漏和慢查询
  • 监控磁盘使用情况,特别是数据库目录和WAL目录
  • 监控内存使用情况,确保PostgreSQL有足够的内存可用
  • 使用专业的PostgreSQL监控工具,如pg_stat_monitor、pgBadger等

总结

PostgreSQL服务管理命令是DBA日常运维的基础工具,掌握这些命令对于高效管理PostgreSQL服务至关重要。本文介绍了使用pg_ctl、systemctl、service等工具管理PostgreSQL服务的常用命令,结合生产环境实际场景,涵盖了服务的启动、停止、重启、状态检查、数据库初始化、连接管理、日志管理等方面。

在实际运维过程中,DBA应根据系统环境和PostgreSQL版本选择合适的命令,并结合监控工具和自动化脚本,实现PostgreSQL服务的高效管理。同时,DBA还应关注PostgreSQL的最新发展动态,学习和应用新的服务管理功能和最佳实践,不断提升自己的服务管理能力。

生产环境中,DBA需要特别注意:

  1. 服务操作前,确保已备份关键数据和配置文件
  2. 停止或重启服务时,提前通知业务方,选择业务低峰期操作
  3. 执行高危操作时,制定详细的操作计划和回滚方案
  4. 定期检查服务状态和日志,及时发现和处理问题
  5. 建立完善的监控和告警机制,确保服务高可用性
  6. 关注版本差异,选择合适的命令语法

通过合理使用PostgreSQL服务管理命令,结合最佳实践,可以提高数据库的可用性、性能和安全性,确保业务系统的稳定运行。