新手上路,时序数据库InfluxDB命令总是报错,这篇文章不容错过!

初次使用时序数据库InfluxDB,有些概念还是需要了解清楚的,InfluxDB与传统的关系型数据库MySql在使用上有哪些区别呢?

MySql InfluxDB 说明
database database 数据库
table measurement 类似于Mysql中表的概念
field tag + field + timestamp 传统表中的一行数据,在influxdb中,可以划分为三个

数据库 database
数据库,在概念上和关系型数据库MySQL没有什么区别,操作命令也是一样的;只不过,这里的操作命令是influx query language,简称InfluxQL语言;

show databases;  //展示所有的数据库;
create database <dbName>;  //创建数据库;
drop database <dbName>; //删除数据库;
use <dbName>; //使用某个数据库

度量 measurement
在influxdb中,没有表这个说法,只有度量measurement,它的作用相当于表;在使用时也与传统意思上的表大有区别;在MySQL中,需要先创建表,然后才可对表中的数据进行增删改查,一个表中的字段个数也是固定的;在influxdb中,则无需先创建度量measurement,在新增数据时,如果不存在则创建。

show measurements; //显示所有的度量measurement
insert sensorMonitorData,deviceId=001 temperature=15  //新增一个度量,只有一个tag和一个field;
insert sensorMonitorData1,deviceId=001,companyId=001 temperature=15,voltage=12   //新增两个度量,包含两个tags和两个fields;
show tag keys from <tbname> //展示度量中所有的tag;
show field keys from <tbname> //展示度量中所有的field;
select * from <tbname> //展示度量中的数据;
precision rfc3339  //对度量中的时间戳进行格式化处理;
delete from <measurement>  //删除度量中所有的数据
drop measurement  <measurement>    //删除度量

新增语法结构分析:

insert into <retention policy> measurement,tagKey=tagValue fieldKey=fieldValue timestamp;

特别说明:
retention policy,保留策略,非必填;
timestamp,时间戳,非必填;不填写时,自动生成;如果要加,在filed后添加空格,再添加时间戳;
tag与tag之间用逗号分隔,由于tag都是string类型,因此不需要加引号;
tag与field之间用空格分隔,field与field之间用逗号分隔;
field有四种类型:int、 float、string、 boolean,每种类型在使用时不一样,所以如果是string类型,需要加引号,否则会报错;

field类型 方式 示例
float 数字 user_id=21
int 数字i age=18i
boolean true/false is_boy=true
String "" or '' email="123456@qq.com"

这里是需要注意的地方,也是新手容易犯错的地方,在使用field时,特别是String类型的field,一定要把field的value用双引号包裹起来,不然新增的时候会报错;不能像使用tag一样使用field。

查询特别说明:
创建的度量名称里,如果有点号时,输入双引号包裹起来,否则会报错。

删除特别说明:
在执行delete from <measurement>语句时,measurement中的数据没有了,measurement也就不存在了,压根就不需要再执行一遍drop measurement <measurement>语句,因此它俩是等价的,但是不知道这个和influxdb的版本有没有关系,这里使用的版本是1.8。

**保留策略 retention policy **
在influxdb里,是没有修改操作的,对数据可以设置保留时长,保存几个备份,以及在数据集群中的处理,这就是保留策略retention policy;

show retention policies on <dbName>  //展示数据库所采用的保留策略;

查询策略说明:
name: 名称;
duration: 保留时间, 0表示永久保存;
shardGroupDuration: shardGroup的存储时间,shardGroup是InfluxDB的一个基本储存结构,大于这个时间的数据,在查询效率上应该有所降低;
replicaN: 全称是replication,副本个数;
default: 是否是默认策略;

create retention policy <retentionName> on <dbName> duration <durationTime> replication <replicaN> default; //新建策略

新增策略说明:
retentionName:策略名称,用双引号包裹起来;
dbName:数据库名称;
durationTime: 保留时间, 0表示永久保存,2h代表两个小时,2d代表2天;
replicaN:全称是REPLICATION,副本个数
default: 是否是默认策略;
保留策略单位一览表:

Units Meaning
ns nanoseconds (1 billionth of a second)
u or µ microseconds (1 millionth of a second)
ms milliseconds (1 thousandth of a second)
s second
m minute
h hour
d day
w week
alter retention policy <retentionName> on <dbName> duration <durationTime> default;//修改策略
alter retention policy "autogen" on test duration 0s default; //恢复默认策略

retentionName:策略名称,用双引号包裹起来;
dbName:数据库名称;
durationTime: 保留时间, 0表示永久保存,2h代表两个小时,2d代表2天;
default: 是否是默认策略;

drop retention policy <retentionName> on  <dbName>; //删除策略

retentionName:策略名称,用双引号包裹起来;
dbName:数据库名称;
特别注意:在删除默认策略前,一定要重新指定一个默认策略,否则新增度量时会报错。

接下来新建一条带有保留策略的数据,先建立一个保留策略,再建立保留策略的数据,看看是不是到了时间就被删除了。



在创建带保留测试数据遇到的问题:

  1. 本来是想建立一条几秒钟就过期的数据,但是报错了,ERR: retention policy duration must be at least 1h0m0s,这条报错提示,过期时间至少一个小时,额,好吧,重新建立一个为时一个小时的保留策略。
  2. 在创建带有策略的数据时,使用insert语句直接报错了,把insert改成insert into正常运行,这说明,在使用默认策略时,语句中不带策略时,使用insert语句,加了策略就必须使用insert into语句;这是需要注意的地方。

还有没有其他命令可以使用,在命令行CMD里,输入help,可以查看更多的命令:



把展示的内容改变为json形式,1个小时前的数据已经被删除了,现在所看到的是一个空的json格式;在新加一条数据,看看查询的结果;

format json; 
select * from person;

InfluxQL语言有以下这些关键字,在创建measurement、tag、field的时候,要避开保留的关键字,否则会报错:

all alter any as asc
begin by create continuous database
databases default delete desc destinations
diagnostics distinct drop duration end
every explain field for from
grant grants group groups in
inf insert into key keys
kill limit show measurement measurements
name offset on order password
policy policies privileges queries query
read replication resample retention revoke
select series set shard shards
slimit soffset stats subscription subscriptions
tag to user users values
where with write

复杂的查询语句

select <field_key>[,<field_key>,<tag_key>] from <tbname> [ into_clause ] [ where_clause ]  
[ group_by_clause ] [ order_by_clause ] [ limit_clause ]  
[ offset_clause ] [ slimit_clause ] [ soffset_clause ] 

查询遇到的问题:

  1. 在执行select height,weight from person where id="0001"语句时,没有返回结果,在执行select height,weight from person where name="ff",直接报错:ERR: error parsing query: found NAME, expected identifier, string, number, bool at line 1, char 40;检查了以下语句,还是和关键词有关系,这个measurement的取名为name的tag,使用了关键字呀!
  2. 在新增语句里,tag的value一定不要加双引号,这个一定得注意,否则条件查询查不出来!!!
  3. 在查询语句的where条件里,tag的value值一定要加单引号,tag的key要加双引号,否则查不出来,也不报错,这个一定得注意!!!
    在where条件里,既可以匹配tag,也可以匹配field,但是它们可以使用的操作符却是不一样的,tag的数据类型是String类型,field则支持四种数据类型;

tag支持的操作符:

操作符 含义
= 等于
<> 不等于
!= 不等于

field支持的操作符:

操作符 含义
= 等于
<> 不等于
!= 不等于
> 大于
>= 大于等于
< 小于
<= 小于等于

更多精彩,还在官方文档:
https://docs.influxdata.com/influxdb/v1.8/query_language/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。