不积跬步,无以至千里;不积小流,无以成江海。

Dean's blog

  • Join Us on Facebook!
  • Follow Us on Twitter!
  • LinkedIn
  • Subcribe to Our RSS Feed

InfluxDB SQL基本操作

命令行工具

使用CMD定位到安装目录,运行influxd即可启动InfluxDB数据库:

influxd

InfluxDB默认使用的是8086端口,如果influxd启动后就结束,检查是否有类似下面的输出,如果是很可能是端口被占用了:

run: open server: open service: listen tcp :8086: bind: An attempt was made to access a socket in a way forbidden by its access permissions.

influxDB启动成功后,可以使用influx命令行工具进行功能测试,例如:

influx
Connected to http://localhost:8086 version 1.7.9
InfluxDB shell version: 1.7.9
>

这样就已经连接成功,并告诉我们数据库的监听端口是8086。

数据库命令

查看所有数据库

show databases
name: databases
name
----
_internal

_internal数据库是用来存储InfluxDB内部的实时监控数据的

添加数据库

create database mydb

切换当前数据库

use mydb
Using database mydb

删除数据库

drop database mydb

查看所有的measurement

> show measurements
name: measurements
name
----
cpu

数据格式

现在我们已经有了一个数据库,那么InfluxDB就可以开始接收读写了。

首先对数据存储的格式来个入门介绍。InfluxDB里存储的数据被称为时间序列数据,其包含一个数值,就像CPU的load值或是温度值类似的。时序数据有零个或多个数据点,每一个都是一个指标值。数据点包括time(一个时间戳),measurement(例如cpu_load),至少一个k-v格式的field(也即指标的数值例如 “value=0.64”或者“temperature=21.2”),零个或多个tag,其一般是对于这个指标值的元数据(例如“host=server01”, “region=EMEA”, “dc=Frankfurt)。

在概念上,你可以将measurement类比于SQL里面的table,其主键索引总是时间戳。tag和field是在table里的其他列,tag是被索引起来的,field没有。不同之处在于,在InfluxDB里,你可以有几百万的measurements,你不用事先定义数据的scheme,并且null值不会被存储。

读写数据

InfluxDB没有普通RDBMS的建表语句,它直接通过写入数据的形式自动创建measurement。

写入数据

将数据点写入InfluxDB,只需要遵守如下的行协议:

<measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]

其中tag key、tag value、field key会以字符串形式保存,field value可以为字符串、整数、浮点数、布尔值保存。最后的unix-nano-timestamp是一个时间戳,如果不指定InfluxDB默认会取当前时间。

例如:

> insert cpu,host=deanpc temperature=56.5,rate=12.2 1577754163702229301
> select * from cpu
name: cpu
time                host   rate temperature
----                ----   ---- -----------
1577754163702229301 deanpc 12.2 56.5

读取数据

> select * from cpu
name: cpu
time                host   rate temperature
----                ----   ---- -----------
1577754163702229301 deanpc 12.2 56.5

更新数据

InfluxDB没有提供传统RDBMS的Update语句,如果需要修改数据,可以使用INSERT语句来实现,修改数据的时候,指定时间戳,InfluxDB会覆盖原来的数据:

> insert cpu,host=deanpc temperature=34.5 1577754163702229301
> select * from cpu
name: cpu
time                host   rate temperature
----                ----   ---- -----------
1577754163702229301 deanpc 12.2 34.5

会发现,原来增加进去的数据就被更新了。但如果,执行下面的语句:

> insert cpu temperature=34.5 1577754163702229301
> select * from cpu
name: cpu
time                host   rate temperature
----                ----   ---- -----------
1577754163702229301             34.5
1577754163702229301 deanpc 12.2 34.5

会发现,并没有更新原来的数据,而是变成了新增。

在InfluxDB中,measurement中每条记录为一个point,可以类比成传统RMDBS的行。point它是由具有相同timestamp的相同series的field组成的集合。而series是共同retention policy,measurement和tag set的集合。在上面的insert或select的时候,没有指定retention policy时,默认是autogen。

所以如果想更新数据,更新的insert语句需要和新增数据时的retention policy、measurement、tag set、timestamp一致。可以理解InfluxDB中每个Point的主键都是复合主键。也就是,只能更新field set的内容,而不能更新tag set的内容。

删除数据

> select * from cpu
name: cpu
time                host   rate temperature
----                ----   ---- -----------
1577754163702229301             34.5
1577754163702229301 deanpc 12.2 34.5
> delete from cpu where time = 1577754163702229301
> select * from cpu
>

上面的例子,数据删除后,select返回的结果集是空的,此时measurement已不存在了:

> show measurements
>

即返回的结果集合也为空。

不允许评论
粤ICP备17049187号-1