PostgreSQL教程FG354-PostgreSQL数据库日常巡检与健康检查:企业级日常巡检方案设计与实施
本文档风哥主要介绍PostgreSQL数据库的企业级日常巡检与健康检查方案,包括PostgreSQL日常巡检基础概念、日常巡检的重要性、企业级日常巡检设计原则、企业级日常巡检需求分析、日常巡检方案规划、日常巡检工具选择、PostgreSQL日常巡检搭建、日常巡检实施、日常巡检监控、日常巡检脚本实战、自动化巡检系统实战、巡检结果分析与处理实战、企业级日常巡检最佳实践、日常巡检检查清单、日常巡检常见问题与解决方案等内容,风哥教程参考PostgreSQL官方文档Server Administration内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 PostgreSQL日常巡检基础概念
PostgreSQL日常巡检是指定期对PostgreSQL数据库进行健康检查,以确保数据库的正常运行和性能稳定。更多视频教程www.fgedu.net.cn
- 数据库状态检查:检查数据库服务是否正常运行
- 性能检查:检查数据库性能指标,如响应时间、吞吐量等
- 资源使用检查:检查服务器资源使用情况,如CPU、内存、磁盘等
- 安全检查:检查数据库安全配置和权限设置
- 备份检查:检查备份是否正常执行
- 日志检查:检查数据库日志,发现潜在问题
1.2 日常巡检的重要性
日常巡检的重要性:
- 预防问题:及时发现和解决潜在问题,避免系统故障
- 优化性能:发现性能瓶颈,优化系统配置
- 确保安全:检查安全漏洞,确保数据安全
- 合规要求:满足企业合规要求和审计需求
- 提高可用性:确保系统高可用,减少停机时间
1.3 企业级日常巡检设计原则
企业级日常巡检设计原则:
- 全面性:覆盖数据库的各个方面,确保无遗漏
- 及时性:定期执行巡检,及时发现问题
- 自动化:尽量自动化巡检过程,减少人工干预
- 可量化:使用具体指标评估数据库状态
- 可追溯:记录巡检结果,便于问题分析和追踪
- 可操作性:巡检结果要有明确的处理建议
Part02-生产环境规划与建议
2.1 企业级日常巡检需求分析
企业级日常巡检需求分析:
– 可用性要求:系统需要达到的可用性水平
– 性能要求:系统性能指标要求
– 安全要求:系统安全合规要求
– 审计要求:系统审计和合规要求
# 技术需求分析
– 巡检频率:巡检的执行频率
– 巡检内容:需要检查的具体内容
– 巡检工具:使用的巡检工具
– 监控需求:实时监控和告警需求
# 资源需求分析
– 人力资源:巡检执行和分析人员
– 时间资源:巡检执行的时间
– 工具资源:巡检工具和监控系统
– 预算资源:巡检和监控的成本
2.2 日常巡检方案规划
日常巡检方案规划:
## 1. 巡检频率
– 日常巡检:每天执行一次
– 周巡检:每周执行一次
– 月巡检:每月执行一次
– 季度巡检:每季度执行一次
– 年度巡检:每年执行一次
## 2. 巡检内容
– 数据库状态:服务运行状态、连接数等
– 性能指标:查询响应时间、吞吐量、锁等待等
– 资源使用:CPU、内存、磁盘、网络等
– 安全配置:权限设置、访问控制、加密等
– 备份状态:备份执行情况、备份完整性等
– 日志分析:错误日志、警告日志、慢查询日志等
– 系统配置:参数设置、版本信息等
## 3. 巡检工具
– 命令行工具:psql、pg_isready等
– 监控工具:Prometheus、Grafana等
– 脚本工具:Shell脚本、Python脚本等
– 专业工具:pgBadger、pg_stat_statements等
## 4. 巡检流程
– 准备阶段:确定巡检内容和工具
– 执行阶段:执行巡检任务
– 分析阶段:分析巡检结果
– 处理阶段:解决发现的问题
– 报告阶段:生成巡检报告
2.3 日常巡检工具选择
PostgreSQL日常巡检工具选择:
- 命令行工具:psql、pg_isready、pg_controldata等
- 监控工具:Prometheus、Grafana、PostgreSQL Exporter等
- 日志分析工具:pgBadger、ELK Stack等
- 性能分析工具:pg_stat_statements、pg_top等
- 自动化工具:Ansible、Shell脚本、Python脚本等
Part03-生产环境项目实施方案
3.1 PostgreSQL日常巡检搭建
3.1.1 配置Prometheus+Grafana监控
$ wget https://github.com/prometheus-community/postgres_exporter/releases/download/v0.13.0/postgres_exporter-0.13.0.linux-amd64.tar.gz
$ tar -xzf postgres_exporter-0.13.0.linux-amd64.tar.gz
$ mv postgres_exporter-0.13.0.linux-amd64 /usr/local/postgres_exporter
# 2. 配置PostgreSQL Exporter
$ vi /etc/systemd/system/postgres_exporter.service
[Unit]
Description=PostgreSQL Exporter
After=network.target
[Service]
Type=simple
User=postgres
Environment=DATA_SOURCE_NAME=”postgresql://postgres:postgres_pass@fgedu.localhost:5432/postgres?sslmode=disable”
ExecStart=/usr/local/postgres_exporter/postgres_exporter
Restart=always
[Install]
WantedBy=multi-user.target
# 3. 启动PostgreSQL Exporter
$ systemctl daemon-reload
$ systemctl start postgres_exporter
$ systemctl enable postgres_exporter
# 4. 安装Prometheus
$ wget https://github.com/prometheus/prometheus/releases/download/v2.30.3/prometheus-2.30.3.linux-amd64.tar.gz
$ tar -xzf prometheus-2.30.3.linux-amd64.tar.gz
$ mv prometheus-2.30.3.linux-amd64 /usr/local/prometheus
# 5. 配置Prometheus
$ vi /usr/local/prometheus/prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
– job_name: ‘postgres’
static_configs:
– targets: [‘fgedu.localhost:9187’]
# 6. 启动Prometheus
$ systemctl start prometheus
$ systemctl enable prometheus
# 7. 安装Grafana
$ yum install grafana
# 8. 启动Grafana
$ systemctl start grafana-server
$ systemctl enable grafana-server
# 9. 配置Grafana
# 访问 http://fgedu.localhost:3000
# 添加Prometheus数据源
# 导入PostgreSQL仪表盘
3.2 日常巡检实施
3.2.1 编写日常巡检脚本
# daily_check.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 定义变量
DATE=$(date +”%Y-%m-%d”)
LOG_DIR=”/postgresql/logs/check”
LOG_FILE=”${LOG_DIR}/daily_check_${DATE}.log”
# 创建日志目录
mkdir -p ${LOG_DIR}
# 开始日志
echo “PostgreSQL日常巡检开始: $(date)” > ${LOG_FILE}
echo “====================================” >> ${LOG_FILE}
# 1. 检查数据库状态
echo “1. 检查数据库状态” >> ${LOG_FILE}
pg_isready -h fgedu.localhost -p 5432 >> ${LOG_FILE}
echo “” >> ${LOG_FILE}
# 2. 检查数据库连接数
echo “2. 检查数据库连接数” >> ${LOG_FILE}
psql -U postgres -c “SELECT count(*) FROM pg_stat_activity;” >> ${LOG_FILE}
echo “” >> ${LOG_FILE}
# 3. 检查数据库性能
echo “3. 检查数据库性能” >> ${LOG_FILE}
psql -U postgres -c “SELECT now() – query_start as duration, state, query FROM pg_stat_activity WHERE state = ‘active’ ORDER BY duration DESC LIMIT 5;” >> ${LOG_FILE}
echo “” >> ${LOG_FILE}
# 4. 检查表空间使用情况
echo “4. 检查表空间使用情况” >> ${LOG_FILE}
psql -U postgres -c “SELECT spcname, pg_size_pretty(pg_tablespace_size(spcname)) as size FROM pg_tablespace;” >> ${LOG_FILE}
echo “” >> ${LOG_FILE}
# 5. 检查备份状态
echo “5. 检查备份状态” >> ${LOG_FILE}
# 这里可以添加备份检查逻辑
echo “备份检查结果: 正常” >> ${LOG_FILE}
echo “” >> ${LOG_FILE}
# 6. 检查日志
echo “6. 检查日志” >> ${LOG_FILE}
grep -i “error” /postgresql/logs/postgresql-*.log | tail -10 >> ${LOG_FILE}
echo “” >> ${LOG_FILE}
# 结束日志
echo “====================================” >> ${LOG_FILE}
echo “PostgreSQL日常巡检结束: $(date)” >> ${LOG_FILE}
# 发送邮件通知(可选)
# mail -s “PostgreSQL日常巡检报告” admin@fgedu.net.cn < ${LOG_FILE}
3.2.2 配置定时任务
$ crontab -e
# 2. 添加定时任务
# 每天凌晨1点执行日常巡检
0 1 * * * /postgresql/scripts/daily_check.sh
# 每周日凌晨2点执行周巡检
0 2 * * 0 /postgresql/scripts/weekly_check.sh
# 每月1日凌晨3点执行月巡检
0 3 1 * * /postgresql/scripts/monthly_check.sh
3.3 日常巡检监控
3.3.1 配置Prometheus告警
$ vi /usr/local/prometheus/rules/postgres_alerts.yml
groups:
– name: postgres_alerts
rules:
– alert: PostgresDown
expr: pg_up == 0
for: 5m
labels:
severity: critical
annotations:
summary: “PostgreSQL down”
description: “PostgreSQL instance {{ $labels.instance }} is down”
– alert: PostgresHighConnections
expr: pg_stat_activity_count > 800
for: 5m
labels:
severity: warning
annotations:
summary: “PostgreSQL high connections”
description: “PostgreSQL instance {{ $labels.instance }} has {{ $value }} connections”
– alert: PostgresSlowQueries
expr: pg_stat_statements_total_time / pg_stat_statements_calls > 1000
for: 5m
labels:
severity: warning
annotations:
summary: “PostgreSQL slow queries”
description: “PostgreSQL instance {{ $labels.instance }} has slow queries”
# 2. 配置告警通知
$ vi /usr/local/prometheus/prometheus.yml
alerting:
alertmanagers:
– static_configs:
– targets: [‘fgedu.localhost:9093’]
rule_files:
– “rules/postgres_alerts.yml”
Part04-生产案例与实战讲解
4.1 日常巡检脚本实战
## 背景
– 业务需求:企业需要一个自动化的PostgreSQL日常巡检脚本
– 数据库环境:PostgreSQL 18.3,10个数据库实例
– 巡检频率:每天执行一次
## 实施过程
### 1. 编写日常巡检脚本
$ vi /postgresql/scripts/daily_check.sh
#!/bin/bash
# daily_check.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 定义变量
DATE=$(date +”%Y-%m-%d”)
LOG_DIR=”/postgresql/logs/check”
LOG_FILE=”${LOG_DIR}/daily_check_${DATE}.log”
# 创建日志目录
mkdir -p ${LOG_DIR}
# 开始日志
echo “PostgreSQL日常巡检开始: $(date)” > ${LOG_FILE}
echo “====================================” >> ${LOG_FILE}
# 1. 检查数据库状态
echo “1. 检查数据库状态” >> ${LOG_FILE}
pg_isready -h fgedu.localhost -p 5432 >> ${LOG_FILE}
echo “” >> ${LOG_FILE}
# 2. 检查数据库连接数
echo “2. 检查数据库连接数” >> ${LOG_FILE}
psql -U postgres -c “SELECT count(*) FROM pg_stat_activity;” >> ${LOG_FILE}
echo “” >> ${LOG_FILE}
# 3. 检查数据库性能
echo “3. 检查数据库性能” >> ${LOG_FILE}
psql -U postgres -c “SELECT now() – query_start as duration, state, query FROM pg_stat_activity WHERE state = ‘active’ ORDER BY duration DESC LIMIT 5;” >> ${LOG_FILE}
echo “” >> ${LOG_FILE}
# 4. 检查表空间使用情况
echo “4. 检查表空间使用情况” >> ${LOG_FILE}
psql -U postgres -c “SELECT spcname, pg_size_pretty(pg_tablespace_size(spcname)) as size FROM pg_tablespace;” >> ${LOG_FILE}
echo “” >> ${LOG_FILE}
# 5. 检查备份状态
echo “5. 检查备份状态” >> ${LOG_FILE}
# 检查最近24小时的备份
psql -U postgres -c “SELECT * FROM pg_stat_archiver WHERE last_archived_wal IS NOT NULL ORDER BY last_archived_time DESC LIMIT 1;” >> ${LOG_FILE}
echo “” >> ${LOG_FILE}
# 6. 检查日志
echo “6. 检查日志” >> ${LOG_FILE}
grep -i “error” /postgresql/logs/postgresql-*.log | tail -10 >> ${LOG_FILE}
echo “” >> ${LOG_FILE}
# 7. 检查系统资源
echo “7. 检查系统资源” >> ${LOG_FILE}
# 检查CPU使用情况
top -b -n 1 | head -20 >> ${LOG_FILE}
echo “” >> ${LOG_FILE}
# 检查内存使用情况
free -h >> ${LOG_FILE}
echo “” >> ${LOG_FILE}
# 检查磁盘使用情况
df -h >> ${LOG_FILE}
echo “” >> ${LOG_FILE}
# 结束日志
echo “====================================” >> ${LOG_FILE}
echo “PostgreSQL日常巡检结束: $(date)” >> ${LOG_FILE}
# 发送邮件通知
mail -s “PostgreSQL日常巡检报告” admin@fgedu.net.cn < ${LOG_FILE}
### 2. 配置定时任务
$ crontab -e
# 每天凌晨1点执行日常巡检
0 1 * * * /postgresql/scripts/daily_check.sh
### 3. 执行脚本测试
$ /postgresql/scripts/daily_check.sh
### 4. 查看巡检结果
$ cat /postgresql/logs/check/daily_check_2026-04-06.log
PostgreSQL日常巡检开始: 2026-04-06 10:00:00
====================================
1. 检查数据库状态
/var/run/postgresql:5432 - accepting connections
2. 检查数据库连接数
count
-------
10
(1 row)
3. 检查数据库性能
duration | state | query
----------+--------+------------------------------------------------
| active | SELECT * FROM fgedu_users WHERE id = 1;
(1 row)
4. 检查表空间使用情况
spcname | size
------------+--------
pg_default | 10 GB
pg_global | 10 MB
fgedutbs | 5 GB
(3 rows)
5. 检查备份状态
archived_count | last_archived_wal | last_archived_time | failed_count | last_failed_wal | last_failed_time | archived_cleanup_count | last_archived_cleanup_time
----------------+-------------------+------------------------+--------------+-----------------------------------+------------------------+------------------------+----------------------------
100 | 00000001000000000000000A | 2026-04-06 09:00:00 | 0 | | | 0 |
(1 row)
6. 检查日志
2026-04-06 08:00:00 UTC [12345]: [1-1] ERROR: syntax error at or near "SELECT"
7. 检查系统资源
top - 10:00:00 up 10 days, 2:00, 1 user, load average: 0.50, 0.40, 0.30
Tasks: 100 total, 1 running, 99 sleeping, 0 stopped, 0 zombie
%Cpu(s): 5.0 us, 1.0 sy, 0.0 ni, 94.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 16384.0 total, 8192.0 free, 4096.0 used, 4096.0 buff/cache
MiB Swap: 4096.0 total, 4096.0 free, 0.0 used. 12288.0 avail Mem
total used free shared buff/cache available
Mem: 16G 4.0G 8.0G 100M 4.0G 12G
Swap: 4.0G 0B 4.0G
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 20G 30G 40% /
/dev/sdb1 200G 50G 150G 25% /postgresql
====================================
PostgreSQL日常巡检结束: 2026-04-06 10:00:00
4.2 自动化巡检系统实战
## 背景
– 业务需求:企业需要一个自动化的PostgreSQL巡检系统,实现实时监控和告警
– 数据库环境:PostgreSQL 18.3,20个数据库实例
– 监控需求:实时监控,及时告警
## 实施过程
### 1. 安装Prometheus+Grafana
– 安装PostgreSQL Exporter
– 安装Prometheus
– 安装Grafana
### 2. 配置Prometheus
$ vi /usr/local/prometheus/prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
– job_name: ‘postgres’
static_configs:
– targets: [‘192.168.1.10:9187’, ‘192.168.1.11:9187’, ‘192.168.1.12:9187’]
### 3. 配置Grafana
– 添加Prometheus数据源
– 导入PostgreSQL仪表盘
– 配置仪表盘变量
### 4. 配置告警规则
$ vi /usr/local/prometheus/rules/postgres_alerts.yml
groups:
– name: postgres_alerts
rules:
– alert: PostgresDown
expr: pg_up == 0
for: 5m
labels:
severity: critical
annotations:
summary: “PostgreSQL down”
description: “PostgreSQL instance {{ $labels.instance }} is down”
– alert: PostgresHighConnections
expr: pg_stat_activity_count > 800
for: 5m
labels:
severity: warning
annotations:
summary: “PostgreSQL high connections”
description: “PostgreSQL instance {{ $labels.instance }} has {{ $value }} connections”
– alert: PostgresSlowQueries
expr: pg_stat_statements_total_time / pg_stat_statements_calls > 1000
for: 5m
labels:
severity: warning
annotations:
summary: “PostgreSQL slow queries”
description: “PostgreSQL instance {{ $labels.instance }} has slow queries”
– alert: PostgresHighTableSpace
expr: pg_tablespace_size_bytes / 1024 / 1024 / 1024 > 90
for: 5m
labels:
severity: warning
annotations:
summary: “PostgreSQL high tablespace usage”
description: “PostgreSQL tablespace {{ $labels.tablespace }} on {{ $labels.instance }} is {{ $value }} GB”
### 5. 配置告警通知
– 配置Email通知
– 配置Slack通知
– 配置短信通知
### 6. 测试告警
– 模拟数据库故障
– 验证告警是否触发
– 验证告警通知是否发送
## 实施效果
– 实时监控:实时监控数据库状态和性能
– 及时告警:发现问题及时告警
– 可视化:通过Grafana实现数据可视化
– 自动化:减少人工干预,提高效率
4.3 巡检结果分析与处理实战
## 背景
– 业务需求:企业需要对巡检结果进行分析和处理,及时解决问题
– 数据库环境:PostgreSQL 18.3,15个数据库实例
– 巡检频率:每天执行一次
## 实施过程
### 1. 收集巡检结果
– 收集日常巡检脚本的输出
– 收集Prometheus告警信息
– 收集数据库日志
### 2. 分析巡检结果
– 分析数据库状态:检查数据库是否正常运行
– 分析性能指标:检查是否存在性能瓶颈
– 分析资源使用:检查系统资源是否充足
– 分析安全配置:检查是否存在安全隐患
– 分析备份状态:检查备份是否正常执行
### 3. 处理发现的问题
– 性能问题:优化查询,调整参数
– 资源问题:增加资源,优化配置
– 安全问题:加强安全配置,修复漏洞
– 备份问题:修复备份故障,确保备份正常
– 其他问题:根据具体情况进行处理
### 4. 案例分析
#### 案例1:连接数过高
– 现象:巡检发现数据库连接数达到800,接近最大连接数
– 分析:应用程序连接管理不当,导致连接泄漏
– 处理:
1. 检查应用程序连接池配置
2. 优化应用程序连接管理
3. 调整数据库最大连接数
4. 监控连接使用情况
#### 案例2:表空间使用率高
– 现象:巡检发现表空间使用率达到90%
– 分析:数据增长过快,未及时清理过期数据
– 处理:
1. 清理过期数据
2. 归档历史数据
3. 增加表空间容量
4. 监控表空间使用情况
#### 案例3:慢查询
– 现象:巡检发现存在慢查询
– 分析:SQL语句未优化,缺少索引
– 处理:
1. 分析慢查询日志
2. 优化SQL语句
3. 添加适当的索引
4. 监控查询性能
## 实施效果
– 问题及时解决:发现问题及时处理,避免系统故障
– 性能优化:通过分析巡检结果,优化系统性能
– 安全增强:加强安全配置,提高系统安全性
– 经验积累:通过处理问题,积累运维经验
Part05-风哥经验总结与分享
5.1 企业级日常巡检最佳实践
企业级日常巡检最佳实践:
- 建立完善的巡检体系:制定详细的巡检计划和流程
- 自动化巡检:使用脚本和工具实现巡检自动化
- 实时监控:使用监控工具实现实时监控和告警
- 定期分析:定期分析巡检结果,发现问题趋势
- 及时处理:发现问题及时处理,避免问题扩大
- 持续优化:根据巡检结果,持续优化系统配置
- 文档管理:建立巡检文档,记录巡检结果和处理过程
- 培训学习:提高团队的巡检和故障处理能力
5.2 日常巡检检查清单
## 数据库状态
– [ ] 数据库服务是否正常运行
– [ ] 数据库连接数是否正常
– [ ] 数据库 replication 是否正常
– [ ] 数据库状态是否为正常
## 性能指标
– [ ] 查询响应时间是否正常
– [ ] 事务吞吐量是否正常
– [ ] 锁等待是否过多
– [ ] 慢查询是否存在
## 资源使用
– [ ] CPU使用率是否正常
– [ ] 内存使用是否正常
– [ ] 磁盘空间是否充足
– [ ] 磁盘I/O是否正常
– [ ] 网络带宽是否充足
## 安全配置
– [ ] 用户权限是否合理
– [ ] 访问控制是否严格
– [ ] 数据加密是否启用
– [ ] 安全审计是否开启
– [ ] 漏洞是否修复
## 备份状态
– [ ] 备份是否正常执行
– [ ] 备份是否完整
– [ ] 备份是否定期测试
– [ ] 备份策略是否合理
## 日志分析
– [ ] 错误日志是否存在
– [ ] 警告日志是否存在
– [ ] 慢查询日志是否存在
– [ ] 审计日志是否正常
## 系统配置
– [ ] 参数设置是否合理
– [ ] 版本是否最新
– [ ] 补丁是否更新
– [ ] 配置文件是否正确
5.3 日常巡检常见问题与解决方案
日常巡检常见问题与解决方案:
- 数据库服务异常:检查服务状态,重启服务,查看日志
- 连接数过高:优化应用程序连接管理,调整最大连接数
- 性能下降:分析慢查询,优化SQL语句,添加索引
- 资源不足:增加资源,优化配置,清理数据
- 备份失败:检查备份配置,修复备份故障,测试备份
- 安全隐患:加强安全配置,修复漏洞,定期安全审计
- 日志异常:分析日志,找出问题原因,及时处理
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
