1、获取镜像版本
这个命令会拉取与PostgreSQL 15相对应的最新的TimescaleDB版本。
docker pull timescale/timescaledb:latest-pg14
2、运行TimescaleDB容器:
这会运行一个名为 timescaledb
的容器。POSTGRES_PASSWORD
环境变量设置密码为 root123456
。端口映射 -p 15432:5432
将容器的 5432 端口映射到宿主机的 15432 端口。--restart always
确保容器在 Docker 守护进程启动时自动启动。
docker run -d \
--name timescaledb \
-p 15432:5432 \
-e POSTGRES_PASSWORD=root123456 \
timescale/timescaledb:latest-pg14
3、连接到TimescaleDB:
一旦容器启动,你可以使用psql
或其他PostgreSQL客户端来连接:
docker exec -it timescaledb /bin/bash
#创建自己的数据库
psql -U postgres -c "CREATE DATABASE byqjh;"
如果被提示输入密码时,使用第2步中设置的密码root123456。
4、启用TimescaleDB扩展:
假设你想在名为byqjh
的数据库上启用TimescaleDB,可以使用以下命令连接到该数据库
此命令将启用TimescaleDB扩展,IF NOT EXISTS
确保在已启用扩展的数据库上运行命令不会产生错误,而CASCADE
确保任何其他必要的扩展也被启用。
psql -U postgres -d byqjh;
CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;
这样,您就可以开始使用TimescaleDB的功能了。
启用TimescaleDB扩展后,PostgreSQL数据库将获得一系列强大的时间序列数据库功能。TimescaleDB是建立在PostgreSQL之上的,旨在提供更好地支持时间序列数据的存储和查询功能。以下是启用TimescaleDB扩展后可以获得的主要功能和优势:
- 分区和压缩:TimescaleDB通过使用所谓的"超表"(hypertables)自动对时间序列数据进行分区。这使得大规模数据的存储和查询变得更高效。另外,数据可以被透明地压缩,以节省存储空间。
- 数据保留策略:TimescaleDB允许用户设置数据保留策略,自动清理旧的时间序列数据,从而保持数据的可管理性。
- 连续聚合:TimescaleDB可以预先计算时间窗口上的聚合值,从而提高聚合查询的性能。
- 原生SQL查询:由于TimescaleDB是基于PostgreSQL构建的,你可以使用熟悉的SQL语法来查询和管理时间序列数据。
- 与PostgreSQL的完全兼容性:除了时间序列功能,你仍然可以使用PostgreSQL的所有其他功能,包括JOINs、次查询、窗口函数、JSON操作等。
- 工具和集成:由于TimescaleDB与PostgreSQL兼容,大多数已经存在的PostgreSQL工具、库和框架可以无缝地与TimescaleDB一起使用。
- 高级功能:TimescaleDB还提供了其他高级功能,如数据重采样、附加列、时间存储优化等。
总的来说,启用TimescaleDB扩展使得PostgreSQL更加适合存储、查询和管理时间序列数据,同时保持了其作为关系数据库的所有优势。这对于物联网应用、金融数据、监控系统、日志分析等需要处理时间序列数据的应用场景非常有用。
5、创建TimescaleDB新用户:
我们创建一个名为admin
的用户并设置密码admin
:
#连接容器
psql -U postgres
CREATE USER admin WITH PASSWORD 'admin';
#授权
GRANT ALL PRIVILEGES ON DATABASE byqjh TO admin;
#如果你还希望 adminuser 有权限访问和修改 byqjh 数据库中的所有现有和未来的表,你还需要执行:
\c byqjh
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO admin;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO admin;
#退出容器
\q
6、示例和创建超表问题
新建一个表device_data
CREATE TABLE device_data (
id SERIAL PRIMARY KEY,
device_id INT NOT NULL,
data_time TIMESTAMPTZ NOT NULL,
monitor_code TEXT NOT NULL,
data_u DOUBLE PRECISION NULL,
create_time TIMESTAMPTZ DEFAULT now(),
sync_time TIMESTAMPTZ NULL,
update_time TIMESTAMPTZ NULL
);
要将device_data
表转换为TimescaleDB超表(hypertable)
SELECT create_hypertable('device_data', 'data_time');
如果报错ERROR: cannot create a unique index without the column “data_time” (used in partitioning)
原因是,当你执行SELECT create_hypertable('device_data', 'data_time');
,TimescaleDB会尝试将device_data
表转换为超表。在此过程中,它会尝试为原始表上的所有唯一约束和主键约束创建等效的唯一索引。但是,对于超表,任何唯一索引都必须包含分区列(这里是data_time
)。
在你给出的表定义中,有一个主键约束在id
列上,这实际上是一个唯一索引。由于此索引没有包含data_time
列,所以你收到了这个错误。
解决方案:
-
移除主键约束:如果不需要
id
作为主键,你可以移除这个约束,然后再次尝试创建超表。 -
使用复合主键:如果你需要确保每个时间戳中的
id
是唯一的,你可以使用复合主键,包含data_time
和id
。例如:ALTER TABLE device_data DROP CONSTRAINT device_data_pkey; ALTER TABLE device_data ADD PRIMARY KEY (data_time, id);
然后再尝试创建超表。
-
使用不同的时序列:如果其他列更适合作为时序列,你可以考虑更改时序列。
建议的方法是使用复合主键,因为这样可以确保在任何给定的时间戳中,id
都是唯一的。但选择哪种方法取决于你的具体需求和使用情况。