postgresql日常维护

1. 备份与恢复

  • 物理备份

    • 使用 pg_basebackup 进行全量备份:

      复制代码
      pg_basebackup -D /backup/path -U postgres -P -Fp -Xs -R
    • 结合 WAL 归档实现持续增量备份。

  • 逻辑备份

    • 单库备份:pg_dump -U postgres -d dbname -f dbname.sql

    • 全库备份:pg_dumpall -U postgres -f alldb.sql

    • 定时任务示例(cron):

      复制代码
      0 2 * * * pg_dump -U postgres dbname | gzip > /backup/dbname_$(date +\%F).sql.gz
  • 注意事项

    • 定期验证备份文件可恢复性。

    • 备份文件存储建议与数据库服务器分离。


2. 空间回收与优化(VACUUM)

  • 自动VACUUM

    • 默认启用,调整配置(postgresql.conf):

      复制代码
      autovacuum = on
      autovacuum_max_workers = 3      # 根据负载调整
      autovacuum_vacuum_cost_limit = 2000  # 提高自动清理效率
    • 监控自动清理状态:

      复制代码
      SELECT * FROM pg_stat_all_tables WHERE schemaname = 'public';
  • 手动VACUUM

    • 常规清理:VACUUM;(不锁表)

    • 彻底回收空间:VACUUM FULL;(锁表,建议维护窗口执行)

    • 针对大表优化:VACUUM ANALYZE table_name;

  • 注意事项

    • 避免频繁执行 VACUUM FULL,可能引起表锁定。

    • 监控表膨胀情况:

      复制代码
      SELECT pg_size_pretty(pg_total_relation_size('table_name'));

3. 统计信息更新(ANALYZE)

  • 手动更新统计信息:

    复制代码
    ANALYZE table_name;  -- 单表
    ANALYZE;             -- 全库
  • 确保查询优化器使用最新统计信息,提升执行计划准确性。


4. 索引维护

  • 重建索引

    复制代码
    REINDEX TABLE table_name;       -- 表所有索引
    REINDEX INDEX index_name;       -- 单索引
  • 监控无效/重复索引:

    复制代码
    SELECT * FROM pg_stat_all_indexes WHERE schemaname = 'public';

5. 日志管理

  • 配置日志参数(postgresql.conf)

    复制代码
    log_destination = 'csvlog'
    logging_collector = on
    log_rotation_age = 1d          -- 每日轮转
    log_filename = 'postgresql-%Y-%m-%d.log'
    log_statement = 'all'          -- 可选(调试用,生产环境慎用)
  • 清理旧日志

    使用工具如 logrotate 或定时删除:

    复制代码
    find /var/lib/pgsql/logs/ -name "postgresql-*.log" -mtime +30 -delete

6. 性能监控

  • 活动会话监控

    复制代码
    SELECT * FROM pg_stat_activity WHERE state <> 'idle';
  • 慢查询分析

    启用慢查询日志(postgresql.conf):

    复制代码
    log_min_duration_statement = 1000  -- 记录超过1秒的查询
  • 关键系统视图

    • pg_stat_user_tables:表访问统计

    • pg_stat_bgwriter:后台写入统计

    • pg_locks:当前锁信息


7. 系统健康检查

  • 磁盘空间

    复制代码
    SELECT pg_size_pretty(pg_database_size('dbname'));
  • 连接数监控

    复制代码
    SHOW max_connections;           -- 最大连接数
    SELECT count(*) FROM pg_stat_activity;  -- 当前连接数
  • 操作系统级检查

    • CPU/内存:top, htop

    • 磁盘I/O:iostat, iotop


8. 安全维护

  • 权限审核

    复制代码
    SELECT * FROM pg_roles;          -- 查看用户权限
    \dp table_name                  -- 查看表权限
  • 密码更新

    复制代码
    ALTER USER username WITH PASSWORD 'new_password';

9. 自动化维护工具

  • pg_cron

    安装后定时执行任务:

    复制代码
    CREATE EXTENSION pg_cron;
    SELECT cron.schedule('0 3 * * *', 'VACUUM ANALYZE table_name');
  • 外部脚本

    结合Shell/Python脚本定期执行维护任务。

相关推荐
微露清风15 分钟前
系统性学习Linux-第二讲-基础开发工具
linux·运维·学习
阳光九叶草LXGZXJ1 小时前
达梦数据库-学习-48-DmDrs控制台命令(同步之Manager、CPT模块)
linux·运维·数据库·sql·学习
小二李2 小时前
第11章 nestjs服务端开发:登录鉴权
运维·服务器
i建模3 小时前
如何在Arch Linux中重设忘记的root密码
linux·运维·服务器
chatexcel4 小时前
元空AI+Clawdbot:7×24 AI办公智能体新形态详解(长期上下文/自动化任务/工具粘合)
运维·人工智能·自动化
kida_yuan4 小时前
【Linux】运维实战笔记 — 我常用的方法与命令
linux·运维·笔记
何中应6 小时前
vmware的linux虚拟机如何设置以命令行方式启动
linux·运维·服务器
野犬寒鸦6 小时前
从零起步学习并发编程 || 第一章:初步认识进程与线程
java·服务器·后端·学习
江畔何人初6 小时前
kubernet与docker的关系
linux·运维·云原生
bubuly7 小时前
软件开发全流程注意事项:从需求到运维的全方位指南
大数据·运维·数据库