PostgreSQL日常维护

目录

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

1. 登录与元命令基础

2. 数据库操作45

二、数据表与模式管1314理

1. 数据表操作

2. 模式(Sc21hema)管理

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

1. 增删改查

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

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

1. 远程连接配置

2. 密码重置流4142程

五、核心

六、用户与权限管理

1. 用户与角色管理

2. 权限管理

七、表空间管理

1. 表空间基础

2. 表空间应用

八、监控与性能调优

1. 系统监控

2. 性能调优

九、高可用与复制

1. 流复制(物理复制)

2. 逻辑复制

十、故障排除与恢复

1. 常见故障处理

2. 灾难恢复

十一、自动化运维

1. 定期维护脚本

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.conf 为 pg_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 官方版本更新,适时升级以获取新特性和性能优化。

你可能感兴趣的:(数据库,oracle)