PostgreSQL 环境搭建与核心命令行实战

概述

前文回顾:《PostgreSQL 特性全景与选型指南》从宏观视角系统阐述了 PG 的设计哲学、六大核心特性以及与 MySQL 的全方位对比。本文将从动手实践的角度出发,带领读者在本地环境中亲手搭建 PostgreSQL 环境,并通过一系列 CLI 命令的实操,将前文所学的多进程架构、WAL 机制、MVCC 等抽象概念转化为具体的、可观测的行为。

学习 PostgreSQL 最好的方式不是阅读文档,而是亲手部署一个实例,然后通过命令行观察每一个操作背后的数据库行为。 本文将采用 Docker Compose 快速部署 PG 单实例(以及可选的主从集群),并逐一演练 psqlpgbenchpg_dump/pg_restore 等核心 CLI 工具。最终通过一个完整的生命周期演示------从建表到压测、备份、故障恢复------让读者建立起对 PG 运维能力的直观感知。

核心要点

  • 环境搭建 :Docker Compose 单实例部署、数据卷持久化、init.sql 初始化。
  • 配置解读 :按功能域分类解读 postgresql.confpg_hba.conf 的核心参数。
  • psql 深度使用:连接管理、对象查看、SQL 辅助、导入导出。
  • pgbench 压测:标准压测与自定义 SQL 脚本压测、结果分析与性能拐点。
  • pg_dump/pg_restore:四种导出格式、选择性备份、并行恢复、故障模拟。
  • 全链路演示:从建表到备份恢复的完整生命周期。

文章组织架构图

下面是全文的模块化组织架构,用数字序号明确各模块的层级与流转关系:

flowchart TD 1[1. 环境搭建: Docker Compose单实例与主从集群] 2[2. 核心配置文件按功能域解读] 3[3. psql 命令行深度使用] 4[4. pgbench 性能基准测试与结果分析] 5[5. pg_dump/pg_restore 逻辑备份与恢复] 6[6. PG 工具生态全景图] 7[7. 全链路流转演示] 8[8. 面试高频专题] 1 --> 2 2 --> 3 3 --> 4 4 --> 5 5 --> 6 6 --> 7 7 --> 8

架构图说明

  • 总览说明:全文共 8 个模块,从环境搭建出发,逐步深入到配置解读、三大 CLI 工具的逐个实战,再到 PG 工具生态全景,最后通过全链路演示和面试题完成知识闭环。各模块之间存在严格的逻辑递进关系,读者可按序学习,形成完整的认知路径。
  • 逐模块说明 :模块 1 建立可运行的 PG 环境,是后续所有实操的基础;模块 2 深入解读配置文件背后的设计意图,帮助读者理解 PG 的资源管理和写入机制;模块 3-5 逐一掌握 psqlpgbenchpg_dump/pg_restore 核心工具,覆盖日常开发、性能评估与数据安全保障;模块 6 以全景图方式建立对整个 PG 工具链的宏观认知;模块 7 将前面所有知识点串联为一个完整的生命周期演示,强化记忆;模块 8 通过 10 道高频率面试题(含实操题)检验学习成果。
  • 关键结论掌握 PostgreSQL CLI 工具是运维和排错的基本功。通过 psql 查看执行计划和统计信息,通过 pgbench 评估性能瓶颈,通过 pg_dump/pg_restore 保障数据安全,是每一位 PG 使用者的必备技能。

1. 环境搭建:Docker Compose 单实例部署与主从集群

1.1 Docker Compose 简介与前置依赖

Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。通过一个 docker-compose.yml 文件,我们可以声明式地配置服务、网络、数据卷等,并通过一条命令 docker-compose up -d 将整个应用栈启动。相比于原生 docker run,Compose 的优势在于环境的一致性和可重复性,非常适合本地开发、CI/CD 测试以及快速学习 PG。

前置依赖

  • Docker Engine 20.10+
  • docker-compose v2.0+ (或 Docker Desktop,内置 compose 功能)
  • 基本的命令行操作能力

1.2 单实例部署:docker-compose.yml 配置详解

下面是一个最基础但功能完备的 PG 16 单实例部署文件,包含数据持久化、端口映射和初始化脚本挂载。

yaml 复制代码
# file: docker-compose.yml
version: '3.8'

services:
  pg16:
    image: postgres:16-alpine          # 使用官方轻量级镜像
    container_name: pg16_instance
    restart: unless-stopped
    environment:
      POSTGRES_USER: admin              # 超级用户名
      POSTGRES_PASSWORD: Str0ngP@ss!    # 超级用户密码
      POSTGRES_DB: testdb               # 默认创建的数据库
      PGDATA: /var/lib/postgresql/data/pgdata  # 可通过环境变量覆盖默认数据目录
    ports:
      - "5432:5432"                     # 宿主机:容器端口映射
    volumes:
      - ./pgdata:/var/lib/postgresql/data # 数据持久化,将容器内数据目录映射到宿主机
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro  # 初始化脚本,只读挂载

环境变量详解

  • POSTGRES_USER:指定超级用户名称,默认为 postgres。首次启动时会以此创建超级用户。
  • POSTGRES_PASSWORD:超户密码,必须设置,否则容器启动失败。
  • POSTGRES_DB:在首次启动时创建的默认数据库。如果不指定,则使用 POSTGRES_USER 的值作为数据库名。
  • PGDATA:明确指定 PG 数据目录,非必须,但推荐显式定义,便于理解。

数据卷挂载./pgdata 目录映射到容器内数据目录。这样即使容器被删除重建,只要宿主机目录还在,数据就不会丢失。注意:PostgreSQL 16 镜像内部默认数据目录为 /var/lib/postgresql/data,我们使用了子目录 pgdata 来强调 PG 16 的数据目录。

初始化脚本挂载 : PostgreSQL 官方镜像的入口脚本会在容器首次启动时,执行 /docker-entrypoint-initdb.d/ 目录下的所有 .sql.sh 文件。我们通过 :ro 以只读方式挂载本地的 init.sql,用于自动创建表结构和初始数据。

1.3 init.sql 初始化脚本示例

sql 复制代码
-- file: init.sql
-- 连接到 testdb 数据库 (启动时已存在)
\c testdb

-- 创建一个扩展,用于后续练习统计信息
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

-- 创建用户表
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100),
    created_at TIMESTAMP DEFAULT now()
);

-- 插入一些初始数据
INSERT INTO users (username, email) VALUES
    ('alice', 'alice@example.com'),
    ('bob', 'bob@example.com'),
    ('charlie', 'charlie@example.com');

注意 :脚本中的 \c testdb 是 psql 的元命令,对于直接通过入口点执行的 SQL 文件同样有效。但更规范的做法是在连接时指定数据库,或使用 \connect。为了兼容性,也可以在 POSTGRES_DB 环境中指定,然后所有 SQL 都在该数据库上执行。

1.4 启动与验证

docker-compose.yml 所在目录下执行:

bash 复制代码
# 后台启动服务
docker-compose up -d

# 查看日志,确认启动成功
docker-compose logs pg16

日志末尾出现类似 database system is ready to accept connections 表示启动成功。然后使用 psql 连接验证:

bash 复制代码
psql -h localhost -p 5432 -U admin -d testdb
# 输入密码后进入交互界面
testdb=# \dt
        List of relations
 Schema | Name  | Type  | Owner
--------+-------+-------+-------
 public | users | table | admin
(1 row)

此时即可看到 users 表已创建完毕。

1.5 主从集群搭建(简要)

为了给第 11 篇《PostgreSQL 高可用与流复制实战》做铺垫,这里简要展示如何使用 Docker Compose 搭建一个单主一从的流复制集群。

yaml 复制代码
# 集群 docker-compose-replication.yml 示例(只展示关键差异)
services:
  master:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: Str0ngP@ss!
      POSTGRES_DB: testdb
    volumes:
      - ./master-data:/var/lib/postgresql/data
      - ./config/master-postgresql.conf:/etc/postgresql/postgresql.conf
      - ./config/master-pg_hba.conf:/etc/postgresql/pg_hba.conf
    ports:
      - "5433:5432"

  standby:
    image: postgres:16-alpine
    depends_on:
      - master
    environment:
      POSTGRES_PASSWORD: Str0ngP@ss!
    volumes:
      - ./standby-data:/var/lib/postgresql/data
      - ./config/standby-recovery.conf:/tmp/recovery.conf
    command: >
      bash -c "until pg_isready -h master -U admin; do sleep 1; done;
      cp /tmp/recovery.conf /var/lib/postgresql/data/recovery.conf &&
      docker-entrypoint.sh postgres"

关键配置片段

master-pg_hba.conf 中添加一行允许复制连接:

复制代码
host replication replicator 0.0.0.0/0 md5

standby-recovery.conf 内容:

ini 复制代码
standby_mode = 'on'
primary_conninfo = 'host=master port=5432 user=replicator password=Repl1caP@ss'

主库需设置 wal_level = replica 以及 max_wal_senders。由于本节重点不在集群,具体详细配置将在后续章节展开。

1.6 Docker 部署架构图

flowchart TB subgraph Host Machine direction TB Client[psql Client / Application] DockerEngine[Docker Engine] subgraph Services Master[(pg16 Master
port 5432)] Standby[(pg16 Standby
port 5433)] end Volumes[(Host Volumes
./pgdata, ./init.sql)] end Client -->|psql -h localhost -p 5432| Master Master -->|Streaming Replication| Standby Master --> Volumes DockerEngine --> Services

图 1 说明

  • 总览说明:该架构图展示了 Docker 宿主机上的 PostgreSQL 部署拓扑。Client 通过宿主机端口 5432 连接主库;主库和备库之间通过流复制保持数据同步。所有持久化数据通过 bind mount 存储在宿主机文件系统。
  • 核心组件解读Master 容器是读写节点,处理所有业务请求;Standby 是只读备节点,在发生故障时可提升为主。数据卷确保 PG 数据在容器重启或删除后仍然存在。
  • 部署要点 :必须正确挂载配置文件和初始化脚本;主库的 pg_hba.conf 需允许备库的复制连接;备库的 recovery.conf 需指定主库连接信息并开启 standby_mode
  • 安全考量 :认证方法建议使用 scram-sha-256,密码不能硬编码于仓库,应通过环境变量或 secrets 传入。

2. 核心配置文件按功能域逐行解读

PG 的核心配置集中在 postgresql.conf(运行时参数)和 pg_hba.conf(客户端认证)。按功能域分类解读,能帮助读者建立模块化思维,在排查问题时快速定位。

2.1 连接与认证

参数解读(postgresql.conf

conf 复制代码
# 监听地址,'*' 表示监听所有网络接口,逗号分隔可指定多个IP。
listen_addresses = '*'
# 端口号
port = 5432
# 最大并发连接数,包括超级用户预留的连接(superuser_reserved_connections)。
max_connections = 100
  • listen_addresses:生产环境建议根据实际网段修改,例如 '192.168.1.0/24',或者与反向代理共同使用,避免直接暴露所有接口。
  • max_connections:每个连接都会占用一定的内存和进程资源(每个后端进程大约 5-10 MB)。设置过高可能导致 OOM。建议通过连接池(PgBouncer)管理。

pg_hba.conf 客户端认证规则

sql 复制代码
# TYPE  DATABASE    USER        ADDRESS          METHOD
host    all         all         0.0.0.0/0        md5
local   all         admin                        peer
host    replication replicator  192.168.0.10/32  scram-sha-256
  • TYPElocal 表示 Unix 域套接字,host 表示 TCP/IP 连接,hostssl 强制 SSL。
  • DATABASE/USER :可以指定具体数据库或用户,all 表示所有。
  • ADDRESS:CIDR 格式,用于匹配客户端 IP。
  • METHODmd5(基于 MD5 的密码认证,兼容性好)、scram-sha-256(更安全的挑战-响应机制)、trust(无密码,仅限测试)、peer(从操作系统用户映射,本地套接字默认)。

实践建议 :远程连接务必使用 scram-sha-256,并配合 SSL。

2.2 内存与资源

PG 的内存使用主要由共享缓冲区和进程级工作内存构成。

conf 复制代码
shared_buffers = 256MB              # 共享数据页缓存,一般为系统内存的 25%
work_mem = 4MB                      # 单个查询操作(排序、哈希)可用内存
maintenance_work_mem = 64MB         # VACUUM, CREATE INDEX 等维护操作用内存
effective_cache_size = 4GB          # 优化器估算的操作系统文件缓存 + shared_buffers 总大小
  • shared_buffers:PG 传统上依赖 OS 的文件缓存,增大该值可减少磁盘 I/O,但太大可能导致 double buffering 和检查点压力。一般建议物理内存的 25%,不超过 40%(适用于专用数据库服务器)。
  • work_mem:每个复杂查询的每个排序或哈希操作都可用此内存,若一次性连接很多执行复杂 SQL 的会话,总内存需求为 work_mem * 同时执行的排序操作数。在 OLAP 场景可调大,OLTP 需保守设置。
  • maintenance_work_mem:加速索引创建和 VACUUM,可临时调高,如 SET maintenance_work_mem = '1GB'
  • effective_cache_size:仅为规划器提供估算,不分配实际内存。一个合理值是系统总内存的 50%-75%。

2.3 WAL 与写入

WAL 是 PG 持久性和复制的基础。

conf 复制代码
wal_level = replica                  # 或 logical,决定 WAL 日志的信息量
wal_buffers = 16MB                   # WAL 缓冲区大小,默认 -1(shared_buffers 的 1/32)
checkpoint_timeout = 5min            # 检查点最大时间间隔
max_wal_size = 1GB                   # 触发检查点的 WAL 总大小阈值
fsync = on                           # 强制刷盘保证 ACID 的 D
  • wal_levelreplica 足以支持流复制;若需要逻辑复制或逻辑解码,必须设为 logical,这会在 WAL 中写入更多信息,增加日志量。
  • wal_buffers:未提交的事务修改先写入 WAL buffer,再刷写到 WAL 文件。写入频繁的环境可适当增大。
  • 检查点触发条件:checkpoint_timeoutmax_wal_size 任意一个达到即触发。检查点会将所有脏页强制刷盘,造成一瞬间的 I/O 尖峰。现代 PG 通过 checkpoint_completion_target 控制刷盘速度,分散负载。
  • fsync:关闭该参数会极大提高性能,但一旦操作系统崩溃,数据库可能损坏,生产环境必须开启

2.4 查询与统计

conf 复制代码
log_statement = 'mod'                # 'none', 'ddl', 'mod' (ddl + dml), 'all'
log_duration = off                   # 记录语句执行时长
shared_preload_libraries = 'pg_stat_statements'  # 启动时加载的扩展
  • log_statement'mod' 可记录所有数据修改语句,包括 DDL 和 DML,适合审计;'all' 会记录所有 SELECT 等,日志量巨大,谨慎使用。
  • log_duration:为 on 时每条 SQL 都会记录执行时间,结合 log_statement 使用,建议通过 log_min_duration_statement 设置慢查询阈值代替。
  • pg_stat_statements:必须通过此参数预加载才能使用。它能归一化所有 SQL 并统计调用次数、总时间、命中/未命中缓存等,是性能分析神器。

2.5 配置功能域分类概览图

flowchart LR subgraph PG 核心配置 direction LR A[连接与认证] B[内存与资源] C[WAL 与写入] D[查询与统计] end A --> A1[listen_addresses, port, max_connections] A --> A2[pg_hba.conf: 认证规则与方法] B --> B1[shared_buffers, work_mem, maintenance_work_mem] B --> B2[effective_cache_size] C --> C1[wal_level, wal_buffers, fsync] C --> C2[checkpoint 参数] D --> D1[log_statement, log_duration] D --> D2[shared_preload_libraries, pg_stat_statements]

图 2 说明

  • 总览说明 :该图将 postgresql.confpg_hba.conf 的核心参数按功能域划分为四大类:连接与认证、内存与资源、WAL 与写入、查询与统计。每大类下又细分关键参数子集。
  • 分类逻辑:连接与认证控制准入;内存与资源决定查询性能;WAL 与写入保障持久性与复制;查询与统计提供可观测性。这种分类便于在排查性能或连接问题时快速定位配置区间。
  • 调优关联 :例如增大 work_mem 可能加速排序,但需考虑并发连接数;修改 wal_level 影响逻辑复制可用性。各域参数相互制约,需全局权衡。
  • 运维建议 :初学者先保持大部分默认值,只根据硬件调整 shared_bufferseffective_cache_size。随着业务增长,逐步调节 work_memmax_wal_size

3. psql 命令行深度使用

psql 是 PostgreSQL 的原生命令行前端,几乎所有的管理操作都可以通过它完成。下面我们分功能类进行深度演练。

3.1 连接管理

bash 复制代码
# 基础 TCP 连接
psql -h localhost -p 5432 -U admin -d testdb
# 连接后,输入密码

常用内部元命令:

  • \c [database] [user]:切换数据库或用户。例如 \c testdb admin
  • \conninfo:显示当前连接详情。

输出示例

csharp 复制代码
testdb=# \conninfo
You are connected to database "testdb" as user "admin" on host "localhost" (address "127.0.0.1") at port "5432".

解读:明确当前数据库、用户、主机和端口,在排查"我连错了库"时非常实用。

3.2 数据库对象查看

元命令 功能 示例
\l 列出所有数据库 \l\l+ 显示更多信息
\dt 列出当前数据库的表 \dt public.* 过滤 schema
\di 列出索引 \di
\dv 列出视图 \dv
\df 列出函数 \df
\d+ table_name 显示表的详细定义,包括存储参数、索引、约束、描述 \d+ users

详细 \d+ users 输出示例

sql 复制代码
                                                  Table "public.users"
   Column   |            Type             | Collation | Nullable |              Default              | Storage  | Stats target | Description
------------+-----------------------------+-----------+----------+-----------------------------------+----------+--------------+-------------
 id         | integer                     |           | not null | nextval('users_id_seq'::regclass) | plain    |              |
 username   | character varying(50)       |           | not null |                                   | extended |              |
 email      | character varying(100)      |           |          |                                   | extended |              |
 created_at | timestamp without time zone |           |          | now()                             | plain    |              |
Indexes:
    "users_pkey" PRIMARY KEY, btree (id)
    "users_username_key" UNIQUE CONSTRAINT, btree (username)
Access method: heap

解读

  • 列出了每个列的数据类型、存储策略(plain vs extended)。
  • 索引部分展示了主键和唯一约束对应的索引以及索引类型(btree)。
  • Access method: heap 说明该表是普通堆表。

3.3 SQL 执行辅助

  • \timing:切换执行计时。开启后每个 SQL 完成后会显示执行时间。
  • \e:打开系统默认编辑器($EDITOR 环境变量或 vi)编辑上一条 SQL,保存退出即执行。
  • \g:重新执行最后一次发送的查询(类似再按一次回车,但在有偏移时很有用)。
  • \p:打印当前查询缓冲区的 SQL。
  • \x:扩展显示模式,当一行字段太多导致显示混乱时,转为 key-value 垂直展示。

\x 前后效果对比

默认水平显示太宽时出现折行:

sql 复制代码
 id |          username          |        email        |       created_at
----+---------------------------+---------------------+------------------------
  1 | alice                     | alice@example.com   | 2025-01-01 12:00:00

开启 \x 后:

css 复制代码
-[ RECORD 1 ]-------------------------
id         | 1
username   | alice
email      | alice@example.com
created_at | 2025-01-01 12:00:00

3.4 导入导出:\copy 命令

\copy 是一种客户端侧的文件操作,不需要数据库服务端的文件系统权限,极其方便。

导入 CSV 到表

sql 复制代码
\copy users (username, email) FROM '/tmp/new_users.csv' WITH (FORMAT csv, HEADER true);

导出表到 CSV

sql 复制代码
\copy users TO '/tmp/users_export.csv' WITH (FORMAT csv, HEADER true);

注意:\copy 是 psql 的元命令,不能用在函数或存储过程中,它调用的是 COPY ... FROM STDIN/TO STDOUT。对于服务端文件导入,使用 SQL 的 COPY

3.5 元命令速查表(20+)

元命令 功能
\? 显示所有 psql 命令帮助
\h [cmd] 显示 SQL 命令的语法帮助
\q 退出 psql
\l 列出数据库
\c 切换连接
\conninfo 当前连接信息
\dt 列出表
\di 列出索引
\dv 列出视图
\df 列出函数
\d+ NAME 对象详细描述
\dn 列出 schema
\du 列出角色/用户
\dp 列出表、视图访问权限
\x 扩展显示切换
\timing 计时切换
\e 外部编辑器编辑查询
\g 再次执行上次查询
\p 打印当前查询缓冲区
\copy 客户端 COPY
\watch [SEC] 每隔 SEC 秒重复执行查询
\! cmd 执行 shell 命令

4. pgbench 性能基准测试与结果分析

pgbench 是 PG 自带的轻量级 TPC-B 类基准测试工具,可以快速评估硬件和配置变更后的性能变化。

4.1 初始化测试数据

bash 复制代码
pgbench -i -s 10 -h localhost -p 5432 -U admin -d testdb

参数解析:

  • -i:初始化模式,创建 pgbench_accounts 等表。
  • -s 10:缩放因子,pgbench_accounts 的行数为 100000 * scale,即 1,000,000 行。表总大小约 128 MB(scale=10)。
  • 其他连接参数同上。

输出示例解读

sql 复制代码
dropping old tables...
NOTICE:  table "pgbench_accounts" does not exist, skipping
creating tables...
generating data (client-side)...
1000000 of 1000000 tuples (100%) done (elapsed 3.42 s, remaining 0.00 s)
vacuuming...
creating primary keys...
done in 5.11 s (drop tables 0.00 s, create tables 0.02 s, client-side generate 4.51 s, vacuum 0.30 s, primary keys 0.28 s).

解读 :数据生成是在客户端完成并发送 SQL INSERT 的,如果是大数据量建议使用 --client-side 模式(默认)。输出分阶段显示耗时:生成数据占主要时间,随后是 VACUUM 和索引创建。

4.2 标准压测

bash 复制代码
pgbench -c 10 -j 2 -t 1000 -h localhost -p 5432 -U admin -d testdb
  • -c 10:10 个并发客户端连接(会话)。
  • -j 2:2 个工作线程,负责管理客户端连接。
  • -t 1000:每个客户端执行 1000 个事务,总计 10,000 事务。

输出示例

ini 复制代码
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 10
query mode: simple
number of clients: 10
number of threads: 2
number of transactions per client: 1000
number of transactions actually processed: 10000/10000
latency average = 2.564 ms
latency stddev = 1.223 ms
initial connection time = 3.455 ms
tps = 3892.145678 (including connections establishing)
tps = 3895.012345 (excluding connections establishing)

逐行解读

  • latency average:平均延迟 2.564 毫秒,表示每个事务从开始到提交的平均耗时。
  • latency stddev:延迟标准差 1.223 毫秒,越小表示系统越稳定。
  • tps = 3892.14(不含初始连接):每秒处理事务数。10 个并发达到近 4000 TPS,说明系统吞吐量良好。
  • initial connection time:10 个连接建立总耗时,反映连接建立成本。

4.3 自定义 SQL 脚本压测

编写 custom_bench.sql

sql 复制代码
-- 模拟一个包含 JOIN 和聚合的查询事务
BEGIN;
SELECT u.username, count(a.aid)
FROM users u
LEFT JOIN accounts a ON u.id = a.user_id
WHERE u.id = 1
GROUP BY u.username;
INSERT INTO logs(action, user_id, ts) VALUES ('benchmark', 1, now());
COMMIT;

注意 :脚本中的 SQL 必须是完整事务块,pgbench 默认在脚本前后自动加 BEGIN/COMMIT,也可用 -N 跳过。

执行命令:

bash 复制代码
pgbench -f custom_bench.sql -c 5 -j 1 -T 60 -P 5 -h localhost -p 5432 -U admin testdb
  • -T 60:运行 60 秒,代替 -t
  • -P 5:每 5 秒输出一次进度报告,便于观察 TPS 趋势。

输出片段

yaml 复制代码
progress: 5.0 s, 1234.5 tps, lat 4.050 ms stddev 1.876
progress: 10.0 s, 1245.2 tps, lat 4.014 ms stddev 1.803
...

通过观察 TPS 和延迟随时间的变化,能看出系统是否在预热后稳定或出现周期性抖动。

4.4 不同并发数下的 TPS 变化与性能拐点

我们可以编写一个 shell 脚本来批量测试并发数 1, 5, 10, 20, 50, 100 等:

bash 复制代码
for c in 1 5 10 20 50 100; do
  echo "Concurrency: $c"
  pgbench -c $c -j 2 -t 1000 -h localhost -p 5432 -U admin testdb | grep "tps"
done

将收集的 TPS 绘制曲线(概念图):

  • 低并发时 TPS 随并发数线性增长。
  • 当超过 CPU 核心数或连接数导致争抢时,TPS 增长放缓甚至下降,延迟快速上升。
  • 性能拐点出现在 CPU 饱和或连接争用严重时,这就是合理的并发上限。

分析要点 :结合 toppg_stat_activity 查看等待事件,可进一步定位瓶颈。


5. pg_dump / pg_restore 逻辑备份与恢复

逻辑备份是通过生成 SQL 语句或自定义格式文件,重建数据库对象和数据。它是细粒度恢复的主要手段。

5.1 pg_dump 四种导出格式

格式 参数 说明 适用场景
plain -Fp (默认) 纯 SQL 文本,可直接 psql 导入 小型库、文本级修改
custom -Fc 自定义压缩格式,支持并行恢复、选择性恢复 中大型库,推荐日常备份
directory -Fd 目录格式,每个表一个文件,支持并行导出/恢复 超大型库并行加速
tar -Ft 打包成 tar 归档,不推荐新品使用 历史兼容

示例 - 导出为 custom 格式

bash 复制代码
pg_dump -h localhost -p 5432 -U admin -d testdb -Fc -f testdb_backup.dump

解读-Fc 默认启用压缩,并可被 pg_restore 灵活操作。

5.2 选择性备份

  • 仅备份指定表:-t users -t events
  • 仅备份某个 schema:-n public
  • 排除表:--exclude-table=logs
bash 复制代码
pg_dump -h localhost -p 5432 -U admin -d testdb -t users -Fc -f users_backup.dump

5.3 并行备份与恢复

对于 directory 格式,可以用 -j 指定并行 worker 数量加速导出/导入。

bash 复制代码
pg_dump -h localhost -p 5432 -U admin -d testdb -Fd -j 4 -f dumpdir/

恢复时同样支持并行:

bash 复制代码
pg_restore -h localhost -p 5432 -U admin -d testdb_restored -j 4 dumpdir/

5.4 pg_restore 定点恢复与查看清单

pg_restore -l 列出备份内容清单(TOC),可编辑选择恢复哪部分。

bash 复制代码
pg_restore -l testdb_backup.dump > toc.txt
# 查看 toc.txt,包含对象ID、类型、名称等
# 选择性恢复:只恢复 users 表
pg_restore -h localhost -p 5432 -U admin -d testdb_restored -L <(grep "users" toc.txt) testdb_backup.dump

5.5 故障模拟

模拟误删表并恢复

  1. 连接数据库,误删 users 表:
sql 复制代码
DROP TABLE users;
  1. 使用之前只备份了 users 的 custom 格式备份恢复:
bash 复制代码
pg_restore -h localhost -p 5432 -U admin -d testdb -t users users_backup.dump
  1. 验证:
sql 复制代码
testdb=# \dt users
           List of relations
 Schema | Name  | Type  | Owner
--------+-------+-------+-------
 public | users | table | admin

模拟误删数据,恢复到指定时间点: 如需精确到时刻,需基于 PITR(Point-in-Time Recovery)配合 WAL 归档,但其基础是先有物理备份 + WAL。这会在后续高可用篇详述。但我们可以演示一个逻辑层面"恢复到某个时间点前数据"的方法:从备份恢复到一个新的临时库,然后通过 SQL 复制误删的数据。


6. PG 工具生态全景图

PostgreSQL 拥有庞大且成熟的工具生态。按功能维度可划分为五类,下面用 Mermaid 全景图展示它们之间的关联。

flowchart LR subgraph 开发工具 psql[psql 命令行] pgAdmin[pgAdmin Web UI] DBeaver[DBeaver/其他 IDE] end subgraph 性能工具 pgbench[pgbench 压测] pgss[pg_stat_statements] pgBadger[pgBadger 日志分析] auto_explain[auto_explain 自动执行计划] end subgraph 备份工具 pg_dump[pg_dump 逻辑备份] pg_restore[pg_restore 逻辑恢复] pg_basebackup[pg_basebackup 物理备份] barman[Barman 备份管理] end subgraph 高可用工具 Patroni[Patroni 自动故障转移] repmgr[repmgr 复制管理] pgpool[Pgpool-II 连接池与读写分离] end subgraph 连接池 PgBouncer[PgBouncer 轻量连接池] Odyssey[Odyssey 新一代连接池] end psql --> pg_dump psql --> pgbench pg_dump --> pg_restore pgbench --> pgss Patroni --> pg_basebackup PgBouncer --> psql

图 4 说明

  • 总览说明 :五类工具涵盖了 PostgreSQL 日常开发、性能诊断、数据保护、高可用和连接管理的完整生命周期。各工具之间既有分工又相互配合,如 psql 是使用其他 CLI 工具的入口,pg_dump 生成的文件可被 pg_restore 利用。
  • 开发工具psql 是无处不在的管理交互界面;pgAdmin 提供图形化管理;各种 IDE 提供 SQL 编辑支持。
  • 性能工具pgbench 用于压测;pg_stat_statements 是瓶颈分析的基石;pgBadger 将日志可视化;auto_explain 自动记录慢查询执行计划。
  • 备份工具pg_dump/pg_restore 处理逻辑级备份;pg_basebackup 制作物理备份;Barman 提供企业级备份管理和 PITR。
  • 高可用工具Patroni 是目前最流行的自动故障转移方案,依赖 pg_basebackup 创建备库;repmgr 提供复制集群管理;Pgpool-II 提供连接池和读写分离。
  • 连接池PgBouncer 极为轻量,是大多数高并发 PG 部署的标配;Odyssey 是较新的多线程连接池。

7. 全链路流转演示

本模块将前面 1-5 模块的知识串联起来,通过一个完整的生命周期演示加深理解。

7.1 全链路流转序列图

sequenceDiagram participant User as 用户 participant psql as psql 客户端 participant PG as PostgreSQL 实例 participant pgbench as pgbench 工具 participant Backup as pg_dump/pg_restore User->>psql: 连接 PG psql->>PG: 建立连接 User->>psql: 创建数据库 test_demo 和表 orders User->>psql: INSERT 1000 条测试数据 User->>psql: \timing on, 执行查询 psql-->>User: 显示查询结果和耗时 User->>pgbench: 执行自定义压测脚本 (60秒) pgbench->>PG: 模拟并发负载 pgbench-->>User: 输出 TPS、延迟报告 User->>Backup: pg_dump -Fc 备份 test_demo Backup->>PG: 导出数据和结构 Backup-->>User: 生成 test_demo.dump User->>psql: DROP DATABASE test_demo (模拟故障) PG-->>psql: 数据库删除成功 User->>psql: CREATE DATABASE test_demo (空库) User->>Backup: pg_restore 恢复 Backup->>PG: 执行恢复 Backup-->>User: 恢复完成 User->>psql: 验证数据完整性 psql-->>User: 数据表及行数均恢复

图 5 说明

  • 总览说明:该序列图呈现了从建库建表、压测、备份到故障模拟和恢复的完整闭环。每个步骤对应一个具体的 CLI 工具或 psql 元命令,展示了工具间的协作关系。
  • 关键阶段:压测阶段验证了配置和硬件对业务的支撑能力;备份阶段创建了时间点数据快照;故障模拟后恢复验证了备份的有效性。这条链路是生产运维中必须定期演练的标准流程。
  • 数据一致性 :通过最后一步的数据完整性验证,确保恢复后确与备份时一致。可结合 pg_stat_user_tables 查看行数或 checksum 扩展校验。
  • 工具协同:psql 负责交互和对象操作,pgbench 负责性能数据,pg_dump/pg_restore 负责保护数据,贯穿始终的是 PG 实例。

7.2 实际操作命令序列

下面提供可直接在终端执行的完整命令序列(假定 PG 已按第 1 节部署)。

bash 复制代码
# 1. 连接并创建新库
psql -h localhost -p 5432 -U admin -c "CREATE DATABASE test_demo;"
# 2. 创建表并插入数据
psql -h localhost -U admin -d test_demo <<EOF
CREATE TABLE orders (
    id serial PRIMARY KEY,
    product_name text,
    quantity int,
    price numeric,
    created_at timestamptz default now()
);
INSERT INTO orders (product_name, quantity, price)
SELECT 'product_' || g, (random()*100)::int, (random()*1000)::numeric(10,2)
FROM generate_series(1, 1000) g;
EOF

# 3. 开启计时并执行一条聚合查询
psql -h localhost -U admin -d test_demo <<EOF
\timing on
SELECT count(*), avg(quantity), sum(price) FROM orders WHERE quantity > 50;
EOF

# 4. 使用 pgbench 自定义脚本压测
# 创建脚本文件 bench_orders.sql
echo "
\set prod random(1, 1000)
BEGIN;
SELECT * FROM orders WHERE id = :prod;
UPDATE orders SET quantity = quantity + 1 WHERE id = :prod;
INSERT INTO orders (product_name, quantity, price) VALUES (concat('new_', :prod), 1, 9.99);
COMMIT;
" > bench_orders.sql

pgbench -f bench_orders.sql -c 10 -j 2 -T 30 -P 5 -h localhost -U admin -d test_demo

# 5. 备份
pg_dump -h localhost -U admin -d test_demo -Fc -f test_demo_backup.dump

# 6. 模拟故障
psql -h localhost -U admin -c "DROP DATABASE test_demo;"

# 7. 恢复
psql -h localhost -U admin -c "CREATE DATABASE test_demo;"
pg_restore -h localhost -U admin -d test_demo test_demo_backup.dump

# 8. 验证
psql -h localhost -U admin -d test_demo -c "SELECT count(*) FROM orders;"
# 应输出 1000 (加上压测可能的新增)

在演示过程中,读者可以随时通过 \x 查看宽表数据,通过 \d+ orders 查看表结构及索引。通过观察 \timing 输出,直观感受不同操作的耗时。


8. 面试高频专题

本部分与正文严格分离,聚焦于实际面试中高频出现的 PostgreSQL 命令行与配置相关问题,每题采用"一句话回答 → 详细解释 → 多角度追问 → 加分回答"的结构。

8.1 如何通过 psql 查看当前数据库中的所有表及其大小?

一句话回答 :使用元命令 \dt+ 或在查询中连接 pg_relation_size() 等系统函数,列出表名及其磁盘占用大小。

详细解释 : 在 psql 中,\dt+ 直接显示所有表,包括表的大小(Size 列),单位自动换算。若要更精确或过滤,可执行:

sql 复制代码
SELECT
    relname AS table_name,
    pg_size_pretty(pg_total_relation_size(relid)) AS total_size
FROM pg_stat_user_tables
ORDER BY pg_total_relation_size(relid) DESC;

pg_total_relation_size 包含表本身、索引、TOAST 表的总大小。\dt+ 内部即基于此。通过查看大小,可识别膨胀表,为 VACUUM FULL 或分区提供依据。

多角度追问

  1. 如何仅查看索引大小?答:\di+pg_relation_size('index_name')
  2. 表大小统计是否实时?答:通过系统函数实时获取,无缓存延迟。
  3. 为何某表查询慢而大小不大?需看 pg_stat_user_tablesseq_scan 等统计,可能是查询计划问题。

加分回答 :PG 14 后引入了 pg_table_size() 更精确的函数族;理解 TOAST 机制对大小统计的影响;利用 pgstattuple 扩展可分析死元组比例。

8.2 pgbenchtpslatency average 分别代表什么?如何解读压测结果?

一句话回答tps (transactions per second) 代表每秒完成的事务数,latency average 是每个事务平均耗时,俩指标结合可评估系统吞吐量和响应能力。

详细解释tps 反映了系统在特定并发下的处理能力上限,而平均延迟反映了单个事务所耗时间。正常情况下,低并发时 tps 与并发数成正比,平均延迟几乎不变或小幅上升;当出现资源争用(CPU、IO、锁),tps 增长放缓甚至下降,平均延迟急剧升高,此处即为性能拐点。分析结果时需关注延迟标准差 (latency stddev),标准差大说明抖动严重,可能因 checkpoint、auto-vacuum 或锁导致。

多角度追问

  1. tps including connections establishingexcluding 有什么区别?答:包含连接建立时间能反映短连接场景下的性能损耗。
  2. 如何减少标准差?答:检查 checkpoint 配置、IO 调度、禁用 OS 透明大页等。
  3. 自定义 SQL 和默认 TPC-B 有何不同?答:默认含更新和插入,更接近 OLTP;自定义可模拟任意负载。

加分回答 :生产压测通常结合 pg_stat_statements 观察哪个 SQL 耗时最多;使用 -M prepared 可模拟绑定变量使用,看计划缓存效果。

8.3 pg_dump 的四种导出格式有什么区别?各适用于什么场景?

一句话回答plain 是纯 SQL 文本,custom 是压缩的可定制格式,directory 是并行分文件格式,tar 是历史遗留打包格式。

详细解释

  • plain:可读文本,可通过 psql 直接导入,但无法做选择性恢复或并行处理。适合小型库或需要人为修改 SQL 时。
  • custom-Fc):默认压缩,可通过 pg_restore 灵活恢复单表、索引等,支持并行恢复(需 -j)。适合日常逻辑备份,空间小且操作灵活。
  • directory-Fd):将每个表存为一个文件,支持并行导出和导入,对于超大数据库(几百 GB)可显著缩短备份/恢复时间。
  • tar:已不推荐,但兼容旧版。

多角度追问

  1. 如何指定压缩级别?答:-Z 参数,0-9,custom 和 directory 支持。
  2. 能否只备份函数定义?答:-s 仅模式,加 --function-only(实际上是通过 -s 和筛选)。
  3. 大表的分割备份怎么做?答:16 版本未原生支持按切片 dump,可结合 COPY 和脚本实现。

加分回答 :生产环境常结合 pg_dump 与 WAL 连续归档,实现 PITR;了解 pg_restore--section 选项可分阶段恢复(pre-data, data, post-data)。

8.4 如何通过 \copy 命令高效导入 CSV 数据?

一句话回答 :在 psql 中使用 \copy table FROM '/path/file.csv' WITH CSV HEADER,将 CSV 各行直接转换为 COPY 流,比 INSERT 快一个数量级。

详细解释\copy 是客户端 COPY,读取本地文件并通过 libpq 发送,避免了服务器端文件权限问题。对于大量数据,应确保表无索引或外键约束,导入后重建以加速;可以增大 maintenance_work_mem 加速索引构建。如果 CSV 数据类型复杂,可能需要指定 NULL 占位符、DELIMITERQUOTE 等选项。对于 GB 级文件,分批导入并并行处理多个文件可进一步提升。

多角度追问

  1. \copy 和 SQL COPY 的区别?答:前者是 psql 元命令操作客户端文件,后者在服务器端运行,需要超级用户权限。
  2. 如何处理错误行?答:\copy 没有内建跳过错误行(除非使用 pg_bulkload 等第三方工具),通常建议先清洗数据。
  3. 导入过程中对并发读写的影响?答:会产生大量脏页和 WAL,增加 checkpoint 频率,影响其他查询性能。

加分回答 :结合 pg_stat_progress_copy(PG 14+)视图可实时监控 COPY 进度。

8.5 max_connections 配置过大有什么风险?

一句话回答 :过大的 max_connections 会消耗大量内存、增加上下文切换,可能导致 OOM 和性能急剧下降,应通过连接池控制实际连接数。

详细解释 : 每个 PostgreSQL 后端进程会分配约 5-10 MB 的私有内存(取决于 work_mem 和实际使用),1000 个连接可能占用 5-10 GB 以上内存,即使空闲连接也占用可观资源。此外,大量并发连接竞争锁和 CPU,snapshot 管理成本也会上升。最佳实践是将 max_connections 设置为稍高于连接池最大实际连接数,例如 PgBouncer 事务模式通常只需几十到几百个 PG 连接即可支撑数千客户端。

多角度追问

  1. 如何查看当前连接数?答:SELECT count(*) FROM pg_stat_activity; 或通过 \x 看。
  2. 连接数达到上限时客户端会怎样?答:报错 FATAL: sorry, too many clients already
  3. 如何预留超级用户连接?答:superuser_reserved_connections 参数。

加分回答 :PG 14 引入了 idle_session_timeout 可自动断开长时间空闲的连接,配合连接池有效管理资源。

8.6 work_mem 配置过大或过小分别会有什么影响?

一句话回答:过小导致排序、哈希必须使用磁盘,查询变慢;过大则并发高时总内存消耗乘以操作数可能耗尽内存,引发 OOM 或大量 swap。

详细解释 : 一个查询可能多次使用 work_mem,如多个排序或哈希连接,每个操作都可能分配该值大小的内存。假设 work_mem=256MB,一个查询有 4 个排序操作,就可能使用 1GB;如果此时有数十个并发此类查询,总内存需求急剧膨胀。OLAP 系统可适当设大(如 64MB-256MB),OLTP 宜保守(4-16MB)。可通过 EXPLAIN ANALYZE 观察是否有 Sort Method: external merge Disk 指示需要调大。

多角度追问

  1. 如何为单个会话调整?答:SET work_mem = '128MB'; 只对当前事务或会话生效。
  2. hash_mem_multiplier 的影响?答:PG 15 后引入,控制哈希操作可使用超出 work_mem 多少,用于减少磁盘哈希。
  3. 如何判断磁盘排序的占比?答:pg_stat_statementstemp_blks_read 等字段。

加分回答:了解 PG 内存模型:全局 shared_buffers + 进程本地内存(work_mem, maintenance_work_mem 等)+ OS 缓存。

8.7 如何通过 pg_stat_user_tables 查看表的访问统计?

一句话回答 :查询 pg_stat_user_tables 视图可获得每张表的扫描次数、增删改行数、HOT 更新等统计,帮助识别热点表和索引效率。

详细解释

sql 复制代码
SELECT relname, seq_scan, seq_tup_read, idx_scan, n_tup_ins, n_tup_upd, n_tup_del, n_tup_hot_upd
FROM pg_stat_user_tables;
  • seq_scan / idx_scan:顺序扫描和索引扫描次数,如果频繁顺序扫描大表,可能需创建索引。
  • n_tup_upd vs n_tup_hot_upd:HOT 更新比例高说明 HOT 机制发挥了作用,减少索引维护。
  • 这些统计从上次重置后累积,可通过 pg_stat_reset() 清零。

多角度追问

  1. 如何查出从未被使用的索引?答:pg_stat_user_indexes.idx_scan = 0
  2. 统计信息多久更新?答:实时更新,不需要手动刷新。
  3. 如何重置特定表统计?答:SELECT pg_stat_reset_single_table_counters(relid)

加分回答 :PG 14 后新增 pg_stat_progress_* 系列视图,提供运行中的 VACUUM, COPY, CLUSTER 进度。

8.8 如何排查一个长时间运行的查询?pg_stat_activity 如何使用?

一句话回答 :通过 pg_stat_activity 视图查看当前所有会话的 SQL、状态、等待事件,定位长事务或阻塞源,必要时用 pg_cancel_backendpg_terminate_backend 终止。

详细解释

sql 复制代码
SELECT pid, usename, datname, state, query_start, wait_event_type, wait_event, query
FROM pg_stat_activity
WHERE state != 'idle' AND query NOT LIKE '%pg_stat_activity%'
ORDER BY query_start;

重点关注 stateactive 且运行时间长的行;wait_event 会显示当前等待的资源(如 LWLock, Lock, IO)。如果发现是未提交的长事务导致 vacuum 无法清理,可尝试终止。

多角度追问

  1. pg_cancel_backendpg_terminate_backend 的区别?答:前者发送取消信号,允许清理;后者强杀。
  2. 如何查看锁等待?答:pg_locks 配合 pg_blocking_pids()
  3. 如何防止应用产生长事务?答:设置 idle_in_transaction_session_timeout

加分回答 :PG 10+ 引入 backend_type 列,可区分 client backend, WAL sender, autovacuum worker 等。

8.9 wal_level 设置为 replicalogical 有什么区别?

一句话回答replica 足够用于流复制,写入信息量少;logical 则额外记录能用于逻辑解码和逻辑复制所需的信息,WAL 量更大但功能更强。

详细解释

  • replica 级别:WAL 中记录了足够的信息以支持外部工具构建只读副本(流复制、WAL 归档 PITR 等)。这是默认级别(PG 10+)。
  • logical 级别:在 replica 的基础上,WAL 中加上每行的完整前后镜像,以支持逻辑解码、逻辑复制槽和变更数据捕获 (CDC)。因此 WAL 写入量会增加,建议监控 WAL 生成速率。 切换级别需重启数据库。

多角度追问

  1. replica 改为 logical 需要重启,期间会影响什么?答:重启会导致连接中断,WAL 重建,可能短暂增加 IO。
  2. 何时必须用 logical?答:需要逻辑复制、Debezium 等 CDC 工具或自研逻辑解码插件时。
  3. 能否在线降级?答:不能,仍需重启。

加分回答 :逻辑复制可以跨大版本复制,实现零停机升级;理解输出插件(pgoutput, decoderbufs等)。

8.10 (实操题)给出一个完整的 PG 性能压测方案,要求能够测试数据库在不同并发数(10/50/100)下的 TPS 和延迟表现,并输出对比报告

一句话回答 :使用 pgbench 或自定义脚本循环不同 -c 值,收集结果并生成表格或图表进行对比分析。

详细解释: 方案步骤:

  1. 准备测试环境:确保数据库已初始化 pgbench -i -s 50 生成足够数据。
  2. 编写测试脚本 run_bench.sh
bash 复制代码
#!/bin/bash
echo "concurrency,tps_incl,tps_excl,avg_lat,stddev_lat" > results.csv
for c in 10 50 100; do
    out=$(pgbench -c $c -j 2 -T 60 -h localhost -U admin testdb)
    tps_incl=$(echo "$out" | grep "including" | awk '{print $3}')
    tps_excl=$(echo "$out" | grep "excluding" | awk '{print $3}')
    avg_lat=$(echo "$out" | grep "average" | awk '{print $4}')
    stddev=$(echo "$out" | grep "stddev" | awk '{print $4}')
    echo "$c,$tps_incl,$tps_excl,$avg_lat,$stddev" >> results.csv
done
cat results.csv
  1. 分析结果:随着并发增加,观察 TPS 是否趋于平稳或下降,平均延迟上升趋势,标准差扩大。可生成简单折线图。
  2. 优化建议:如果某并发下 TPS 不再增长,可检查 CPU 使用率、磁盘 IO 及 pg_stat_statements 中热门 SQL,针对调整索引或 SQL。

多角度追问

  1. 如何模拟真实业务负载?答:用 -f 引入多语句事务脚本,调节读写比例。
  2. 如何保证每次测试的一致性和可重复?答:重启 PG 或至少执行一次 checkpoint 后开始,丢弃第一次预热运行。
  3. 如何解读压测时出现的 server closed the connection unexpectedly?答:可能 OOM 或连接数不足,检查日志。

加分回答 :使用 pg_stat_statements 结合 auto_explain 分析慢 SQL;运用 pgbench-M 模式比较简单查询、扩展查询、预处理语句的差异,优化协议开销。


附:PostgreSQL 核心 CLI 命令速查表

命令/元命令 用途 关键参数 常见用法示例
psql 交互式终端 -h, -p, -U, -d psql -h localhost -U admin testdb
\l 列出数据库 + \l
\c 切换数据库 \c testdb
\dt 列出表 + \dt+
\di 列出索引 \di
\d+ NAME 对象详情 \d+ users
\timing 执行计时 \timing on
\x 扩展显示 \x auto
\copy 客户端 COPY FROM/TO, CSV \copy t FROM 'f.csv' CSV HEADER
pg_dump 逻辑备份 -Fc, -j, -t pg_dump -Fc -t users -f users.dump
pg_restore 逻辑恢复 -l, -L, -j pg_restore -d db -t users users.dump
pgbench 性能基准 -i, -c, -j, -T, -f pgbench -c 10 -T 60 -f script.sql
pg_isready 检查 DB 状态 pg_isready -h localhost
pg_ctl 服务控制 start/stop/restart/reload pg_ctl -D /data reload
pg_basebackup 物理备份 -D, -P, -R pg_basebackup -D /backup -P -R

延伸阅读

  • PostgreSQL 16 官方文档:Client Applications (psql, pg_dump, pgbench)
  • 《PostgreSQL: The Definitive Guide》------ 第 4 章 环境搭建与命令行工具
  • Docker 官方文档:PostgreSQL 镜像使用指南
相关推荐
曲幽3 小时前
让FastAPI Agent真正记住你:聊聊会话记忆与持久化存储的落地实践
redis·python·postgresql·fastapi·web·chat·async·session·ai agent
心流时间5 小时前
读书笔记-PostgreSQL实战
数据库·postgresql
AllData公司负责人18 小时前
通过Postgresql同步到Doris,全视角演示AllData数据中台核心功能效果,涵盖:数据入湖仓,数据同步,数据处理,数据服务,BI可视化驾驶舱
java·大数据·数据库·数据仓库·人工智能·python·postgresql
小猿姐21 小时前
GitLab on Kubernetes:使用 KubeBlocks 部署生产级高可用 PostgreSQL 和 Redis
redis·postgresql·kubernetes
Fan_-_1 天前
MySQL / PostgreSQL DDL 审核自动化:从人工 review 到 CI 拦截
mysql·postgresql·自动化
l1t1 天前
DeepSeek总结的无需编译器:编写纯 SQL 的 Postgres 扩展
数据库·sql·postgresql
金玉满堂@bj1 天前
PostgreSQL:企业级全能开源数据库
数据库·postgresql·开源