目录
前言
…略
一、简介
…略
1、基本概念
mysql | influxdb | 说明 |
---|---|---|
database/bucket | database | 数据库 |
table | measurement | 类似mysql中表的概念 |
record | tag + field + timestamp | 传统表中的一行数据,映射到influxdb中,可以划分为三个 |
- measurement influxdb没有单独的创建measurement的方法,直接新增一条数据时,若measurement不存在,则直接创建并插入一条数据
- point 在influxDB中,表示每个表中,某个时刻,满足某个条件的filed数据(简单来说就是 timestamp + tag + field + measurement)的组成一个point
- timestamp : 时间戳,ns单位,每个记录都必然有这个属性,没有显示添加时,默认给一个
- tag: 标签,kv结构,在database中, tag + measurement 一起构建索引
- 参与索引创建,因此适合作为查询的过滤条件
- tag的数据量不要太多,最好能有典型的辨别性(和mysql的建立索引的原则差不多)
- value为String类型
- tag是可选的,在measurement不设置tag也是ok的
- field:存储数据,kv结构
- 数据类型为: long, String, boolean, float
2、Series
InfluxDB中的series是一种数据源的合的概念,在同一个database中,相同retention policy、相同measurement、相同tag的数据属于一个series集合,标识这条数据来自哪里,同一个series的数据在物理上按照时间顺序排列在一起。
所有每个point是根据 timestamp + series 来保证唯一性
3、Retention Policies
InfluxDB没有提供直接删除Points的方法,但是它提供了Retention Policies。
主要用于指定数据的保留时间:用于决定数据保存多久(意思是数据可以删除),保存几个备份,集群的处理等
二、命令操作
1.数据库与表的操作
# 创建数据库
CREATE DATABASE "db_name"
# 显示所有数据库
SHOW DATABASES
# 删除数据库
DROP DATABASE "db_name"
# 使用数据库
USE mydb
# 显示该数据库中的表
SHOW MEASUREMENTS
# 创建表
# 直接在插入数据的时候指定表名(weather就是表名)
insert weather,altitude=1000,area=北 temperature=11,humidity=-4
# 删除表
DROP MEASUREMENT "measurementName"
2.保留策略
//查看策略
> show retention policies on db_name
name duration shardGroupDuration replicaN default
---- -------- ------------------ -------- -------
- name: 名称
- duration: 保留时间, 0表示永久保存
- shardGroupDuration: shardGroup的存储时间,shardGroup是InfluxDB的一个基本储存结构,应该大于这个时间的数据在查询效率上应该有所降低。
- replicaN: 全称是REPLICATION,副本个数
- default: 是否是默认策略
//新建策略 名称 库 时间 副本数 是否是默认策略
create retention policy "2_hour" on hh_test duration 2h replication 1 default
//修改策略
> alter retention policy "2_hour" on hh_test duration 4h default
//删除策略
> drop retention policy "2_hour" on hh_test
3.用户权限管理
# 显示用户
SHOW USERS
# 创建用户
CREATE USER "username" WITH PASSWORD 'password'
# 删除用户
DROP USER "username"
# 创建管理员权限的用户
CREATE USER "username" WITH PASSWORD 'password' WITH ALL PRIVILEGES
#重设密码
set password for xxx='newpwd'
//授权
GRANT ALL PRIVILEGES TO <username>
GRANT [READ,WRITE,ALL] ON <database_name> TO <username>
//查询授权
show grants for <username>
//回收
REVOKE ALL PRIVILEGES FROM <username>
REVOKE [READ,WRITE,ALL] ON <database_name> FROM <username>
4.series/point/tag/field
//查看tag的keys
show tag keys on <database> from <measurement>
//查看tag的value
show tag values on <database> from <measurement> with KEY [ [<operator> "<tag_key>" | <regular_expression>] | [IN ("<tag_key1>","<tag_key2")]] [WHERE <tag_key> <operator> ['<tag_value>' | <regular_expression>]] [LIMIT_clause] [OFFSET_clause]
//例如
show tag values from table_name with key="ty"
- with key 后面带上查询条件,必须存在,如查询汇率表中,base_symbol有哪些
- 连接符号可以为:等于 =, 不等于:!=, <>, 正则:=~, !~
//查看field
show field keys on <database> from <measurement>
//查看series
show series on <database> from <measurement>
5.增删改
新增
insert into <retention policy> measurement,tagKey=tagValue fieldKey=fieldValue timestamp
- retention policy 为空,则为默认策略
- 时间戳为空,则默认当前,如指定,单位为ns
类型 | 方式 | 示例 |
---|---|---|
float | 数字 | user_id=21 |
int | 数字i | age=18i |
boolean | true/false | boy=true |
String | “” or ‘’ | email=”bangzewu@126.com“ |
删除
DELETE FROM <measurement_name> WHERE [<tag_key>='<tag_value>'] | [<time interval>]
- 这里无法指定retention policy,会删除所有retention policy中符合where条件的数据。
修改
在influxdb中没有专门的修改数据的update语句,对于influxdb而言,如果想修改数据,还是得使用我们前面的说到的insert来实现
- 通过 retention policy + tag + measurement 能够锁定唯一的series
- 通过 series+timestand 能够找到 point
那么我们大致能够写出如下的语句来命中数据:
//tag 必须完全和之前insert的数据相等
insert into <retention policy> measurement,tagKey=tagValue fieldKey=fieldValue timestamp
通过这条语句可以增量修改field。
如果想修改之前的field,则需要先删除,后插入
6.查询
基础语句
SELECT <field_key>[,<field_key>,<tag_key>]
FROM <measurement_name>[,<measurement_name>]
WHERE <conditional_expression> [(AND|OR) <conditional_expression> [...]]
GROUP BY [* | <tag_key>[,<tag_key]]
order by time desc/asc
LIMIT <N> OFFSET <N>
SLIMIT <N>
select
- select * : 表示查询所有的field和tag对应的值
- select field_key: 表示查询特定的field对应的值
- select tag_key: 表示查询的特定的tag对应的值
- SELECT “<field_key>”::field,"<tag_key>"::tag: 注意::field和::tag用来限定这个数据的类型为tag或者是field
from
- FROM <measurement_name> 从指定的measurement中获取数据
- FROM <measurement_name>,<measurement_name> 从多个measurement中- 获取数据
- FROM <database_name>.<retention_policy_name>.<measurement_name> 从某个数据库中某个保留策略中查询measurement中的数据
where
- 与mysql查询基本一样 操作符含义基本一样
- 在influxdb中没有in查询,不同的查询条件可以使用and/or来连接,表示同时满足or一个满足即可
group
- 用来分组的必须是tag
- group by * 表示根据所有的tag进行分组
- group by time(2m/2s) 按照2m/2s进行分组
- 根据时间进行分组时,不允许查询具体的field值
slimit
- 指定从指定measurement返回的series数 ???
limit offset
- 简单来讲,就是limit 条数 offset 偏移
三、api操作
1.连接
let mut client = Client::new("http://123.57.130.20:8086".parse().unwrap(), "takeout").set_authentication("root", "123");
if client.ping().await {
wd_log::log_info_ln!("连接数据库成功")
}else{
wd_log::log_info_ln!("连接数据库失败")
}
let _ = client.switch_database("takeout");
2.插入
pub async fn insert(client:&Client) -> Result<(), Error> {
let mut point = Point::new("student")
.add_tag("id",Value::String("2".to_string()))
.add_field("name",Value::String("我是坏人".to_string()))
.add_field("age",Value::Integer(21));
client.write_point(point,None,None).await
}
3.删除
pub async fn delete(client:&Client, id:String) -> Result<Option<Vec<Node>>, Error> {
let query = format!(r#"delete from student where "id" = '{}'"#,id);
client.query(query.as_str(),None).await
}
4.查询
pub async fn select(client:&Client, id:String) -> Result<Option<Vec<Node>>, Error> {
let query = format!(r#"select * from student where "id" = '{}'"#,id);
client.query(query.as_str(),None).await
}
pub async fn select_time(client:&Client, time:usize) -> Result<Option<Vec<Node>>, Error> {
let query = format!(r#"select * from student where "time" > {}"#,time);
client.query(query.as_str(),None).await
}
四、其他
1.备份
备份命令
influxd backup
[ -database <db_name> ] --> 指定需要备份的数据库名
[ -portable ] --> 表示在线备份
[ -host <host:port> ] --> influxdb服务所在的机器,端口号默认为8088
[ -retention <rp_name> ] | [ -shard <shard_ID> -retention <rp_name> ] --> 备份的保留策略,注意shard是挂在rp下的;我们需要备份的就是shard中的数据
[ -start <timestamp> [ -end <timestamp> ] | -since <timestamp> ] --> 备份指定时间段的数据
<path-to-backup> --> 备份文件的输出地址
备份全部
influxd backup -portable /tmp/data/total
2.恢复
恢复命令
influxd restore
[ -db <db_name> ] --> 待恢复的数据库(备份中的数据库名)
-portable | -online
[ -host <host:port> ] --> influxdb 的服务器
[ -newdb <newdb_name> ] --> 恢复到influxdb中的数据库名
[ -rp <rp_name> ] --> 备份中的保留策略
[ -newrp <newrp_name> ] --> 恢复的保留策略
[ -shard <shard_ID> ]
<path-to-backup-files>
未完待续