Documentation

常见问题

账户管理
安全
管理
数据类型
写入数据
查询数据
删除数据
InfluxDB 任务
序列及序列基数

账户管理

我该如何重置我的密码?

在InfluxDB Cloud登录页面上使用忘记密码链接来更新您的密码。有关更多信息,请参见更改您的密码

我如何在InfluxDB Cloud账户之间切换?

在你的 InfluxDB Cloud 账户设置中使用 切换账户 功能来在 InfluxDB Cloud 账户之间切换。有关更多信息,请参见 切换 InfluxDB Cloud 账户


计费和使用情况

我如何管理支付方式?

  • 如果您通过 InfluxData 订阅了 InfluxDB Cloud,您可以在您的 InfluxDB Cloud 帐户的 计费部分 管理付款方式。
  • 如果您通过云服务提供商市场订阅了 InfluxDB Cloud (AWS Marketplace, Azure MarketplaceGCP Marketplace), 请使用您云服务提供商的账单管理来管理付款方式。

有关更多信息,请参见 管理 InfluxDB Cloud 计费

我该联系谁处理账单问题?

有关账单问题,请 联系 InfluxData 支持.

如何查看我的数据使用情况?

要查看您的InfluxDB Cloud组织的数据使用情况,请在InfluxDB Cloud用户界面中查看使用页面。有关更多信息,请参见查看InfluxDB Cloud数据使用情况

如何提高我组织的速率限制和配额?


InfluxDB 云服务健康状况

我在哪里可以查看 InfluxDB Cloud 的当前状态?

InfluxDB Cloud 区域和基础服务始终处于监控状态。 要查看 InfluxDB Cloud 的当前状态,请查看InfluxDB Cloud status page。 要接收故障警报和更新,请订阅我们的状态页面。


安全

有什么不同类型的API令牌?

InfluxDB Cloud 支持以下令牌类型:

  • 所有访问令牌
  • 自定义令牌

有关每种令牌类型的更多信息,请参见 管理 API 令牌

我可以在禁用身份验证的情况下使用InfluxDB吗?

InfluxDB Cloud 强制执行安全最佳实践,要求 API 请求必须进行身份验证。身份验证无法被禁用。

你能改变你组织中成员的权限等级吗?

InfluxDB Cloud 只有一个用户权限级别:所有者。 拥有所有者权限的用户可以从您的组织中删除资源和其他用户。 邀请用户时请小心。


管理

我如何识别我在InfluxDB中使用的Flux版本?

有关与官方 InfluxDB 发行版捆绑的 Flux 版本的信息,请参阅 Flux versions in InfluxDB

如果使用自定义构建,请使用以下查询返回正在使用的Flux当前版本:

import "array"
import "runtime"

array.from(rows: [{version: runtime.version()}])

有关更多信息,请参阅 查询Flux版本

为什么在我更新存储桶的保留期限后数据没有被删除?

以下是数据在更新存储桶的保留期限后可能不会立即被删除的原因:

  • 保留执行服务每小时运行一次。您可能需要等待下一个保留执行周期的运行。

有关更多信息,请参阅 数据保留

-->

数据类型

InfluxDB 能够存储的最小和最大整数是多少?

InfluxDB将所有整数存储为有符号的64位整数。

最小整数: -9223372036854775808
最大整数: 9223372036854775807

接近但在这些限制内的值可能会导致意外行为。某些查询操作将64位整数转换为64位浮点值,这可能会导致溢出问题。

InfluxDB 能够存储的最小和最大时间戳是什么?

InfluxDB使用64位整数表示Unix纳秒时间戳。

最小时间戳: -92233720368547758061677-09-21T00:12:43.145224194Z
最大时间戳: 92233720368547758062262-04-11T23:47:16.854775806Z

超出该范围的时间戳会返回解析错误。

我可以更改字段的数据类型吗?

Flux 类型转换函数 让你在查询时改变字段的数据类型。然而,你不能改变磁盘上字段的类型。以下是一些可能的解决方法:

  • 将一个字段复制到一个新的字段,并作为不同的类型。 下面的例子执行以下操作:

    • Queries the example-string-field.
    • Converts field values to booleans.
    • Changes the field name to example-boolean-field.
    • Writes the new field to the source bucket.
    from(bucket: "example-bucket")
        |> range(start: -30d)
        |> filter(fn: (r) => r._measurement == "exampled-measurement")
        |> filter(fn: (r) => r._field == "example-string-field")
        |> toBool()
        |> set(key: "_field", value: "example-boolean-field")
        |> to(bucket: "example-bucket")
    
  • 将字段复制到一个新的桶中,并作为不同的类型。 下面的示例执行以下操作:

    • Queries the example-int-field from the example-bucket-1 bucket.
    • Converts field values to float values.
    • Changes the field name to example-float-field.
    • Writes the new field to the example-bucket-2 bucket.
    from(bucket: "example-bucket-1")
        |> range(start: -30d)
        |> filter(fn: (r) => r._measurement == "exampled-measurement")
        |> filter(fn: (r) => r._field == "example-int-field")
        |> toFloat()
        |> set(key: "_field", value: "example-float-field")
        |> to(bucket: "example-bucket-2")
    

InfluxDB 如何处理跨分片的字段类型不一致问题?

字段值可以是浮点数、整数、字符串或布尔值。 字段值类型在一个分片内不能不同,但在不同分片之间可以不同

如果所有值具有相同类型,SELECT 语句 将返回所有字段值。 如果字段值类型在分片之间不同,InfluxDB 首先执行任何适用的 cast 操作,然后返回以下列表中首次出现的类型的所有值:浮点数、整数、字符串、布尔值。

如果您的数据字段值类型存在差异,使用语法 <field_key>::<type> 查询不同的数据类型。

示例

测量 just_my_type 具有一个名为 my_field 的字段。 my_field 在四个不同的分片中有四个字段值,并且每个值都有不同的数据类型(浮动、整数、字符串和布尔值)。

SELECT * 仅返回浮点数和整数字段值。注意,InfluxDB 在响应中将整数值转换为浮点数。

SELECT * FROM just_my_type

name: just_my_type
------------------
time		                	my_field
2016-06-03T15:45:00Z	  9.87034
2016-06-03T16:45:00Z	  7

SELECT <field_key>::<type> [...] 返回所有值类型。 InfluxDB 将每个值类型输出到其自己的列中,并递增列名。 如果可能,InfluxDB 会将字段值转换为另一种类型; 它将整数 7 在第一列转换为浮点数,并且它 将浮点数 9.879034 在第二列转换为整数。 InfluxDB 不能将浮点数或整数转换为字符串或布尔值。

SELECT "my_field"::float,"my_field"::integer,"my_field"::string,"my_field"::boolean FROM just_my_type

name: just_my_type
------------------
time			               my_field	 my_field_1	 my_field_2		 my_field_3
2016-06-03T15:45:00Z	 9.87034	  9
2016-06-03T16:45:00Z	 7	        7
2016-06-03T17:45:00Z			                     a string
2016-06-03T18:45:00Z					                                true

SHOW FIELD KEYS 返回与字段键相关的每种数据类型,跨越每个分片。

示例

测量 just_my_type 只有一个字段,叫做 my_fieldmy_field 在四个不同的分片中有四个字段值,每个值都有 不同的数据类型(浮点数、整数、字符串和布尔值)。 SHOW FIELD KEYS 返回所有四种数据类型:

> SHOW FIELD KEYS

name: just_my_type
fieldKey   fieldType
--------   ---------
my_field   float
my_field   string
my_field   integer
my_field   boolean

写入数据

我如何编写整数和无符号整数字段值?

在行协议中,用尾随的 i 来标识 整数,用尾随的 u 来标识 无符号整数。没有这些,数值字段值将被解析为浮点数。

# Integer
value=100i

# Unsigned integer
value=100u

# Float
value=100

InfluxDB 如何处理重复数据点?

InfluxDB 通过其 测量标签集时间戳 唯一标识一个点。如果您提交一个与现有点相同的测量、标签集和时间戳的新点,InfluxDB 会将旧字段与新字段集联合,任何冲突都归入新字段集。

有关更多信息,请参见 处理重复数据点

InfluxDB 写入 API 需要什么换行符?

InfluxDB 行协议依赖于换行符 (\n, 这是 ASCII 0x0A) 来指示一行的结束和新一行的开始。 使用换行符以外的字符的文件或数据将导致类似于 bad timestampunable to parse 的错误。

Windows 换行符

Windows使用回车和换行(\r\n)作为换行符,如果你在Windows机器上手动编写行协议,则会导致错误。在将行协议提交给InfluxDB写入API之前,请去掉任何回车(\r)。

我什么时候应该使用单引号,什么时候应该使用双引号来写数据?

行协议引用使用指南详见 行协议文档

时间戳的精度重要吗?

是的。时间戳精度会影响数据摄取性能。 时间戳越精确,写入数据点所需的时间就越长。 为了最大化性能,写入数据到 InfluxDB 时,请使用尽可能粗糙的时间戳精度。然而,如果过于粗糙,你可能会冒险以相同的时间戳写入来自同一系列的数据点,这将被视为 重复点


查询数据

通量

我如何将字段构造成列(像 InfluxQL 一样)?

A SELECT 语句在 InfluxQL 中返回每个查询的标签和字段的列的数据。 Flux from() 函数返回包含每个标签的列以及一个 _field 列的数据,该列包含字段键。每个字段被分组到不同的表中。

要将每个字段结构化为列,可以使用pivot()schema.fieldsAsCols()

exampleData
    |> pivot(rowKey: ["_time"], columnKey: ["_field"], valueColumn: "_value")
import "influxdata/influxdb/schema"

exampleData
    |> schema.fieldsAsCols()
from()返回的示例数据
测量传感器ID位置字段时间
机器abc123站点20温度2022-01-01T00:00:00Z150.1
机器abc123站20温度2022-01-01T00:00:10Z152.8
机器abc123站20温度2022-01-01T00:00:20Z153.3
测量传感器ID位置字段时间
机器abc123站202022-01-01T00:00:00Z12.2
机器abc123站202022-01-01T00:00:10Z14.9
机器abc123站202022-01-01T00:00:20Z16.1
示例透视数据
_测量传感器ID位置_时间温度流量
机器abc123站点202022-01-01T00:00:00Z150.112.2
机器abc123站台202022-01-01T00:00:10Z152.814.9
机器abc123站点202022-01-01T00:00:20Z153.316.1

如何从多个字段值推导出一个状态?

要比较多个字段的值并推导出一个状态:

  1. 查询导出一个状态所需的所有字段。

  2. 使用 pivot()schema.fieldsAsCols() 将字段转换为列。

  3. 使用 map() 遍历每一行输入,并根据字段列中的值分配新的列值。

    map() 的 fn 参数定义了一个为每个输入行输出记录的函数。使用条件逻辑来分配状态。

from(bucket: "example-bucket")
    |> range(start: -1h)
    |> filter(fn: (r) => r._measurement == "example-measurement")
    |> filter(fn: (r) => r._field == "field1" or r._field == "field2")
    |> pivot(rowKey: ["_time"], columnKey: ["_field"], valueColumn: "_value")
    |> map(
        fn: (r) =>
            ({r with state:
                    if r.field1 > 90 and r.field2 < 10 then
                        "critical"
                    else if r.field1 > 70 and r.field2 < 30 then
                        "warning"
                    else if r.field1 > 40 and r.field2 < 60 then
                        "info"
                    else
                        "ok",
            }),
    )

InfluxQL

我如何在 InfluxDB Cloud 中使用 InfluxQL?

使用 InfluxQL 和 InfluxDB Cloud 是通过1.x 兼容 API实现的,该 API 复制了来自 InfluxDB 1.x 的/query端点。这使得所有与 InfluxDB 1.x 兼容的客户端都可以与 InfluxDB Cloud 一起使用。然而,InfluxQL 依赖于一个数据库和保留策略的数据模型,而在 InfluxDB Cloud 中不存在,但已被所替代。

InfluxDB Cloud 允许您将 InfluxQL 中使用的唯一数据库和保留策略组合映射到特定存储桶,使用 DBRP 映射。

有关如何在InfluxDB Cloud中使用InfluxQL以及配置DBRP映射的详细说明,请参阅 Query with InfluxQL

我如何在InfluxQL函数中执行数学运算?

InfluxQL不支持在函数内进行数学运算。 使用子查询来执行 数学计算。

例如,InfluxQL 不支持以下语法:

SELECT MEAN("dogs" - "cats") from "pet_daycare"

相反,使用子查询来获得相同的结果:

SELECT MEAN("difference") FROM (SELECT "dogs" - "cat" AS "difference" FROM "pet_daycare")

为什么我的查询返回 epoch 0 作为时间戳?

在 InfluxQL 中,epoch 0 (1970-01-01T00:00:00Z) 通常用作空时间戳的等价物。 如果您请求一个没有时间戳返回的查询,例如一个具有无限时间范围的聚合 函数,InfluxDB 将返回 epoch 0 作为时间戳。

哪些 InfluxQL 函数支持嵌套?

以下 InfluxQL 函数支持嵌套:

有关如何使用子查询作为嵌套函数的替代品的信息,请参见 InfluxQL 数据探索

是什么决定了GROUP BY time() 查询返回的时间间隔?

GROUP BY time() 查询返回的时间间隔符合 InfluxDB 数据库的预设时间窗口或用户指定的 offset interval

预设时间窗口

例如,以下查询计算了在6:15pm和7:45pm之间的sunflowers的平均值,并将这些平均值分组为一小时的区间:

SELECT mean("sunflowers")
FROM "flower_orders"
WHERE time >= '2016-08-29T18:15:00Z' AND time <= '2016-08-29T19:45:00Z' GROUP BY time(1h)

InfluxQL 使用 GROUP BY time() 子句中指定的持续时间根据时间对数据进行分区。预设的时间窗口边界落在指定的持续时间单位上。

例如:

按时间()分组持续时间结果窗口边界
1秒00:00:00 - 00:00:01, 00:00:01 - 00:00:02, 等等。
1分钟00:00:00 - 00:01:00, 00:01:00 - 00:02:00, 等等。
5分钟00:00:00 - 00:05:00, 00:05:00 - 00:10:00, 等等。
1小时00:00:00 - 01:00:00, 01:00:00 - 02:00:00, 等等。

虽然窗口边界可能超出查询的时间范围,但仅在查询的时间范围内的点被用于每个窗口的计算。

偏移时间窗口

作为另一个示例,以下查询计算了在下午6:15到下午7:45之间的sunflowers的平均值,并将这些平均值分组为一个小时的间隔。它将InfluxDB数据库的预设时间窗口偏移了15分钟。

SELECT mean("sunflowers")
FROM "flower_orders"
WHERE time >= '2016-08-29T18:15:00Z' AND time <= '2016-08-29T19:45:00Z' GROUP BY time(1h,15m)
                                                                                         ---
                                                                                          |
                                                                                   offset interval

InfluxQL使用GROUP BY time()子句中指定的持续时间和偏移量根据时间对数据进行分区。时间边界从指定的偏移量开始。

例如:

根据时间()的持续时间和偏移进行分组结果窗口边界
1分钟,30秒00:30:00 - 01:30:00, 01:30:00 - 02:30:00, 等等。
5分钟,15秒00:00:15 - 00:05:15, 00:05:15 - 00:10:15, 等等.
1小时,20分钟00:20:00 - 01:20:00, 01:20:00 - 02:20:00, 等等.

为什么我的查询没有返回数据或部分数据?

您的查询未返回数据或部分数据的最常见原因:

查询错误的保留策略

InfluxDB 自动查询数据库的默认保留政策中的数据 (作为 DBRP 映射 的一部分进行配置)。 如果您的数据与其他保留政策相关联,则必须指定正确的 保留政策以获取结果。

SELECT 子句中没有字段键

一个 InfluxQL 查询需要在 SELECT 子句中至少有一个 字段键。 如果 SELECT 子句仅包含 标签键,则查询返回空响应。 详情请参见 InfluxQL 数据探查

SELECT 查询包含 GROUP BY time()

如果你的 SELECT 查询包含 GROUP BY time() 子句,只有 1677-09-21 00:12:43.145224194now() 之间的数据点会被返回。如果你的数据点在 now() 之后出现,请在你的时间区间中指定 一个替代的上限

标签和字段键具有相同名称

避免为标签和字段键使用相同的名称。 如果不小心为标签和字段键添加相同的名称,然后一起查询,查询结果显示第二个被查询的键(标签或字段)后面附加 _1。 要查询附加了 _1 的标签或字段键,您 必须去掉 附加的 _1 并包含 语法 ::tag::field。 例如:

-- Query duplicate keys using the correct syntax
SELECT "leaves"::tag, "leaves"::field FROM db.rp."grape"

name: grape
time                leaves     leaves_1
----                --------   ----------
1574128162128468000 species    6.00
1574128238044155000            5.00

为什么我的 GROUP BY time() 查询不返回发生在 now() 之后的时间戳?

SELECT 语句在 WHERE 子句中未定义时间范围时,默认时间范围为 1677-09-21 00:12:43.1452241942262-04-11T23:47:16.854775806Z UTC。对于未指定时间范围但具有 GROUP BY time() 子句SELECT 语句,默认时间范围为 1677-09-21 00:12:43.145224194 UTC 到 now()

要查询在 now() 之后发生的时间戳数据,SELECT 语句必须在 WHERE 子句中提供一个替代的 上界,并带有 GROUP BY time() 子句。 例如:

SELECT MEAN("boards") FROM "hillvalley"
WHERE time >= '2022-01-01T00:00:00Z' AND time <= now() + 10d
GROUP BY time(12m) fill(none)

请注意,WHERE 子句必须提供一个替代的 上限 以覆盖默认的 now() 上限。以下查询仅重置下限为 now(),使查询的时间范围在 now()now() 之间:

SELECT MEAN("boards") FROM "hillvalley"
WHERE time >= now()
GROUP BY time(12m) fill(none)

有关查询中时间语法的更多信息,请参阅 InfluxQL 数据探索

我可以对时间戳执行数学运算吗?

InfluxQL不支持对时间戳值的数学运算符。大多数时间计算必须由接收查询结果的客户端进行。

对时间戳值使用InfluxQL函数的支持有限。 ELAPSED() 函数返回单个字段中后续时间戳之间的差异。

我可以从返回的时间戳中识别写入精度吗?

InfluxDB 将所有时间戳存储为纳秒值,无论提供的写入精度是什么。 InfluxQL 默默地从时间戳中去掉尾随零,这掩盖了初始的写入精度。由于 InfluxDB 在返回的时间戳上默默地去掉了尾随零,写入精度在返回的时间戳中无法识别。

我何时应该在查询中使用单引号而不是双引号?

遵循以下一般规则,用于 InfluxQL 查询中的引号:

单引号
  • 用于引用字面字符串值,例如标签值。
  • 不要在诸如数据库名称、保留策略名称、用户名、测量名称、标签键和字段键等标识符上使用。
  • 用于日期时间字符串。
双引号
  • 用于以数字开头、包含非 [A-z,0-9,_] 字符的标识符,或是 InfluxQL 关键字。我们通常建议对所有标识符使用双引号,即使它们不符合这些标准。
  • 不要在日期时间字符串上使用。
-- Correctly quote usage

SELECT bikes_available FROM bikes WHERE station_id='9'

SELECT "bikes_available" FROM "bikes" WHERE "station_id"='9'

SELECT MIN("avgrq-sz") AS "min_avgrq-sz" FROM telegraf

SELECT * from "cr@zy" where "p^e"='2'

SELECT "water_level" FROM "h2o_feet" WHERE time > '2015-08-18T23:00:01.232000000Z' AND time < '2015-09-19'

-- Incorrect quote usage

SELECT 'bikes_available' FROM 'bikes' WHERE 'station_id'="9"

SELECT * from cr@zy where p^e='2'

SELECT "water_level" FROM "h2o_feet" WHERE time > "2015-08-18T23:00:01.232000000Z" AND time < "2015-09-19"

为什么我的查询使用 WHERE OR 时间条件返回了空结果?

InfluxQL 不支持在 WHERE 子句中使用 OR 来指定多个时间范围,如果指定了多个,则返回空响应。 例如,以下查询将返回空响应:

SELECT * FROM "absolutismus"
WHERE time = '2016-07-31T20:07:00Z' OR time = '2016-07-31T23:07:17Z'

为什么 fill(previous) 返回空结果?

fill(previous) 如果查询的时间范围内没有先前的值,则不会填充空值。

我该如何使用相同的标签键和字段键查询数据?

使用 :: 语法来指定键是字段键还是标签键。例如:

SELECT * FROM "candied" WHERE "almonds"::field > 51
SELECT * FROM "candied" WHERE "almonds"::tag='true'

我如何跨测量查询数据?

InfluxQL 不支持查询多个度量 所有数据必须在单个度量下才能一起查询。 要执行跨度量查询, 使用 Flux

查询中的订单时间戳是否重要?

不,它没有。以下查询之间只有一个微不足道的差异:

SELECT ... FROM ... WHERE time > 'timestamp1' AND time < 'timestamp2'
SELECT ... FROM ... WHERE time < 'timestamp2' AND time > 'timestamp1'

我如何通过具有空值的标签查询数据?

在你的 WHERE 子句中,使用 '' 指定一个空或为null的标签值。例如:

SELECT * FROM "vases" WHERE priceless=''

为什么我会收到错误提示“最近30秒内查询的总持续时间超过25m0s的限制”?

此错误指示您超过了组织的总查询时间全局限制。 潜在原因包括:

  • 一个单一的长时间运行的查询。
  • 同时运行过多查询。
  • 两者的结合。

如果您因为一个单一的长时间运行的查询而遇到此错误,则应分析该查询 以及可能要优化的您的架构。 以下资源可能会有所帮助:

如果您遇到此错误是由于并发查询的数量,请尝试延迟或错开查询,以便它们不会同时运行。


删除数据

我可以删除一个字段吗?

是的。InfluxDB Cloud 支持通过字段删除数据。使用 _field 标签在您的 删除谓词 中识别要删除的字段。

_field == "example-field"

我可以删除一个测量吗?

是的。InfluxDB Cloud 支持通过测量删除数据。使用 _measurement 标签在您的 删除谓词 中来识别要删除的测量。

_measurement == "example-measurement"

我可以同时删除多个测量吗?

不。InfluxDB Cloud不支持在单个删除请求中删除多个测量值。要删除多个测量值,为每个测量值发出删除请求

我需要验证数据是否已删除吗?

一旦删除操作被提交到队列,就不需要验证它们。
/api/v2/delete 接口在删除请求被添加到队列时返回 204 响应。

Because the delete queue executes asynchronously, there isn't a way to accurately predict when the delete operation will be performed at the storage layer.

如果您希望验证删除是否已发生,请尝试查询已删除的数据。 如果查询返回结果,则数据尚未完全删除。


InfluxDB 任务

重试任务如何影响相对时间范围?

当您重试使用相对时间范围的任务时,它将查询任务执行(运行)的原始时间范围。每当任务执行时,InfluxDB会将now选项设置为任务的计划执行时间。当使用range()或其他支持相对持续时间值的函数时,这些持续时间值相对于now(),它返回now选项的值。每次任务运行都有一个基于运行计划执行时间的唯一now选项。


序列及序列基数

系列基数是什么?

系列基数是 唯一的总数 测量标签集字段键 组合 (系列)存储在磁盘上并在内存中索引。

为何系列基数重要?

InfluxDB 维护了每个 series 的内存索引。随着唯一系列数量的增加,它可能会对查询性能产生负面影响。每个 InfluxDB Cloud 组织都有一个系列基数限制,以防止基数失控。有关调整基数限制的信息,请参阅 如何增加我组织的速率限制和配额?

在Flux中使用 influxdb.cardinality() 或者在InfluxQL中使用 SHOW SERIES CARDINALITY 来测量一个桶中的系列基数。有关减少系列基数的信息,请参阅 解决高系列基数



Flux的未来

Flux 正在进入维护模式。您可以像现在一样继续使用它,而无需对您的代码进行任何更改。

阅读更多

InfluxDB 3 开源版本现已公开Alpha测试

InfluxDB 3 Open Source is now available for alpha testing, licensed under MIT or Apache 2 licensing.

我们将发布两个产品作为测试版的一部分。

InfluxDB 3 核心,是我们新的开源产品。 它是一个用于时间序列和事件数据的实时数据引擎。 InfluxDB 3 企业版是建立在核心基础之上的商业版本,增加了历史查询能力、读取副本、高可用性、可扩展性和细粒度安全性。

有关如何开始的更多信息,请查看:

由TSM驱动的InfluxDB Cloud