DeepSeek总结的使用 Docker 对 PostgreSQL 进行 Beta 测试

来源:https://andyatkinson.com/postgresql-beta-testing-docker

使用 Docker 对 PostgreSQL 进行 Beta 测试

作者: Andy Atkinson

日期: 未注明

分类: PostgreSQL 数据库

Postgres 社区非常重视对 Beta 版本进行测试的反馈,而借助 Docker,可以更轻松地启动和运行预发布版本。

随着最近 PostgreSQL 19 Beta 1 的发布,让我们启动它并测试一些新功能。

使用 Docker 获取 Postgres 预发布版本

首先,你需要为你的操作系统安装 Docker!为你的操作系统和处理器架构(例如 ARM 或 AMD/Intel/x86)获取所需的版本。

在 MacOS 上,运行 uname -msw_vers 来了解你的硬件细节。

对于 Windows,请查看《在 Windows 上安装 Docker Desktop》。

构建和运行

用于 Docker Postgres 的官方 Postgres 镜像仅限于正式发布版本。

幸运的是,@yosifkit 创建了一个 PR,添加了 19 Beta 1(由 @tianon 合并),并提供了如何使用 docker buildx 构建预发布版本的说明。

以下命令会下载并构建 postgres:19beta1-trixie

bash 复制代码
docker buildx build -t postgres:19beta1-trixie \
    'https://github.com/infosiftr/postgres.git#19-rc:19/trixie'

构建完成后,我可以使用 postgres:19beta1-trixie 调用 docker run。我将其命名为 pg19

我还根据我运行其他 Docker Postgres 容器的方式传递了以下环境变量(这些选项可能不是必需的)。

最终命令:

bash 复制代码
docker run \
--name pg19 \
--env POSTGRES_USER=postgres \
--env POSTGRES_PASSWORD=postgres \
--detach postgres:19beta1-trixie

要检查它是否正在运行,我运行 docker ps -a。要查看日志,我会运行:docker logs -f postgres:19beta1-trixie

通过 psql 连接

容器正在运行,日志显示了我们想要的信息:"database system is ready to accept connections"。

让我们使用容器上的 psql 连接到 postgres 数据库:

bash 复制代码
docker container exec -it pg19 psql -U postgres

我们应该会看到类似显示版本 19 的输出:

复制代码
psql (19beta1 (Debian 19~beta1-1.pgdg13+1))
Type "help" for help.

在 19 中测试新功能

太好了。让我们尝试一下 19 中的一些新功能。

19 添加了一个用于查看锁的新系统视图。让我们试试:

sql 复制代码
postgres=# select * from pg_stat_lock;

我们得到了很多新数据,比如等待计数、等待时间等等。

那新的 pg_plan_advice 扩展呢?首先,让我们加载它,然后创建一个表 t 进行实验:

sql 复制代码
postgres=# LOAD 'pg_plan_advice';
postgres=# create table t (id int);

完成后,我们可以使用新的 PLAN_ADVICE 参数通过 EXPLAIN 显示输出:

sql 复制代码
postgres=# EXPLAIN (PLAN_ADVICE) SELECT * FROM t;
                     QUERY PLAN
-----------------------------------------------------
 Seq Scan on t  (cost=0.00..35.50 rows=2550 width=4)
 Generated Plan Advice:
   SEQ_SCAN(t)
   NO_GATHER(t)
(4 rows)

我想知道为什么默认的行数估计是 2550?让我们运行 analyze t;

这样做之后,估计行数变为 1,看起来更合理了:

sql 复制代码
postgres=# EXPLAIN (PLAN_ADVICE) SELECT * FROM t;
                   QUERY PLAN
-------------------------------------------------
 Seq Scan on t  (cost=0.00..0.00 rows=1 width=4)
 Generated Plan Advice:
   SEQ_SCAN(t)
   NO_GATHER(t)
(4 rows)

pg_stat_statements 的新增功能

扩展 pg_stat_statements 在 19 中获得了新功能。

让我们试试:

sql 复制代码
postgres=# select * from pg_stat_statements;
ERROR:  relation "pg_stat_statements" does not exist

哦,我们需要先将其添加到 shared_preload_libraries。我们可以看到目前情况并非如此:

sql 复制代码
postgres=# show shared_preload_libraries;
 shared_preload_libraries
--------------------------

(1 row)

使用 docker run 实现这一点的一种方法是使用 -c 参数,如下所示:

bash 复制代码
docker run \
--name pg19 \
--env POSTGRES_USER=postgres \
--env POSTGRES_PASSWORD=postgres \
--detach postgres:19beta1-trixie \
-c shared_preload_libraries=pg_stat_statements

现在我们在 shared_preload_libraries 中看到了我们想要的内容:

sql 复制代码
postgres=# show shared_preload_libraries;
 shared_preload_libraries
--------------------------
 pg_stat_statements
(1 row)

不过,鉴于 \dx 没有列出它,我们还没有启用该扩展。让我们这样做:

sql 复制代码
psql> create extension if not exists pg_stat_statements;

现在 \dx 显示它,我们已经准备好查询它了。

新增功能之一是跟踪预备语句的使用。让我们创建一个基础表和一个预备语句。

如果需要,再次创建表:

sql 复制代码
create table if not exists t (id int);

创建一个简单的预备语句 get_t 并执行它。这里的目标是让 pg_stat_statements 增加 generic_plan_calls 字段。

sql 复制代码
PREPARE get_t AS
SELECT *
FROM t;

现在让我们执行它:

sql 复制代码
EXECUTE get_t;

它起作用了吗?

sql 复制代码
postgres=# select left(query,100),generic_plan_calls from pg_stat_statements limit 1;
       left       | generic_plan_calls
------------------+--------------------
 PREPARE get_t AS+|                  1
 SELECT *        +|
 FROM t           |

它起作用了!我们看到 generic_plan_calls 已经递增。

这对于监控预备语句的使用情况看起来非常有用。

总结

请尝试一下,并实验 Postgres 19 中的新功能!

添加 19.x 版本(当前为 beta 1)

https://github.com/docker-library/postgres/pull/1415

相关推荐
PGCCC7 小时前
Ubuntu 安装 PostgreSQL 16 完整教程(2026):从仓库配置到远程连接
linux·ubuntu·postgresql
张忠琳8 小时前
【NPU】Ascend Device Plugin —Part 6 K8s客户端 + 重复检测模块 超深度源码分析之二
云原生·容器·kubernetes·npu·docker device
雨声不在8 小时前
私有 Docker Registry 排障实录:两个隐蔽的坑
docker·容器
云川之下8 小时前
【k8s】SR‑IOV‑Network‑Operator 详解
云原生·容器·kubernetes
Ai拆代码的曹操10 小时前
DaemonSet OnDelete 策略详解:为何 rollout restart 无效及正确迁移方案
docker·容器·kubernetes
名字还没想好☜11 小时前
Kubernetes NetworkPolicy 实战:默认全通的坑与用标签做零信任隔离
运维·云原生·容器·kubernetes·networkpolicy
瑞码空间11 小时前
Web应用的多端部署之道:浏览器 · Electron · Docker
前端·docker·electron·浏览器·web
badhope11 小时前
Docker镜像从2GB压到80MB——我被运维追着打了三天才学会的容器瘦身术
docker
x²+(y-√³x²)²=112 小时前
参数 `-v /usr/local/Ascend/add-ons:/usr/local/Ascend/add-ons:ro` 的作用
linux·docker
wangjing_052213 小时前
通过CentOS 7虚拟机的Docker服务部署Node-RED及气象数据显示界面搭建完整教程
linux·docker·centos