PostgreSQL日常维护

目录

一、基础操作与数据库管理

[1. 登录与元命令基础](#1. 登录与元命令基础)

[2. 数据库操作45](#2. 数据库操作45)

二、数据表与模式管1314理

[1. 数据表操作](#1. 数据表操作)

[2. 模式(Sc21hema)管理](#2. 模式(Sc21hema)管理)

三、数据操作与备份28恢复

[1. 增删改查](#1. 增删改查)

[2. 备份与恢复31(SQL 转储为主)](#2. 备份与恢复31(SQL 转储为主))

四、远程连接与密码3436重置

[1. 远程连接配置](#1. 远程连接配置)

[2. 密码重置流4142程](#2. 密码重置流4142程)

五、核心

六、用户与权限管理

[1. 用户与角色管理](#1. 用户与角色管理)

[2. 权限管理](#2. 权限管理)

七、表空间管理

[1. 表空间基础](#1. 表空间基础)

[2. 表空间应用](#2. 表空间应用)

八、监控与性能调优

[1. 系统监控](#1. 系统监控)

[2. 性能调优](#2. 性能调优)

九、高可用与复制

[1. 流复制(物理复制)](#1. 流复制(物理复制))

[2. 逻辑复制](#2. 逻辑复制)

十、故障排除与恢复

[1. 常见故障处理](#1. 常见故障处理)

[2. 灾难恢复](#2. 灾难恢复)

十一、自动化运维

[1. 定期维护脚本](#1. 定期维护脚本)

[2. 监控告警配置](#2. 监控告警配置)

十二、总结与实践建议


一、基础操作与数据库管理

1. 登录与元命令基础

登录方式 :使用 postgres 用户登录,命令提示符为 postgres=#,示例:su - postgres 后执行 psql

元命令特性 :以12 \ 开头,类似 MySQL 的 SHOW 语句,用于快速管理数据库,如 \l 列出所有数据库,\q 退出 psql

2. 数据库操作45

  • 列出数据库
    • \l:简洁列出数据库。
    • \l+:扩展显3示,包含大小、表空间等信息。
    • SQL 查询:S{insert\_element\_3\_}ELECT datname FROM pg_database;pg_database 是系统表,存储数据库元信息。
  • *创建 / 删除数据库 89*:
    • 创建:CREATE DATABASE mydb;
    • 删除:DROP {insert\_element\_5\_}DATABASE mydb;
  • 切换与查看大小 11:
    • 切换:\c mydb
    • 大小查询:SEL{insert\_element\_7\_}ECT pg_database_size('mydb');(字节)或 pg_size_pretty(pg_database_size('mydb'));(易读格式)。

二、数据表与模式管1314理

1. 数据表操作

  • 列出表
    • \dt:列出当前模式下的表(默认 public)。
    • \d+:显示表15、视图和序列详情。
    • SQL 查询:S{insert\_element\_10\_}ELECT * FROM pg_tables WHERE schemaname='public';pg_tables 是逻辑视图。
  • 创建与复制表 :1718
    • 标准创建:CREATE TABLE test (id int, name char(10), age int);
    • 复制表结构与数据:19CREATE TABLE new_table AS TABLE table_name;
  • 查看表结构{insert\_element\_13\_}\d test 显示字段类型与约束。

2. 模式(Sc21hema)管理

  • 作用:逻辑容器,类似文件夹,用于组织数据库对象,避免命名冲突。
  • 核心操作
    22 - 创建:CREATE SCHEMA hr;
    • 删除:DROP {insert\_element\_16\_}SCHEMA hr;(空模式)或 DROP SCHEMA hr CASCADE;(级联删除对象)。
    • 搜索路径(sea{insert\_element\_17\_}rch_path):控制对象解析顺序,默认 $user, public,可通过 SET search_path TO hr, public; 调整优先级。
  • 跨模式查询 :需2627显式指定模式名(如 schema1.users)或通过 search_path 设置默认模式。

三、数据操作与备份28恢复

1. 增删改查

  • 插入数据INSERT INTO test VALUES(1, 'zhangsan', 18);
  • 更新数据U{insert\_element\_20\_}PDATE test SET age=20 WHERE id=1;
  • 删除数据D{insert\_element\_21\_}ELETE FROM test WHERE id=1;

2. 备份与恢复31(SQL 转储为主)

  • 备份工具pg_dump,生成 SQL 脚本,支持跨版本迁移。
    • 基本命令:pg_dump dbname > dumpfile
    • 全库备份:pg_{insert\_element\_23\_}dumpall > dumpfile,包含角色和表空间。
  • 恢复方法
    35 - 文本恢复:psql dbname < dumpfile,需提前创建数据库(基于 template0)。
    • 事务模式:psq{insert\_element\_25\_}l --set ON_ERROR_STOP=on -1 dbname < infile,确保完全恢复或回滚。

四、远程连接与密码3436重置

1. 远程连接配置

  • 修改监听地址 :编辑 postgresql.conf,将 listen_addresses 改为 *,允许所有 IP 访问。
  • 权限配置 :编辑3738 pg_hba.conf,添加规则如 host all all 0.0.0.0/0 trust(测试环境)或 md5(生产环境)。
  • 验证连接 :使用3940 psql -h 目标IP 测试,trust 模式无需密码,md5 需输入密码。

2. 密码重置流4142程

  1. 备份配置 :复制 pg_hba.confpg_hba.confbak
  2. 临时信任本地连接43 :将 pg_hba.conf 中本地连接认证改为 trust
  3. 重启服务{insert\_element\_31\_}systemctl restart postgresql
  4. 修改密码{insert\_element\_32\_}ALTER USER postgres WITH PASSWORD 'new_password';
  5. 恢复配置 :还46原 pg_hba.conf 并重启。

五、核心

  • 47适用场景:从简单应用到复杂企业级开发,需结合实际操作深化理解。
  • 扩展建议:后续可学习性能调优、高可用架构等高级功能,夯实数据库运维能力。

六、用户与权限管理

1. 用户与角色管理

  • 角色与用户的关系 :PostgreSQL 使用 "角色" 统一管理用户和组,用户是拥有 LOGIN 权限的角色。
  • 核心操作
    • 创建角色:CREATE ROLE developer;(默认无登录权限)。
    • 创建用户:CREATE ROLE dev_user WITH LOGIN PASSWORD 'password';
    • 修改角色:ALTER ROLE developer WITH LOGIN;(赋予登录权限)。
    • 删除角色:DROP ROLE developer;(需先撤销成员资格)。
  • 角色成员关系
    • 角色继承:CREATE ROLE admin SUPERUSER;GRANT admin TO dev_user;dev_user 继承 admin 权限。
    • 成员管理:GRANT admin TO dev_user;(添加成员),REVOKE admin FROM dev_user;(移除成员)。

2. 权限管理

  • 对象权限分类:SELECT、INSERT、UPDATE、DELETE、TRUNCATE、REFERENCES、TRIGGER 等。
  • 权限操作
    • 授予权限:GRANT SELECT, INSERT ON employees TO dev_user;
    • 撤销权限:REVOKE INSERT ON employees FROM dev_user;
    • 特殊权限:GRANT ALL PRIVILEGES ON employees TO dev_user;(授予所有权限)。
  • 模式权限
    • 访问控制:GRANT USAGE ON SCHEMA hr TO dev_user;(允许访问模式)。
    • 创建对象:GRANT CREATE ON SCHEMA hr TO dev_user;(允许在模式中创建对象)。
  • 默认权限 :通过 ALTER DEFAULT PRIVILEGES 设置新对象的默认权限,适用于批量管理。

七、表空间管理

1. 表空间基础

  • 定义:表空间是文件系统目录,用于存储数据库对象(表、索引等),可跨磁盘分配数据。

  • 创建表空间

    复制代码
    CREATE TABLESPACE fastspace LOCATION '/data/fast_disk';
    -- 需确保目录存在且postgres用户有读写权限
  • 删除表空间DROP TABLESPACE fastspace;(需先移动或删除其中的对象)。

2. 表空间应用

  • 在表空间创建对象

    复制代码
    CREATE DATABASE reporting TABLESPACE fastspace;
    CREATE TABLE sales (id int, amount numeric) TABLESPACE fastspace;
    CREATE INDEX idx_sales ON sales(id) TABLESPACE fastspace;
  • 移动现有对象

    复制代码
    ALTER TABLE sales SET TABLESPACE fastspace;
    ALTER INDEX idx_sales SET TABLESPACE fastspace;
  • 查看表空间使用情况

    复制代码
    SELECT spcname, pg_tablespace_size(spcname) FROM pg_tablespace;
    SELECT pg_size_pretty(pg_tablespace_size('fastspace'));

八、监控与性能调优

1. 系统监控

  • 查询性能监控

    复制代码
    -- 查看慢查询(执行时间超过1秒)
    SELECT query, total_time, calls, rows 
    FROM pg_stat_activity 
    WHERE state = 'active' AND query NOT LIKE '%pg_stat_activity%'
    ORDER BY total_time DESC LIMIT 5;
  • 锁监控

    复制代码
    -- 查看锁等待情况
    SELECT * FROM pg_locks WHERE granted = false;
  • 资源使用监控

    复制代码
    -- 查看CPU使用率
    SELECT * FROM pg_stat_activity WHERE state = 'active';
    
    -- 查看内存使用
    SHOW shared_buffers;
    SHOW work_mem;

2. 性能调优

  • 配置参数调整

    • shared_buffers:设置数据库使用的共享内存缓冲区大小,建议为物理内存的 25%。
    • work_mem:排序和哈希表操作使用的内存,单位为 KB,默认 4MB。
    • maintenance_work_mem:VACUUM、CREATE INDEX 等维护操作使用的内存。
  • 索引优化

    复制代码
    -- 创建索引
    CREATE INDEX idx_employees_name ON employees(last_name, first_name);
    
    -- 查看索引使用情况
    SELECT relname, idx_scan, idx_tup_read, idx_tup_fetch 
    FROM pg_stat_user_indexes;
  • 查询优化

    复制代码
    -- 执行计划分析
    EXPLAIN ANALYZE SELECT * FROM employees WHERE department = 'IT';

九、高可用与复制

1. 流复制(物理复制)

  • 原理:基于 WAL(预写日志)的物理复制,主库发送 WAL 日志到备库应用。
  • 配置步骤
    1. 主库配置:

      复制代码
      # postgresql.conf
      wal_level = replica
      max_wal_senders = 10
      wal_keep_segments = 32
      
      # pg_hba.conf
      host replication replicator 192.168.1.0/24 md5
    2. 备库初始化:

      复制代码
      pg_basebackup -h primary_host -D /var/lib/postgresql/data -U replicator -P -X stream
    3. 备库配置:

      复制代码
      # recovery.conf
      standby_mode = 'on'
      primary_conninfo = 'host=primary_host port=5432 user=replicator password=password'

2. 逻辑复制

  • 特点:基于行的复制,可选择性复制表,支持双向复制。
  • 配置步骤
    1. 发布端配置:

      复制代码
      CREATE PUBLICATION my_publication FOR TABLE employees, departments;
    2. 订阅端配置:

      复制代码
      CREATE SUBSCRIPTION my_subscription
      CONNECTION 'host=pub_host port=5432 dbname=pub_db user=rep_user password=password'
      PUBLICATION my_publication;

十、故障排除与恢复

1. 常见故障处理

  • 数据库无法启动
    1. 检查日志文件(通常在pg_log目录)。
    2. 验证数据目录权限:chown -R postgres:postgres /var/lib/postgresql/data
    3. 检查端口占用:netstat -tulpn | grep 5432
  • 磁盘空间不足
    1. 清理 WAL 归档:pg_archivecleanup工具。
    2. 执行 VACUUM FULL:VACUUM FULL verbose employees;
    3. 扩展存储:添加新表空间或挂载更大磁盘。

2. 灾难恢复

  • 基于时间点恢复(PITR)
    1. 确保启用 WAL 归档:

      复制代码
      # postgresql.conf
      archive_mode = on
      archive_command = 'cp %p /archive/%f'
    2. 恢复步骤:

      复制代码
      # 停止数据库
      pg_ctl stop
      
      # 复制基础备份
      cp -R /backup/basebackup /var/lib/postgresql/data
      
      # 创建恢复配置
      touch /var/lib/postgresql/data/recovery.signal
      echo "restore_command = 'cp /archive/%f %p'" > /var/lib/postgresql/data/recovery.conf
      echo "recovery_target_time = '2023-01-01 12:00:00'" >> /var/lib/postgresql/data/recovery.conf
      
      # 启动数据库
      pg_ctl start

十一、自动化运维

1. 定期维护脚本

复制代码
#!/bin/bash
# PostgreSQL日常维护脚本

# 配置信息
PGUSER="postgres"
PGPASSWORD="password"
PGHOST="localhost"
PGPORT="5432"
PGDATABASE="mydb"
LOGFILE="/var/log/postgresql/maintenance_$(date +%Y%m%d).log"

# 日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOGFILE
}

# 执行VACUUM和ANALYZE
log "开始执行VACUUM和ANALYZE..."
psql -U $PGUSER -h $PGHOST -p $PGPORT -d $PGDATABASE -c "VACUUM ANALYZE;"
log "VACUUM和ANALYZE完成"

# 备份数据库
log "开始备份数据库..."
pg_dump -U $PGUSER -h $PGHOST -p $PGPORT -d $PGDATABASE -F c -b -v -f "/backup/mydb_$(date +%Y%m%d).dump"
log "数据库备份完成"

# 清理旧备份(保留7天)
log "清理旧备份..."
find /backup -type f -name "mydb_*.dump" -mtime +7 -exec rm -f {} \;
log "旧备份清理完成"

log "维护脚本执行完毕"

2. 监控告警配置

  • 使用 pg_stat_activity 监控慢查询

    复制代码
    CREATE OR REPLACE FUNCTION check_long_running_queries()
    RETURNS void AS $$
    DECLARE
        query_record RECORD;
    BEGIN
        FOR query_record IN
            SELECT pid, query, state, query_start, now() - query_start AS duration
            FROM pg_stat_activity
            WHERE state = 'active' AND query NOT LIKE '%pg_stat_activity%'
            AND now() - query_start > interval '5 minutes'
        LOOP
            RAISE WARNING '长时间运行的查询 (PID: %, 持续时间: %):%',
                query_record.pid, query_record.duration, query_record.query;
            -- 可添加发送邮件或短信告警的逻辑
        END LOOP;
    END;
    $$ LANGUAGE plpgsql;

十二、总结与实践建议

  1. 定期维护:制定每周 / 每月维护计划,执行 VACUUM、统计信息更新和备份。
  2. 性能监控:设置自动化监控系统,及时发现并处理慢查询和资源瓶颈。
  3. 高可用部署:根据业务需求选择流复制或逻辑复制,确保数据冗余。
  4. 文档与演练:完善故障恢复文档,定期进行灾难恢复演练。
  5. 版本升级:关注 PostgreSQL 官方版本更新,适时升级以获取新特性和性能优化。
相关推荐
冬瓜的编程笔记3 小时前
【MySQL成神之路】MySQL查询用法总结
数据库·sql
StarRocks_labs3 小时前
StarRocks Community Monthly Newsletter (Apr)
数据库·starrocks·数据查询·routine load·stream load
Gauss松鼠会4 小时前
从数据到智能:openGauss+openEuler Intelligence的RAG架构实战
数据库·架构·database·opengauss·gaussdb
神码小Z4 小时前
支持向量存储:PostgresSQL及pgvector扩展详细安装步骤!老工程接入RAG功能必备!
数据库·向量数据库
惊起白鸽4504 小时前
postgreSQL日常维护
数据库
Musennn4 小时前
SQL 数值计算全解析:ABS、CEIL、FLOOR与ROUND函数深度精讲
数据库·sql
潘yi.4 小时前
PostgreSQL日常维护
数据库·postgresql
看到千里之外的云6 小时前
Oracle 11g post PSU Oct18 设置ssl连接(使用jks)
数据库·oracle·ssl
什么都想学的阿超6 小时前
14【高级指南】Django部署最佳实践:从开发到生产的全流程解析
数据库·django·sqlite