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)调整查询条件(使用索引字段作为过滤条件,避免隐式类型转换)
常见问题排查
数据库无法启动
-
查看服务状态:systemctl status postgresql-14 确认是否有启动失败提示
-
查看日志:tail -100 $PGDATA/log/postgresql-*.log 重点关注ERROR FATAL信息
-
常见原因:磁盘空间不足 数据目录权限异常(postgres用户无读写权限)配置文件语法错误
连接超时/无法连接
-
确认PostgreSQL服务已启动 且listen_addresses配置正确
-
查看pg_hba.conf是否允许当前IP连接
-
查看连接数是否已满(通过pg_stat_activity查询)若满则终止闲置连接或调整max_connections
查询执行缓慢
-
通过pg_stat_statements定位慢查询SQL
-
查看SQL执行计划(EXPLAIN ANALYZE 慢查询SQL)确认是否走索引 是否有全表扫描
-
检查索引是否碎片化 统计信息是否最新 必要时重建索引 更新统计信息