从 PostgreSQL 到 TDengine:某新能源电站的时序数据库迁移实践

摘要:本文记录了一个新能源电站从 PostgreSQL 迁移到 TDengine 的全过程,分享能源场景下的数据建模和迁移经验。

一、项目背景
某新能源电站,原有系统使用 PostgreSQL 存储发电数据。随着电站规模扩大,遇到以下问题:
逆变器数量:从 100 台增长到 5000 台
数据量:从 50 万条/天增长到 5 亿条/天
查询延迟:从 1 秒增长到 20 秒
存储成本:每年增长 180%
二、能源场景的数据特性
2.1 数据类型
发电数据:电压、电流、功率、发电量
环境数据:辐照度、温度、风速、风向
设备状态:逆变器状态、故障信息
电网数据:并网电压、频率、功率因数
2.2 查询模式
实时监控:当前发电功率
历史分析:发电量趋势
效率分析:发电效率对比
故障分析:设备故障历史
三、PostgreSQL 的瓶颈
3.1 写入瓶颈
单表写入性能有限
索引维护成本高
分区管理复杂
3.2 查询瓶颈
时间范围查询慢
聚合查询超时
多表关联性能差
四、TDengine 的能源场景适配
4.1 发电数据
-- 创建发电数据超级表
CREATE STABLE power_generation (
ts TIMESTAMP,
dc_voltage FLOAT,
dc_current FLOAT,
ac_voltage FLOAT,
ac_current FLOAT,
power FLOAT,
energy FLOAT
) TAGS (
inverter_id BINARY(32),
string_id BINARY(32),
area BINARY(16)
);
4.2 环境数据
-- 创建环境数据超级表
CREATE STABLE env_data (
ts TIMESTAMP,
irradiance FLOAT,
temperature FLOAT,
wind_speed FLOAT,
wind_direction FLOAT,
humidity FLOAT
) TAGS (
station_id BINARY(32),
area BINARY(16)
);

-- 创建辐照度异常告警订阅
CREATE TOPIC irradiance_alert AS
SELECT ts, station_id, irradiance
FROM env_data
WHERE irradiance < 0 OR irradiance > 1500;
4.3 发电效率分析
-- 查询今日发电量
SELECT _irowts, SUM(energy) as total_energy
FROM power_generation
WHERE ts > TODAY()
INTERVAL(1h);

-- 查询逆变器效率
SELECT inverter_id, AVG(power / irradiance) as efficiency
FROM power_generation
WHERE ts > TODAY() - 7d
GROUP BY inverter_id;
五、迁移方案
5.1 数据模型转换
PostgreSQL 表:
CREATE TABLE power_generation (
id SERIAL PRIMARY KEY,
ts TIMESTAMP,
inverter_id VARCHAR(32),
dc_voltage FLOAT,
dc_current FLOAT,
ac_voltage FLOAT,
ac_current FLOAT,
power FLOAT,
energy FLOAT
);
CREATE INDEX idx_inverter_ts ON power_generation(inverter_id, ts);
TDengine 超级表:
CREATE STABLE power_generation (
ts TIMESTAMP,
dc_voltage FLOAT,
dc_current FLOAT,
ac_voltage FLOAT,
ac_current FLOAT,
power FLOAT,
energy FLOAT
) TAGS (
inverter_id BINARY(32),
string_id BINARY(32)
);
5.2 迁移脚本
import psycopg2
import taos

class PostgreSQLToTDengine:
def init(self):
self.pg_conn = psycopg2.connect(host='localhost', database='energy')
self.td_conn = taos.connect(host='localhost', database='energy')

def migrate(self):
pg_cursor = self.pg_conn.cursor()
pg_cursor.execute("SELECT * FROM power_generation")

td_cursor = self.td_conn.cursor()
for row in pg_cursor.fetchall():
td_cursor.execute(f"""
INSERT INTO power_generation VALUES (
'{row[1]}', {row[3]}, {row[4]}, {row[5]}, {row[6]}, {row[7]}, {row[8]}
)
""")
六、迁移效果
指标 PostgreSQL TDengine 提升
写入性能 3 万条/秒 80 万条/秒 26x
查询延迟 20 秒 100ms 200x
存储空间 400GB/月 40GB/月 降低 90%
运维成本 60 万/年 10 万/年 降低 83%
七、经验总结
1.数据模型设计:利用超级表机制,按逆变器和组串建模
2.双写验证:确保数据一致性后再切换
3.监控告警:实时监控迁移进度和系统状态
4.回滚方案:准备应急回滚方案

关键词:时序数据库、TDengine、PostgreSQL、新能源、数据迁移

posted @ 2026-06-23 14:23  vidya  阅读(1)  评论(0)    收藏  举报