部署 PostgreSQL 和插件 TimescaleDB

1. 使用 Docker 部署

timescale/timescaledb - Docker Image

Timescale 官方提供了一个已经打包好 PostgreSQL 和 TimescaleDB 甚至调优过内核参数的镜像。使用以下命令拉取镜像:

1
docker pull timescale/timescaledb:2.28.0-pg18

请根据需求选择合适的版本,但是注意不要使用带 -oss 后缀版本。其为 Apache 纯开源版,屏蔽了一些自动化特性。

创建容器命令如下:

1
2
3
4
5
6
docker run -d --name timescaledb \
-p 5432:5432 \
-e POSTGRES_PASSWORD=Password \
-e TZ=Asia/Shanghai \
-v timescaledb_data:/var/lib/postgresql/data \
timescale/timescaledb:2.28.0-pg18

修改 Password 为你的密码。

2. 创建数据库

在 PostgreSQL 中,插件的生效范围是数据库级别,而不是服务器级别。这种隔离机制保证了系统的纯净和稳定。

假设 PostgreSQL 服务器里有三个业务数据库:user_dborder_dbmetrics_db。即使在服务器上安装了 TimescaleDB 的插件,这三个数据库依然只是普通的 PG 数据库。当登录到 metrics_db 并加载 TimescaleDB 插件后,只有 metrics_db 会变成支持时序特性的数据库,其他两个数据库丝毫不受影响。

  1. 登录数据库命令行:
1
docker exec -it timescaledb psql -U postgres
  1. 创建新数据库:
1
CREATE DATABASE metrics_db;
  1. 切换数据库:
1
\c metrics_db
  1. 加载 TimescaleDB 插件:
1
CREATE EXTENSION IF NOT EXISTS timescaledb;

3. 配置数据表

创建了业务数据库之后,下一步就是创建一张新表,并将其配置为 TimescaleDB 的超表。

3.1 创建新表:

1
2
3
4
5
CREATE TABLE device_metrics (
created_at TIMESTAMPTZ NOT NULL, -- 带时区的时间戳
-- 其它字段
payload BYTEA NOT NULL
);

TimescaleDB 强依赖时间戳,所以表里必须有一个时间字段。此外,在 TimescaleDB 中,如果表要设置主键或唯一约束,主键中必须包含时间列,否则无法成功转换为超表。

3.2 配置超表

device_metrics 表,按 created_at 字段对数据进行分区。

1
SELECT create_hypertable('device_metrics', by_range('created_at', INTERVAL '1 day'));
  • INTERVAL '1 day':设置生成物理文件块的间隔为 1 天;

3.3 配置数据自动保留策略

TimescaleDB 的后台定时任务会自动扫描,当某一天的数据块完全超过设定时间后,直接 Drop 掉释放空间。

1
SELECT add_retention_policy('device_metrics', INTERVAL '3 days');
  • INTERVAL '3 days':数据保留的时间,超过此时间即删除;

部署 PostgreSQL 和插件 TimescaleDB
https://flowerdown.org/posts/20260621-090440
作者
Unrealfeathers
发布于
2026年6月21日
许可协议