PostgreSQL日常维护

PostgreSQL 日常维护的核心是 保障数据安全 维持系统稳定 优化性能效率需建立 "定期检查 + 主动预防 + 快速响应" 的维护逻辑 避免因数据积压 配置不当或故障扩散影响业务连续性

  • \l 列出所有数据库
  • \c [数据库名] 或 \connect [数据库名]
  • \dn 列出所有模式(Schema)
  • \db 列出所有表空间
  • \? 显示 pgsql 命令的说明(元命令查询帮助)
  • \q 退出 psql
  • \dt 列出当前数据库的所有表
  • \d [TABLE] 查看表结构
  • \du 列出所有用户

数据库运行状态

  • 重点关注数据库服务进程是否正常运行 包括主库 备库(如有)的存活状态 避免进程意外退出导致业务中断
  • 监控数据库连接数 确保连接数未达到上限 同时排查长期未释放的无效连接 减少资源浪费
  • 检查数据库日志 重点关注错误日志 慢查询日志 及时发现异常警告或错误信息 提前规避潜在故障

基础状态检查

数据库服务状态查看

bash 复制代码
# 查看服务状态
systemctl status postgresql-14  # 14为PostgreSQL版本号,根据实际修改
# 启动/停止/重启服务
systemctl start postgresql-14
systemctl stop postgresql-14
systemctl restart postgresql-14

数据库连接状态检查

查看当前连接数、活跃连接及异常连接,避免连接耗尽

sql 复制代码
-- 登录PostgreSQL(默认超级用户postgres)
psql -U postgres

-- 查看总连接数、已用连接数、最大连接数
SELECT count(*) AS total_connections,
       sum(CASE WHEN state = 'active' THEN 1 ELSE 0 END) AS active_connections,
       setting AS max_connections
FROM pg_stat_activity,
     pg_settings
WHERE name = 'max_connections'
GROUP BY setting;

-- 查看长时间未活动的连接(超过3600秒,可调整阈值)
SELECT pid, usename, datname, state, now() - query_start AS idle_time
FROM pg_stat_activity
WHERE state = 'idle in transaction'
  AND now() - query_start > '1 hour'::interval;

-- 终止异常/闲置连接(谨慎操作,pid为上述查询结果中的进程ID)
SELECT pg_terminate_backend(pid);

磁盘空间检查

PostgreSQL数据目录($PGDATA)占用空间过大易导致服务异常,每日检查磁盘使用率

bash 复制代码
​
# 查看数据目录所在磁盘使用率
df -h $PGDATA
# 查看数据目录下各文件/文件夹大小(按大小排序,取前10)
du -sh $PGDATA/* | sort -rh | head -10

​
  • 定期查看磁盘空间使用情况 包括数据库数据文件 日志文件 临时文件的占用量 预留至少 20% 的可用磁盘空间 防止磁盘满导致数据库异常
  • 关注磁盘 IO 负载 避免高频读写操作导致磁盘 IO 瓶颈 影响数据库响应速度
  • 检查数据文件的完整性 避免因磁盘坏道等问题引发数据损坏

备份与恢复

备份策略

PostgreSQL备份分为物理备份 (全量备份 适用于大规模数据)和逻辑备份(增量/全量 适用于小数据量 单表备份)日常建议结合使用

pg_dump/pg_dumpall
bash 复制代码
# 备份单个数据库(推荐,避免全量备份过大)
pg_dump -U postgres -d 数据库名 -F c -f /backup/数据库名_$(date +%Y%m%d).dump
# 备份所有数据库(慎用,数据量大时耗时久)
pg_dumpall -U postgres -f /backup/all_db_$(date +%Y%m%d).sql
# 备份单个表
pg_dump -U postgres -d 数据库名 -t 表名 -f /backup/数据库名_表名_$(date +%Y%m%d).sql
pg_basebackup
bash 复制代码
# 全量物理备份(需确保PostgreSQL配置文件中wal_level = replica)
pg_basebackup -U postgres -D /backup/base_backup_$(date +%Y%m%d) -F t -P -X stream

备份验证

bash 复制代码
# 验证逻辑备份文件完整性
pg_restore -U postgres -l /backup/数据库名_$(date +%Y%m%d).dump
# 简单恢复测试(创建临时数据库,恢复后对比数据)
createdb -U postgres test_restore
pg_restore -U postgres -d test_restore /backup/数据库名_$(date +%Y%m%d).dump
# 恢复后验证数据(如查询表行数)
psql -U postgres -d test_restore -c "SELECT count(*) FROM 表名;"
# 删除临时数据库
dropdb -U postgres test_restore

备份清理

设置备份保留策略 定期清理过期备份

bash 复制代码
# 清理7天前的逻辑备份(/backup目录下,以.dump和.sql结尾)
find /backup -name "*.dump" -o -name "*.sql" -mtime +7 -delete
# 清理30天前的物理备份(以base_backup开头的目录)
find /backup -name "base_backup_*" -type d -mtime +30 -delete

性能优化

索引维护

索引可提升查询效率 但长期插入/删除数据会导致索引碎片化 需定期重建或清理

bash 复制代码
-- 查看索引碎片化情况(idx_scan为索引扫描次数,n_live_tup为有效行数)
SELECT schemaname, relname AS table_name, indexrelname AS index_name,
       idx_scan, n_live_tup, n_dead_tup
FROM pg_stat_user_indexes
JOIN pg_stat_user_tables ON pg_stat_user_indexes.relid = pg_stat_user_tables.relid
WHERE n_dead_tup > n_live_tup * 0.2;  -- 碎片化超过20%需处理

-- 重建索引(适用于碎片化严重的索引,会锁表,建议非高峰执行)
REINDEX INDEX 索引名;
-- 并发重建索引(PostgreSQL 12+支持,不锁表,推荐生产环境)
REINDEX INDEX CONCURRENTLY 索引名;

-- 删除无用索引(idx_scan为0,且长期未使用的索引)
DROP INDEX IF EXISTS 无用索引名;

统计信息更新

PostgreSQL优化器依赖统计信息生成最优执行计划 数据频繁变更后需更新统计信息

sql 复制代码
-- 更新单个数据库的统计信息(快速,非阻塞)
ANALYZE 数据库名;
-- 更新单个表的统计信息
ANALYZE 表名;
-- 强制更新统计信息(适用于数据大幅变更后,如批量插入/删除)
ANALYZE VERBOSE 表名;

慢查询优化

定位并优化慢查询 提升数据库响应速度

sql 复制代码
-- 1. 开启慢查询日志(修改postgresql.conf配置,需重启服务)
log_min_duration_statement = 1000  -- 记录执行时间超过1秒的查询
log_statement = 'slow'
log_destination = 'csvlog'
logging_collector = on
log_directory = 'pg_log'  -- 日志存储目录

-- 2. 查看慢查询记录(通过pg_stat_statements插件,需提前安装)
-- 安装插件(在postgres数据库中执行)
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
-- 查看执行时间最长的前10条查询
SELECT queryid, query, total_time, calls, mean_time
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 10;

-- 3. 优化慢查询(常见方式)
-- 1)添加合适的索引(避免全表扫描)
-- 2)优化SQL语句(避免子查询嵌套过深、避免SELECT *)
-- 3)调整查询条件(使用索引字段作为过滤条件,避免隐式类型转换)

常见问题排查

数据库无法启动

  1. 查看服务状态:systemctl status postgresql-14 确认是否有启动失败提示

  2. 查看日志:tail -100 $PGDATA/log/postgresql-*.log 重点关注ERROR FATAL信息

  3. 常见原因:磁盘空间不足 数据目录权限异常(postgres用户无读写权限)配置文件语法错误

连接超时/无法连接

  1. 确认PostgreSQL服务已启动 且listen_addresses配置正确

  2. 查看pg_hba.conf是否允许当前IP连接

  3. 查看连接数是否已满(通过pg_stat_activity查询)若满则终止闲置连接或调整max_connections

查询执行缓慢

  1. 通过pg_stat_statements定位慢查询SQL

  2. 查看SQL执行计划(EXPLAIN ANALYZE 慢查询SQL)确认是否走索引 是否有全表扫描

  3. 检查索引是否碎片化 统计信息是否最新 必要时重建索引 更新统计信息

相关推荐
炘爚2 小时前
日志系统整体设计步骤以及功能函数梳理
运维·服务器·数据库
神の愛2 小时前
本地连接MySql数据库报错??
数据库·mysql
黑牛儿2 小时前
MySQL 索引实战详解:为什么B+类型的索引查询更快
数据库·mysql
向上的车轮2 小时前
如何用DeepSeek定制大模型——智能Text-to-SQL专家系统
数据库·sql
一个有温度的技术博主2 小时前
Redis主从同步进阶:深入理解增量同步与性能优化
数据库·redis·性能优化
榮華2 小时前
DOTA全图透视辅助下载DOTA全图科技辅助下载DOTA外挂下载魔兽争霸WAR3全图下载
数据库·科技·游戏·游戏引擎·游戏程序·ai编程·腾讯云ai代码助手
蓝眸少年CY2 小时前
Hbase - 入门到实战
大数据·数据库·hbase
DROm RAPS2 小时前
SQL中如何添加数据
数据库·sql
zzh0812 小时前
MySQL故障排查与优化笔记
数据库·笔记·mysql