Skip to content

迁移专项

阿里云 InfluxDB® 版退市,迁移到 GreptimeDB

阿里云时序数据库 InfluxDB 版将于 2026 年 10 月 23 日正式退市,届时实例资源释放、控制台入口关闭。GreptimeDB 原生兼容 InfluxDB 写入协议,写入链路通常只需要改 URL、鉴权和数据库名;历史数据可以按 shard 分批搬迁。我们已经承接了一批这样的迁移。

受此次退市影响的用户,可获得免费的迁移评估与实施支持,以及 GreptimeDB 企业版首年折扣

退市时间线

根据阿里云官方公告

时间措施
2025 年 10 月 23 日停止新购云数据库 InfluxDB® 版
2026 年 4 月 23 日不再提供续费和扩容服务
2026 年 10 月 23 日正式退市:功能和服务不可用、控制台入口关闭、实例资源释放、停止所有支持与服务

实例释放意味着数据一并丢失。截止时间要从 10 月 23 日往前倒推:数据导出、写入链路切换、查询改写,以及新旧两套并行跑一段时间的观察期。历史数据量越大,导出和回灌占用的时间越长。

迁移要动的三件事

这三件事可以并行推进。 数据模型是自动映射的,不需要手工建表:measurement 对应表名,tag 对应主键列,field 对应字段列,timestamp 对应时间索引列 `greptime_timestamp`(类型 `TimestampNanosecond`)。

看一次真实迁移

GreptimeDB 支持 InfluxDB line protocol v1 和 v2 写入 API,多数采集端只需要改 URL、鉴权和数据库名。

先起一个 GreptimeDB,把写入端点指过去。原应用用 v1 write API:

shell
curl -XPOST "http://127.0.0.1:4000/v1/influxdb/write?db=public&precision=ns" \
  --data-binary \
  'readings,name=truck_0,fleet=South,driver=driver_0 latitude=37.7749,longitude=-122.4194,velocity=42.0 1451606400000000000'

用 v2 write API:

shell
curl -XPOST "http://127.0.0.1:4000/v1/influxdb/api/v2/write?db=public&precision=ns" \
  --data-binary \
  'readings,name=truck_0,fleet=South,driver=driver_0 latitude=37.7749,longitude=-122.4194,velocity=42.0 1451606400000000000'

两个细节要提前确认:

  • db 对应 GreptimeDB 的数据库名。InfluxDB v2 的 bucket 在这里也通过 db 参数承载,用官方客户端时通常把 bucket 设为 GreptimeDB 数据库名、organization 留空。GreptimeDB 不会自动建库,db 不是预创建的 public 时,需要先 CREATE DATABASE
  • precision 要和原始时间戳精度一致。GreptimeDB 的 line protocol API 默认按纳秒解释时间戳,原请求写的是毫秒、微秒或秒时,要显式传 precision=msprecision=usprecision=s

在线迁移建议双写加灰度:新写入同时进 InfluxDB 和 GreptimeDB,对比 count(*)、时间范围和关键聚合结果,再逐步切读流量,确认无误后停掉 InfluxDB 写入。

托管实例拿不到底层文件,需要经由备份和一台自建 InfluxDB 中继,导出成 line protocol 再写入。

阿里云 InfluxDB 是托管服务,用户接触不到底层 TSM 文件,也没有 influx_inspect 可用,唯一稳定的取数途径是 influxd backup -portable 备份接口。但备份产出的是 InfluxDB 自己的可移植格式(元数据 + TSM 文件),GreptimeDB 不能直接导入,它能直接吃的是 line protocol。

所以中间要加一台自建 InfluxDB 1.x 做中继

text
阿里云 InfluxDB ──(influxd backup)──> 备份文件

        └──(influxd restore)──> 自建 InfluxDB(中继)

                    (influx_inspect export -lponly)


                              Line Protocol 文件

                                (写入 GreptimeDB)

                                    GreptimeDB

数据量大时不要整库一次性搬,按 shard 逐个迁移。每次的数据量和内存磁盘占用都有上限,某个 shard 失败了单独重跑,不影响其他部分;进度也看得见,后续还能按 shard 并行加速。

db-1 库的单个 shard 为例,四步:

bash
# 1. 从阿里云备份单个 shard
influxd backup -portable \
  -host ${InfluxDB_IP}:8088 \
  -db db-1 -rp autogen -shard 1 \
  /data/backup/shard_1

# 2. 恢复到自建 InfluxDB 中继
influxd restore -portable \
  -db db-1 -rp autogen -shard 1 -newdb db-1 \
  /data/backup/shard_1

# 3. 导出为 line protocol
influx_inspect export -database db-1 -lponly \
  -datadir ${InfluxDB_Data_Directory} \
  -waldir ${InfluxDB_WAL_Directory} \
  -out /data/export_data/shard_1

# 4. 写入 GreptimeDB
export GREPTIME_USERNAME="<greptime_username>"
export GREPTIME_PASSWORD="<greptime_password>"
export GREPTIME_HOST="<host>"
export GREPTIME_DB="<db-name>"
for file in /data/export_data/shard*; do
  curl -i --retry 3 \
    -X POST "http://${GREPTIME_HOST}:4000/v1/influxdb/write?db=${GREPTIME_DB}&u=${GREPTIME_USERNAME}&p=${GREPTIME_PASSWORD}" \
    --data-binary @"${file}"
  sleep 1
done

u/p 放在 URL 查询参数里可能被代理或访问日志记录,生产环境建议使用 HTTPS,并避免在共享环境中暴露凭据。

导入后至少校验每个表的行数、时间范围和关键聚合:

sql
SELECT
  count(*) AS row_count,
  min(greptime_timestamp) AS min_ts,
  max(greptime_timestamp) AS max_ts
FROM readings;

SELECT fleet, count(*) AS row_count
FROM readings
GROUP BY fleet
ORDER BY row_count DESC;

InfluxQL 需要改写为标准 SQL,GROUP BY time(...) 这类窗口语义对应 GreptimeDB 的 range query 或 date_bin()

数据进来之后,measurement、tag、field 已经是普通的表和列,改写查询时不用再把它们当特殊概念处理。常见对应关系:

  • InfluxQL 的 time 对应自动建表后的 greptime_timestamp
  • GROUP BY time(10m), "name", "driver" 对应 range query:avg(value) RANGE '10m' ... ALIGN '10m' BY (name, driver)
  • 只是普通离散分桶,用 date_bin('10 minutes'::INTERVAL, greptime_timestamp)GROUP BY
  • ORDER BY time DESC LIMIT 1 这类 selector 查询,改成 row_number() OVER (...),明确表达"每个分组的最新点"。
  • difference()elapsed() 这类状态变化查询,用 lag()lead() 配合 CTE 改写,可读性更好。

举一个窗口聚合的例子。InfluxQL:

sql
SELECT mean("velocity") AS mean_velocity
FROM "readings"
WHERE time > '2026-01-01T00:00:00Z' AND time <= '2026-01-01T00:10:00Z'
GROUP BY time(10m), "name", "driver", "fleet";

GreptimeDB SQL:

sql
SELECT
  greptime_timestamp,
  name,
  driver,
  fleet,
  avg(velocity) RANGE '10m' AS mean_velocity
FROM readings
WHERE greptime_timestamp > '2026-01-01T00:00:00Z'::TIMESTAMP
  AND greptime_timestamp <= '2026-01-01T00:10:00Z'::TIMESTAMP
ALIGN '10m' BY (name, driver, fleet);

RANGE '10m' 表示每个聚合窗口覆盖 10 分钟数据,ALIGN '10m' 表示每 10 分钟输出一个对齐后的窗口结果,BY (name, driver, fleet) 对应 InfluxQL 中的 tag 分组。

批量改写可以交给工具。我们提供了一个 skill,输入 InfluxQL 输出 GreptimeDB SQL,覆盖时间窗口、fill 模式、百分位、正则字面量、Grafana 宏等常见结构,无法精确翻译的部分会被标记出来而不是硬凑:

shell
npx skills add https://github.com/GreptimeTeam/docs/tree/main/skills/influxql-to-greptimedb-sql

改写时先弄清楚原查询要回答什么问题,再决定用哪种写法,别逐字对着语法翻。

实际踩过的坑

来自一次真实迁移(2 年 2 个月、6 个库、573 个 shard):

  • 先摸清 shard 分布,再动手迁移。多个数据库共享同一个全局递增的 shard ID 序列,单个库的 shard ID 并不连续:那次迁移里 db-1 的 111 个 shard 分成连续段(85–126)、散列段(129、177、183…)和步进段(222–576,步进 6)三部分。迁移前用 show shards 导出完整清单再分析,别想当然地连续枚举。
  • 警惕脏数据 shardshow shards 里出现过 start_time 为 1969-12-29 的异常 shard,疑似时间戳写入异常,这类 shard 要单独核对完整性。
  • restore 之后等 WAL 落盘再导出。恢复完立刻 export,数据可能还在 WAL 里没落盘,等十几秒到几十秒更稳妥。
  • -lponly 不能省。不加会把建库建表的 DDL 混进导出文件,写入 GreptimeDB 时报错。
  • 导入要限流加重试--retry 3 配合 sleep 1,规避瞬时失败和写入反压。
  • 单个 shard 处理完就清理中继库。及时 drop database,防止自建 InfluxDB 的数据目录越积越大。

延伸阅读

迁移支持与折扣

告诉我们你的实例规模和迁移时间点,我们会安排工程师对接

受此次退市影响的用户可以拿到:

  • 免费迁移评估:盘点现有实例规模、shard 分布、写入链路和关键查询,给出迁移方案和时间估算。

  • 免费迁移实施支持:我们的工程师参与实施,包括搬迁脚本、批量编排与断点续传、数据校验,以及 InfluxQL 到 SQL 的改写协助,不额外收费。

  • 企业版首年折扣:迁移到 GreptimeDB 企业版可享首年折扣,具体折扣按数据规模和部署形态确定。

Stay in the loop

加入我们的社区