PostgreSQL初体验

目录

[一、PostgreSQL 核心概述](#一、PostgreSQL 核心概述)

(一)定义与定位

(二)核心特性与优势

(三)应用场景

[二、PostgreSQL 安装实战(基于 OpenEuler 24)](#二、PostgreSQL 安装实战(基于 OpenEuler 24))

[(一)编译安装(以 16.3 版本为例)](#(一)编译安装(以 16.3 版本为例))

[1. 环境准备](#1. 环境准备)

[2. 下载与解压源码](#2. 下载与解压源码)

[3. 配置编译参数](#3. 配置编译参数)

[4. 编译与安装](#4. 编译与安装)

[5. 创建用户与数据目录](#5. 创建用户与数据目录)

[6. 配置环境变量](#6. 配置环境变量)

[7. 初始化数据库集群](#7. 初始化数据库集群)

[8. 启动与停止服务](#8. 启动与停止服务)

[9. 登录数据库](#9. 登录数据库)

[(二)DNF 安装(快速部署 15.12 版本)](#(二)DNF 安装(快速部署 15.12 版本))

[三、PostgreSQL 逻辑与物理架构解析](#三、PostgreSQL 逻辑与物理架构解析)

(一)逻辑架构

[1. 层级结构](#1. 层级结构)

[2. 核心概念](#2. 核心概念)

[3. 对象标识符(OID)](#3. 对象标识符(OID))

(二)物理架构

[1. 目录结构](#1. 目录结构)

[2. 关键文件解析](#2. 关键文件解析)

[四、PostgreSQL 核心功能与操作](#四、PostgreSQL 核心功能与操作)

(一)用户与权限管理

[1. 创建用户与角色](#1. 创建用户与角色)

[2. 权限控制](#2. 权限控制)

[3. 角色继承](#3. 角色继承)

(二)数据类型与表操作

[1. 常用数据类型](#1. 常用数据类型)

[2. 创建表](#2. 创建表)

[3. 索引优化](#3. 索引优化)

(三)事务与并发控制

[1. 显式事务控制](#1. 显式事务控制)

[2. 保存点(Savepoint)](#2. 保存点(Savepoint))

[3. 事务隔离级别](#3. 事务隔离级别)

[五、PostgreSQL 高级特性与扩展](#五、PostgreSQL 高级特性与扩展)

(一)分区表(Partitioning)

[1. 范围分区(按时间范围分区)](#1. 范围分区(按时间范围分区))

[2. 列表分区(按地区列表分区)](#2. 列表分区(按地区列表分区))

[3. 哈希分区(按用户 ID 哈希分区)](#3. 哈希分区(按用户 ID 哈希分区))

(二)扩展应用(Extensions)

[1. PostGIS(地理信息处理)](#1. PostGIS(地理信息处理))

[2. TimescaleDB(时间序列数据)](#2. TimescaleDB(时间序列数据))

[3. Citus(分布式查询)](#3. Citus(分布式查询))

(三)备份与恢复

[1. 逻辑备份(pg_dump)](#1. 逻辑备份(pg_dump))

[2. 物理备份(pg_basebackup)](#2. 物理备份(pg_basebackup))

[3. 恢复备份](#3. 恢复备份)

(四)性能优化实战

[1. 配置参数调优](#1. 配置参数调优)

[2. 查询优化](#2. 查询优化)

[3. 自动真空(VACUUM)调优](#3. 自动真空(VACUUM)调优)

六、高可用性与复制

(一)主从复制(流复制)

[1. 主库配置(postgresql.conf)](#1. 主库配置(postgresql.conf))

[2. 从库初始化(pg_basebackup)](#2. 从库初始化(pg_basebackup))

[3. 从库配置(postgresql.conf)](#3. 从库配置(postgresql.conf))

[4. 启动从库](#4. 启动从库)

(二)逻辑复制

七、安全最佳实践

(一)认证与加密

(二)权限最小化原则

八、日常管理命令速查表


一、PostgreSQL 核心概述

(一)定义与定位

PostgreSQL 是一款开源的对象关系型数据库管理系统(ORDBMS),起源于加州大学伯克利分校,继承了 Ingres 项目的技术精髓。它不仅支持传统的关系型数据模型,还引入了对象特性(如自定义数据类型、函数、操作符等),成为现代数据库领域中功能最全面的开源解决方案之一。

(二)核心特性与优势

特性分类 具体内容
开源与自由 遵循 PostgreSQL 许可证,允许用户自由使用、修改和分发,吸引全球开发者贡献插件与解决方案(如 PostGIS 地理扩展、TimescaleDB 时间序列扩展)。
标准符合性 高度兼容 SQL 标准,支持窗口函数、公共表表达式(CTE)、子查询等高级语法,提升 SQL 代码的可读性与执行效率。
数据类型丰富 内置类型包括: - 基础类型:整数、浮点数、字符串 - 复杂类型:数组、枚举、范围类型、JSON、地理空间类型(依赖 PostGIS) - 时间类型:精确到纳秒的时间戳
事务与并发控制 采用 ** 多版本并发控制(MVCC)** 机制,确保高并发下的数据一致性;支持嵌套事务、保存点(Savepoint),满足复杂业务逻辑的事务管理需求。
扩展性 支持通过插件(Extension)扩展功能,例如: - 自定义数据类型(如网络地址类型) - 索引方法(如 GIN 索引用于全文搜索) - 过程语言(PL/pgSQL、PL/Python 等)
安全性 提供细粒度权限控制(基于角色的访问控制,RBAC)、SSL 加密传输、审计日志(log_statement),符合 GDPR 等数据合规要求。
高性能 优化手段包括: - 智能查询优化器(基于成本的优化,CBO) - 并行查询(Parallel Query) - 分区表(Range/List/Hash 分区) - 索引优化(B-tree、Hash、GIST 等索引类型)
高可用性 支持主从复制(流复制、逻辑复制)、自动故障转移(需配合 Patroni 等工具),通过 PGDG 生态实现企业级容灾方案。
成本效益 开源免费,无需支付授权费用;社区提供丰富的文档、教程与技术支持,降低企业技术选型门槛。

(三)应用场景

  1. 企业级应用:ERP、CRM 系统,如海尔集团使用 PostgreSQL 支撑供应链管理系统,处理高并发事务与复杂业务逻辑。
  2. 数据分析与数据仓库:结合 Citus 扩展实现分布式查询,支持 TB 级数据实时分析,典型案例包括 Airbnb 的实时数据看板。
  3. 地理信息系统(GIS):通过 PostGIS 扩展存储与分析地理空间数据,被 OpenStreetMap 等项目用于地图数据管理。
  4. 物联网(IoT):利用 TimescaleDB 扩展存储时间序列数据,适配传感器数据高频写入场景,如智能电网监控系统。
  5. 金融与交易系统:满足 ACID 事务特性与高可用性要求,被印度 ICICI 银行用于核心交易系统。

二、PostgreSQL 安装实战(基于 OpenEuler 24)

(一)编译安装(以 16.3 版本为例)

1. 环境准备
复制代码
# 安装编译依赖(GCC、ICU 库、Readline 库等)
[root@localhost ~]# yum -y install gcc gcc-* make libicu libicu-devel readline-devel zlib zlib-devel
2. 下载与解压源码
复制代码
# 下载 PostgreSQL 16.3 源码包(需提前安装 wget/curl)
[root@localhost ~]# wget https://ftp.postgresql.org/pub/source/v16.3/postgresql-16.3.tar.gz
# 解压源码
[root@localhost ~]# tar zxvf postgresql-16.3.tar.gz
[root@localhost ~]# cd postgresql-16.3
3. 配置编译参数
复制代码
# --prefix 指定安装目录,--with-openssl 启用 SSL 支持
[root@localhost postgresql-16.3]# ./configure --prefix=/usr/local/pgsql --with-openssl --with-libxml --with-libxslt
4. 编译与安装
复制代码
# 编译(建议多核环境使用 -j 参数加速,如 -j4)
[root@localhost postgresql-16.3]# make && make install
5. 创建用户与数据目录
复制代码
# 创建数据库专用用户(避免使用 root 运行服务)
[root@localhost ~]# adduser postgres
# 创建数据存储目录
[root@localhost ~]# mkdir -p /usr/local/pgsql/data
# 赋予用户权限
[root@localhost ~]# chown -R postgres:postgres /usr/local/pgsql/data
6. 配置环境变量
复制代码
# 编辑系统环境变量文件
[root@localhost ~]# vi /etc/profile
# 添加以下内容
export PGHOME=/usr/local/pgsql
export PATH=$PGHOME/bin:$PATH
export LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH
# 使配置生效
[root@localhost ~]# source /etc/profile
7. 初始化数据库集群
复制代码
# 切换至 postgres 用户
[root@localhost ~]# su - postgres
# 初始化集群(-D 指定数据目录,-W 启用密码认证)
[postgres@localhost ~]$ initdb -D /usr/local/pgsql/data -U postgres -W
8. 启动与停止服务
复制代码
# 启动服务(-l 指定日志文件)
[postgres@localhost ~]$ pg_ctl -D /usr/local/pgsql/data -l postgresql.log start
# 停止服务(-m 参数指定停止模式:smart/fast/immediate)
[postgres@localhost ~]$ pg_ctl -D /usr/local/pgsql/data -m fast stop
# 查看服务状态
[postgres@localhost ~]$ pg_ctl -D /usr/local/pgsql/data status
9. 登录数据库
复制代码
# 使用 psql 客户端登录(默认连接 postgres 数据库)
[postgres@localhost ~]$ psql
psql (16.3)
Type "help" for help.

postgres=# -- 查看数据库列表
postgres=# \l
# 退出客户端
postgres=# \q

(二)DNF 安装(快速部署 15.12 版本)

复制代码
# 安装官方 YUM 源(可选,若系统自带源版本较低)
[root@localhost ~]# rpm -Uvh https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -q --queryformat "%{VERSION}" centos-release)-$(arch)/pgdg-redhat-repo-latest.noarch.rpm
# 安装 PostgreSQL 服务器与客户端
[root@localhost ~]# dnf install -y postgresql15-server postgresql15
# 初始化数据库
[root@localhost ~]# /usr/pgsql-15/bin/postgresql-15-setup initdb
# 启动服务并设置开机自启
[root@localhost ~]# systemctl start postgresql-15
[root@localhost ~]# systemctl enable postgresql-15

三、PostgreSQL 逻辑与物理架构解析

(一)逻辑架构

1. 层级结构
复制代码
PostgreSQL 实例(Instance)
├─ 数据库集群(Database Cluster)
│  ├─ 数据库(Database): postgres(默认管理库)、template0(纯净模板库)、template1(默认模板库)
│  │  ├─ 模式(Schema): public(默认模式)、自定义模式(如 sales_schema)
│  │  │  ├─ 数据库对象(表、视图、索引、函数、序列等)
│  │  ├─ 表空间(Tablespace): pg_default(默认表空间)、pg_global(系统表空间)
│  ├─ 用户(User): postgres(超级用户)、普通角色(如 app_user)
2. 核心概念
  • 数据库集群(Cluster):一个 PostgreSQL 服务实例管理的所有数据库的集合,共享系统级配置(如连接池参数)。

  • 数据库(Database):逻辑隔离的存储单元,每个数据库包含独立的模式与对象,物理上对应数据目录中的一个子目录。

  • 模式(Schema) :用于隔离同一数据库内的对象(如不同用户的表),默认模式为 public,可通过 SET search_path TO schema_name; 指定搜索路径。

  • 表空间(Tablespace) :逻辑存储位置,物理对应文件系统目录,用于分散数据存储路径(如将大表存储在独立磁盘)。

    复制代码
    -- 创建自定义表空间
    CREATE TABLESPACE my_tablespace OWNER postgres LOCATION '/data/pgsql/tablespace';
    -- 创建表时指定表空间
    CREATE TABLE large_data (id INT) TABLESPACE my_tablespace;
3. 对象标识符(OID)
  • 每个数据库对象(表、索引、用户等)都有唯一的 OID(32 位无符号整数)。

  • 通过系统表查询 OID:

    复制代码
    -- 查询表的 OID
    SELECT oid FROM pg_class WHERE relname = 'users';
    -- 通过 OID 查询表名
    SELECT relname FROM pg_class WHERE oid = 16384;

(二)物理架构

1. 目录结构
复制代码
/usr/local/pgsql/          # 安装目录(默认由 --prefix 指定)
├─ bin/                    # 可执行文件(psql、pg_ctl、initdb 等)
├─ lib/                    # 动态库文件(PostgreSQL 核心库、插件库)
├─ share/                  # 文档、配置模板、SQL 脚本(如扩展插件的 SQL 文件)
└─ data/                   # 数据目录(由 initdb 初始化,需单独备份)
   ├─ base/                # 存储各数据库的数据文件(每个数据库对应一个子目录,如 base/16384 对应 template1 数据库)
   ├─ global/              # 存储集群级系统表(如 pg_database、pg_control)
   ├─ pg_commit_ts/        # 事务提交时间戳(9.5+ 版本)
   ├─ pg_dynshmem/         # 动态共享内存文件(9.4+ 版本)
   ├─ pg_logical/          # 逻辑复制状态数据(9.4+ 版本)
   ├─ pg_multixact/        # 多事务状态数据(处理行级共享锁)
   ├─ pg_wal/              # 预写日志(WAL)文件(10+ 版本,旧版本为 pg_xlog)
   ├─ pg_xact/             # 事务提交状态数据(10+ 版本,旧版本为 pg_clog)
   ├─ postgresql.conf      # 主配置文件(参数配置核心文件)
   └─ pg_hba.conf          # 客户端认证文件(控制用户连接权限)
2. 关键文件解析
  • postgresql.conf

    核心配置参数,常用配置项:

    复制代码
    listen_addresses = '*'          # 监听地址(默认 localhost,生产环境需改为 0.0.0.0)
    port = 5432                     # 端口号
    max_connections = 100           # 最大连接数
    shared_buffers = 128MB          # 共享缓冲区(建议设置为物理内存的 25%)
    work_mem = 4MB                  # 单个查询使用的工作内存
    wal_level = replica             # WAL 日志级别(minimal/replica/full)
  • pg_hba.conf

    定义客户端连接认证规则,格式:

    复制代码
    # TYPE  DATABASE        USER            ADDRESS                 METHOD
    host    all             all             127.0.0.1/32            scram-sha-256  # 本地连接使用 SCRAM-SHA-256 认证
    host    all             all             ::1/128                 scram-sha-256  # IPv6 本地连接
    host    replication     replicator      192.168.1.0/24          md5           # 主从复制使用 MD5 认证
  • WAL 文件(pg_wal/)

    预写日志用于保障数据持久化与故障恢复,每个 WAL 段文件固定为 16MB,命名格式为 000000010000000000000001(时间线 + 日志序列号)。

四、PostgreSQL 核心功能与操作

(一)用户与权限管理

1. 创建用户与角色
复制代码
-- 创建普通用户(密码加密存储)
CREATE USER app_user WITH PASSWORD 'secure_password';
-- 创建超级用户(需谨慎)
CREATE ROLE super_user WITH SUPERUSER LOGIN PASSWORD 'super_secret';
2. 权限控制
复制代码
-- 授予表查询权限
GRANT SELECT ON TABLE users TO app_user;
-- 授予模式创建权限
GRANT CREATE ON SCHEMA sales TO app_user;
-- 回收权限
REVOKE INSERT ON TABLE orders FROM app_user;
3. 角色继承
复制代码
-- 创建角色组
CREATE ROLE analysts;
-- 将用户加入角色组
GRANT analysts TO app_user;
-- 授予角色组权限
GRANT SELECT ON ALL TABLES IN SCHEMA analytics TO analysts;

(二)数据类型与表操作

1. 常用数据类型
分类 数据类型 说明
数值类型 int4, int8, numeric(p,s) numeric 用于高精度计算(如金融数据)
字符串类型 varchar(n), text text 无长度限制,varchar (n) 限制最大长度
时间类型 timestamp, interval timestamp 包含日期时间,interval 表示时间间隔(如 '1 day 2 hours')
数组类型 int[], varchar(10)[] 一维 / 多维数组,如 {1,2,3}ARRAY[1,2,3]
JSON 类型 json, jsonb jsonb 支持索引与查询优化,推荐用于存储半结构化数据
地理空间类型 geography, geometry 需安装 PostGIS 扩展,支持点、线、面等空间对象
2. 创建表
复制代码
-- 创建用户表(含数组与 JSONB 字段)
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    emails TEXT[],             -- 邮箱数组
    metadata JSONB,            -- 扩展元数据
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
3. 索引优化
复制代码
-- 创建 B-tree 索引(默认类型,适用于等值查询)
CREATE INDEX idx_users_name ON users(name);
-- 创建 GIN 索引(适用于数组或 JSONB 全文搜索)
CREATE INDEX idx_users_emails ON users USING GIN(emails);
-- 创建部分索引(仅对符合条件的数据建索引)
CREATE INDEX idx_users_active ON users(id) WHERE status = 'active';

(三)事务与并发控制

1. 显式事务控制
复制代码
BEGIN;                          -- 开启事务
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;                         -- 提交事务(若中间出错则自动回滚)
2. 保存点(Savepoint)
复制代码
BEGIN;
INSERT INTO orders (order_date) VALUES ('2023-10-01');
SAVEPOINT sp1;                  -- 设置保存点
INSERT INTO order_items (order_id, product_id) VALUES (1, 101);
-- 回滚到保存点,保留之前的插入操作
ROLLBACK TO sp1;
COMMIT;
3. 事务隔离级别
复制代码
-- 设置事务隔离级别为可重复读(默认级别)
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- 查看当前会话隔离级别
SELECT current_setting('transaction_isolation');

五、PostgreSQL 高级特性与扩展

(一)分区表(Partitioning)

分区表用于将大型表的数据分散到多个物理子表中,提升查询性能与管理效率。PostgreSQL 支持范围分区(Range)列表分区(List)、** 哈希分区(Hash)** 三种方式。

1. 范围分区(按时间范围分区)
复制代码
-- 创建主表(声明为分区表)
CREATE TABLE sales (
    order_id INT,
    order_date DATE,
    amount NUMERIC
) PARTITION BY RANGE (order_date);

-- 创建分区函数(定义分区范围)
CREATE OR REPLACE FUNCTION sales_partition_func() RETURNS TRIGGER AS $$
BEGIN
    IF NEW.order_date < '2023-01-01' THEN
        INSERT INTO sales_2022 VALUES (NEW.*);
    ELSIF NEW.order_date < '2024-01-01' THEN
        INSERT INTO sales_2023 VALUES (NEW.*);
    ELSE
        INSERT INTO sales_future VALUES (NEW.*);
    END IF;
    RETURN NULL;
END;
$$ LANGUAGE plpgsql;

-- 创建分区表
CREATE TABLE sales_2022 PARTITION OF sales FOR VALUES FROM ('-infinity') TO ('2023-01-01');
CREATE TABLE sales_2023 PARTITION OF sales FOR VALUES FROM ('2023-01-01') TO ('2024-01-01');
CREATE TABLE sales_future PARTITION OF sales FOR VALUES FROM ('2024-01-01') TO ('infinity');

-- 绑定触发器(自动路由数据到对应分区)
CREATE TRIGGER sales_partition_trigger BEFORE INSERT ON sales
FOR EACH ROW EXECUTE FUNCTION sales_partition_func();
2. 列表分区(按地区列表分区)
复制代码
CREATE TABLE users (
    user_id INT,
    region TEXT,
    email TEXT
) PARTITION BY LIST (region);

CREATE TABLE users_north PARTITION OF users FOR VALUES IN ('north', 'northeast');
CREATE TABLE users_south PARTITION OF users FOR VALUES IN ('south', 'southeast');
CREATE TABLE users_other PARTITION OF users FOR VALUES IN (DEFAULT);
3. 哈希分区(按用户 ID 哈希分区)
复制代码
CREATE TABLE orders (
    order_id INT,
    user_id INT,
    order_time TIMESTAMP
) PARTITION BY HASH (user_id) PARTITIONS 4; -- 自动创建4个哈希分区
(二)扩展应用(Extensions)

PostgreSQL 通过 CREATE EXTENSION 命令加载扩展,以下是常用扩展示例:

1. PostGIS(地理信息处理)
复制代码
-- 安装 PostGIS 扩展(需先安装系统包 postgis)
CREATE EXTENSION postgis;

-- 创建地理空间表(存储点坐标)
CREATE TABLE restaurants (
    id SERIAL,
    name TEXT,
    location GEOGRAPHY(POINT) -- 使用地理坐标系(WGS84)
);

-- 插入数据(WKT 格式:POINT(longitude latitude))
INSERT INTO restaurants (name, location) VALUES (
    'Pizza Hut', 
    ST_GeogFromText('POINT(-73.9654 40.7821)')
);

-- 查询半径5公里内的餐厅
SELECT name FROM restaurants
WHERE ST_DWithin(location, ST_GeogFromText('POINT(-73.9847 40.7589)'), 5000);
2. TimescaleDB(时间序列数据)
复制代码
-- 安装 TimescaleDB 扩展
CREATE EXTENSION timescaledb;

-- 创建时间序列表(自动转换为超表)
CREATE TABLE sensor_data (
    time TIMESTAMP NOT NULL,
    device_id INT NOT NULL,
    temperature FLOAT,
    humidity FLOAT
);
SELECT create_hypertable('sensor_data', 'time'); -- 转换为超表

-- 插入数据
INSERT INTO sensor_data (time, device_id, temperature, humidity)
VALUES (NOW(), 1, 25.5, 60.0);

-- 聚合查询(按小时统计平均温度)
SELECT time_bucket('1 hour', time) AS hour, AVG(temperature)
FROM sensor_data
GROUP BY hour
ORDER BY hour;
3. Citus(分布式查询)
复制代码
# 安装 Citus 扩展(需编译安装或通过包管理器获取)
[root@localhost ~]# dnf install -y postgresql-citus

-- 启用 Citus 扩展
CREATE EXTENSION citus;

-- 创建分布式表(指定分布列)
CREATE TABLE orders (
    order_id BIGINT,
    customer_id INT,
    order_total NUMERIC
);
SELECT create_distributed_table('orders', 'customer_id'); -- 按 customer_id 分布

-- 创建参考表(小表,全节点复制)
CREATE TABLE customers (
    customer_id INT PRIMARY KEY,
    customer_name TEXT
);
SELECT create_reference_table('customers');
(三)备份与恢复
1. 逻辑备份(pg_dump)
复制代码
# 备份单个数据库(压缩为 SQL 文件)
pg_dump -U postgres -d mydb -f mydb_backup.sql -Z 9
# 备份指定表
pg_dump -U postgres -d mydb -t users -t orders > tables_backup.sql
# 备份整个集群(包含所有数据库,需使用 pg_dumpall)
pg_dumpall -U postgres -f cluster_backup.sql
2. 物理备份(pg_basebackup)
复制代码
# 全量备份(流复制模式,需开启 wal_level=replica)
pg_basebackup -U postgres -h localhost -D /backup/pg_basebackup \
--wal-method=stream --backup-mode=full --compress=zstd
3. 恢复备份
复制代码
# 恢复逻辑备份
psql -U postgres -d mydb < mydb_backup.sql
# 恢复物理备份(需停止数据库服务)
systemctl stop postgresql
rm -rf /usr/local/pgsql/data/*
cp -R /backup/pg_basebackup/* /usr/local/pgsql/data/
chown -R postgres:postgres /usr/local/pgsql/data
pg_ctl -D /usr/local/pgsql/data -l logfile start
(四)性能优化实战
1. 配置参数调优
复制代码
# postgresql.conf 关键参数优化(适用于 16GB 内存服务器)
max_connections = 200         # 根据应用连接数调整
shared_buffers = 4GB          # 内存的 25%
work_mem = 32MB               # 复杂查询(排序/哈希连接)的工作内存
maintenance_work_mem = 1GB    # VACUUM/REINDEX 等维护操作内存
effective_cache_size = 12GB   # 内核缓存+共享缓冲区,建议内存的 75%
wal_buffers = 128MB           # WAL 缓冲区(默认 128MB,大事务可增大)
random_page_cost = 1.1        # SSD 存储设为 1.1,HDD 设为 4.0
2. 查询优化
复制代码
-- 分析查询计划(查看执行成本与索引使用情况)
EXPLAIN ANALYZE SELECT * FROM users WHERE email = '[email protected]';

-- 强制使用索引(避免全表扫描)
SET enable_seqscan = OFF;
SELECT * FROM large_table WHERE id = 1234;
RESET enable_seqscan;
3. 自动真空(VACUUM)调优
复制代码
# 调整真空参数(减少长事务阻塞)
autovacuum_vacuum_scale_factor = 0.02   # 当脏页比例超过 2% 时触发真空
autovacuum_vacuum_threshold = 50        # 最小脏页数
vacuum_cost_delay = 20ms                # 真空操作延迟(降低 I/O 冲击)
vacuum_cost_limit = 2000                # 真空操作最大成本

六、高可用性与复制

(一)主从复制(流复制)

1. 主库配置(postgresql.conf)
复制代码
wal_level = replica          # 启用复制功能
max_wal_senders = 5          # 最大发送进程数
wal_keep_segments = 32       # 保留 WAL 段数(单位:16MB,用于故障恢复)
listen_addresses = '*'       # 监听所有 IP
2. 从库初始化(pg_basebackup)
复制代码
# 在从库节点执行
pg_basebackup -U postgres -h master_ip -D /usr/local/pgsql/data \
--wal-method=stream --create-slot=slave_slot
3. 从库配置(postgresql.conf)
复制代码
hot_standby = on             # 启用只读模式
primary_conninfo = 'host=master_ip port=5432 user=replica password=replica_password'
4. 启动从库
复制代码
pg_ctl -D /usr/local/pgsql/data start
# 验证复制状态
psql -c "SELECT * FROM pg_stat_replication;"

(二)逻辑复制

复制代码
-- 主库创建发布(Publication)
CREATE PUBLICATION my_publication FOR TABLE users, orders;

-- 从库创建订阅(Subscription)
CREATE SUBSCRIPTION my_subscription
CONNECTION 'host=master_ip port=5432 user=replica password=replica_password dbname=mydb'
PUBLICATION my_publication;

七、安全最佳实践

(一)认证与加密

  1. 使用 SCRAM-SHA-256 认证 (pg_hba.conf):

    复制代码
    host all all 0.0.0.0/0 scram-sha-256
  2. 启用 SSL 加密 (postgresql.conf):

    复制代码
    ssl = on
    ssl_cert_file = 'server.crt'
    ssl_key_file = 'server.key'
    ssl_ca_file = 'root.crt'  # 可选,客户端证书验证

(二)权限最小化原则

  • 避免使用超级用户执行日常操作,为应用创建专用角色。

  • 限制 PUBLIC 模式的权限:

    复制代码
    REVOKE ALL ON SCHEMA public FROM PUBLIC;
    GRANT USAGE ON SCHEMA public TO app_user;

八、日常管理命令速查表

操作类型 命令示例
查看数据库列表 \l
查看表结构 \d users
查看当前用户 SELECT current_user;
查看参数配置 SHOW all;
清理无效对象 VACUUM FULL ANALYZE;
查看慢查询日志 tail -f /usr/local/pgsql/data/pg_log/postgresql-SLOW-*.log
监控数据库状态 pg_stat_statements 扩展(需安装)或 pg_top 工具
相关推荐
好想有猫猫27 分钟前
【Redis】List 列表
数据库·c++·redis·分布式·缓存·list
日日行不惧千万里2 小时前
数据库故障排查指南
网络·数据库·oracle
神秘敲码人3 小时前
Django基础(二)Django 项目基础操作
数据库·笔记·django
程序员Bears3 小时前
电商后台管理系统:Django Admin深度定制实战指南
数据库·django·sqlite
TDengine (老段)3 小时前
TDengine 2025年产品路线图
大数据·数据库·动态规划·时序数据库·tdengine·涛思数据
Aurora_NeAr3 小时前
Redis设计与实现——分布式Redis
数据库·redis·分布式
bst@微胖子3 小时前
DeepSeek提示工程Prompt Engineering
java·数据库·prompt
xuyin12045 小时前
SQLite基础及优化
数据库·sqlite
Faith_xzc5 小时前
MySQL 迁移至 Doris 最佳实践方案
数据库·mysql·adb
ikun·5 小时前
MySQL高可用
数据库·mysql