|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798 |
- # 基本概念
-
- TDengine有三个模块。一个是客户端模块`taosc`。另外两个是服务端模块,一个是管理节点模块`MGMT`,一个是数据节点模块`DNODE`。客户端模块把请求交给管理节点模块,通过TCP/UDP的方式,在配置文件中通过`mgmtShellPort`来配置端口,默认端口是`6030`。客户端模块也会和数据节点模块打交道,也通过TCP/UDP的方式,默认端口是`6035`。
-
- 所有的元数据、存储和查询都会首先和管理节点模块打交道,会有缓存。元数据包括用户、数据库、表。
-
- 在数据节点模块中的一个最重要的概念是虚拟节点`vnode`.一个库可以有很多`vnode`。一个表只会在一个`vnode`里,不会跨`vnode`存在。在写数据的时候里面有一个`预写日志`机制,就是把数据先放在缓存里,如果遇到突然断电的情况也没关系,因为当电力恢复之后缓存的数据还会进入硬盘,专业术语叫做`落盘`。落盘有两种方式。一种是`时间驱动落盘`,就是每隔一段时间缓存数据就会进入硬盘,默认为1小时,在`taos.cfg`中的`commitTime`字段配置;另外一种是`数据驱动落盘`,当缓存数据达到一定规模数据会进入硬盘,并且刷新日志文件。关键几个配置如下:
-
- ```
- 数据保存位置:
- 默认放在了/var/lib/taos/目录中,通过dataDir设置。
-
- 数据分片:
- 默认vnode中表数据按10天切片,通过daysPerFile设置。
-
- 保存时间:
- 默认是3650天,系统自动删除,通过daysToKeep设置。
-
- 数据块:
- 按列存储。
-
- 数据文件种类:
- -data文件
- -head文件
- -last文件
- ```
-
- **最佳实践**
-
- - **一个设备一张表**:提升读取写入速度,在存储介质上是连续的,一张表只有一个写入者,没有锁,以追加的方式写数据
- - **采集的物理量**:也就是列,类型包括整型、浮点型、字符串型,没有索引。
- - **时间戳**:有索引
- - **标签**:保存在超级表的元数据节点中
- - **超级表**:方便聚合统计
- - **库**:涉及保留时长、备份数、Cache大小、文件块大小、是否压缩分库
- - **库和表的数量**:没有限制
-
- # SQL语句
-
- - <> 表示用户需要输入的内容
- - [] 表示用户输入的内容可选
- - | 表示多选一
- - ... 表示前面的项可重复多个
-
- # 时间戳
-
- - 时间格式:YYYY-MM-DD HH:mm:ss.MS, 2017-08-12 18:25:58.128
- - 时间分辨率:默认毫秒
- - 服务器内部函数:now表示服务器的当前时间
- - 时间戳为0:默认使用服务器当前时间
- - Epoche Time,长整数:表示从1970-01-01 08:00:00.000开始的毫秒数
- - 时间可以加减:比如`now-2h`,a表示毫秒,s表示秒,m表示分钟,h表示小时,d表示天,w表示周,n表示月,y表示年。比如`select * from t1 where ts > now-2w and ts <=now-1w`
- - 启用微秒:通过`enableMicrosecond`
-
- # 数据类型
-
- - TIMESTAMP:8 bytes, 时间戳,最小精度为毫秒,从格林威治时间1970-01-01 08:00:00.000开始
- - INT:4 bytes, 整型,范围是[-2^31+1,2^31-1],-2^31被用作null值
- - BIGINT: 8 bytes,长整型,范围是[-2^59,2^59]
- - FLOAT:4 bytes, 浮点型,有效位数6-7
- - DOUBLE:8 bytes, 双精度浮点型,有效位数15-16
- - BINARY: 长度自定义,记录字符串,最长不能超过504bytes,字符串两端使用单引号,否则英文全部自动转换为小写。使用时需指定大小,比如binary(20)是最长是20个字符的字符串,每个字符站1byte的存储空间,如果字符串超过20个字节,将自动截断。对于字符串内的单引号,用转义符`\'`。
- - SMALLINT,2 bytes, 短整型,范围[-32767.32767]
- - TINYINT, 1 bytes, 单字节整型,范围[-127,127]
- - BOOL, 1 bytes, 布尔类型,true或false
- - NCHAR,自定义大小,拥有记录非ASCII字符串,如中文字符,每个nchar占用4个字节大小。字符串两端使用单引号,字符串内的单引号需要转义`\'`,nchar(10)表示最多存储10个nchar字符,占用40bytes空间。如果字符串超出声明长度将被自动截断。
-
- # 数据库管理
-
- SQL语句中的英文字符默认不区分大小写,统一自动转换为小写执行。如果有大小写敏感,需要使用单引号把大写字母引用起来。
-
- - 创建数据库:`CREATE DATABASE MYDB`,默认数据库数据保存10年
- - 使用数据库:`USE MYDB`
- - 删除数据库:`DROP DATABASE MYDB`
- - 显示所有数据库:`SHOW DATABASES`
-
- # 表管理
-
- - 创建表:`CREATE TABLE tb_name (timestamp_field_name TIMESTAMP, field1_name data_type1)`表的第一个字段必须是`TIMESTAMP`类型,系统会自动将其设置为主键。表的每行的长度不能超过托4096个字节。使用数据类型binary或nchar需要制定最长的字节数,比如binary(20)
- - 删除表:`DROP TABLE tb_name`
- - 显示数据库下的所有表信息:`SHOW TABLES`,可以使用like过滤,比如`SHOW TABLES LIKE ...`,%匹配0到任意个字符,_表示匹配一个字符
- - 获取表结构:`DESCRIBE`
- - 表增加列:·`ALTER TABLE tb_name ADD COLUMN field_name data_type`
- - 表删除列:`ALTER TABLE tb_name DROP COLUMN filed_name`
-
- 注意:
-
- - 如果通过超级表创建,只能针对超级表进行操作,同时针对超级表的结构更改对所有表都会生效。
- - 使用`use db_name`操作后操作当前数据库下的表
- - 切换到其它数据库的表,可以使用`demo.tb1`来表示
-
- # 数据写入
-
- - 插入一条记录:`INSERT INTO tb_name VALUES (field_value, ...)`
- - 插入一条记录到指定的列:`INSERT INTO tb_name(field1_name,...) VALUES(field1_value)`,语句中没有出现的列,数据库将自动填充为NULL
- - 插入多条记录:`INSERT INTO tb_names VALUES (field1_value1, ...) (field1_value2,...)`
- - 按指定的列插入多条记录:`INSERT INTO tb_name(field1_name,...) VALUES(field1_value1,...)(field1_value2,...)`
- - 向多个表插入多条记录:`INSERT INTO tb1_name VALUES (field1_value1,...)(field1_value2,...)... tb2_name VALUES (field1_value1,...)(field1_value2,...)...`
- - 同时向多个表按列插入多条记录
-
- ```
- INSERT INTO tb1_name (tb1_field1_name,...) VALUES(field1_value1,...)(field1_value1,...)
- tb2_name (tb2_field1_name,...) VALUES(field1_value1,...)(field1_value2,...)
- ```
-
- 注意:
-
- - 对于同一张表,记录的时间戳必须是递增,否则会跳过插入该条记录;如果时间戳为0,会默认使用服务器当前时间作为时间戳
- - 如果需要将时间戳小于最后一条记录时间的记录写入到数据库,可以使用IMPORT命令替代INSERT命令,语法是一样的;如果同时IMPORT多条记录,需要保证一批记录是按时间戳排序好的
-
- # 数据查询
-
- ```
- SELECT {* | expr_list} FROM tb_name
- [WHERRE where_condition]
- [ORDER BY _c0 {DESC | ASC}]
- [LIMIT limit, [, OFFSET offset]]
- [>> export_file]
-
- SELECT function_list FROM tb_name
- [WHERE where_condition]
- [LIMIT limit [, OFFSET offset]]
- [>> export_file]
- ```
-
- - 返回所有列:*
- - 指定列
- - 对数字列进行四则运算
- - 给列取别名
- - where语句结合逻辑判断
- - where语句结合通配符
- - `_c0`表示首列的时间戳
- - 输出结果默认按时间戳升序排列
- - ORDER BY只能对时间戳操作,对其它字段操作属于非法
-
- 过滤操作:同时使用多个字段过滤需要使用`AND`,暂时不支持`OR`。针对同一字段的过滤条件必须单一,例如`Value>20 and value <30`是合法的,`Value<20 AND Value <> 5`是非法的。
-
- - `>` 适用于timestamp 和 numeric types
- - `<` 适用于timestamp 和 numeric types
- - `>= ` 适用于 timestamp 和 numeric types
- - `<=` 适用于 timestamp 和 numeric types
- - `=` 适用于所有类型
- - `<>` 适用于所有类型
- - `%` 适用于 binary 和 nchar
- - `_` 适用于 binary 和 nchar
-
- # SQL函数
-
- COUNT
- ```
- SELECT COUNT([*|field_name]) FROM tb_name [WHERE clause]
- 返回行数或某列的非空值数量
- 返回类型为INT64
- 应用于全部字段,表和超级表
- ```
-
- AVG
- ```
- SELECT AVG(field_name) FROM tb_name [WHERE clause]
-
- 返回统计表或超级表中某列的平均值,返回结果类型为double,不能应用在timestamp, binary, nchar, bool字段
- ```
-
- WAVG
- ```
- SELECT WAVG(field_name) FROM tb_name WHERE clause
-
- 加权平均,返回sdouble,不能用在timestamp, binary, nchar, bool类型,适用于表和超级表
- ```
-
- SUM
- ```
- SELECT SUM(field_name) FROM tb_name [WHERE clause]
-
- 统计表或超级表某列的和,返回double或int64,不能用在timestamp, binary, nchar, bool
- ```
-
- STDDEV
- ```
- SELECT STDDEV(field_name) FROM tb_name [WHERE clause]
-
- 统计某列的均方差,返回double,不能用在timestamp, binary, nchar, bool
- ```
-
- LEASTSQUARES
- ```
- SELECT LEASTSQUARES(field_name) FROM tb_name [WHERE clause]
-
- 返回表中某列值是主键(时间戳)的拟合直线方程,返回结果是字符串(斜率,截距),不能应用在timestamp, binary, nchar, bool,自变量是时间戳,因变量是该列的值,适用于表
- ```
-
- MIN
- ```
- SELECT MIN(field_name) FROM {tb_name | stb_name} [WHERE clause]
-
- 不能用在timestamp, binary, ncahr, bool
- ```
-
- MAX
- ```
- SELECT MAX(field_name) FROM {tb_name | stb_name} [WHERE clause]
- ```
-
- FIRST
- ```
- SELECT FIRST(field_name) FROM {tb_name | stb_name} [WHERE clause]
-
- 表或超级表中某列值最先写入的非NULL值,适用于所有字段,各个列FIRST(*),如果结果集中的某列全部为NULL,该列的返回结果也是NULL,如果结果集中所有列全部为NULL值则不返回结果
- ```
-
- LAST
- ```
- SELECT LAST(field_name) FROM {tb_name | stb_name} [WHERE clause]
-
- 表或超级表中某列的值最后写入的非NULL值,所有字段,如果返回各个列LAST(*),如果结果集中某列全部为NULL值则该列返回的结果也是NULL,如果结果集中所有列全部为NULL则不返回结果。
- ```
-
- TOP
- ```
- SELECT TOP(field_name, K) FROM {tb_name | stb_name} [WHERE clause]
-
- 统计表或超级表中某列的值最大k个非null值,不能用在timestamp, binary, ncahr, bool,k的取值范围在[1,100]
- ```
-
- BOTTOM
- ```
- SELECT BOTTOM(field_name, K) FROM {tb_name | stb_name} [WHERE clause]
- ```
-
- PERCENTILE
- ```
- SELECT PERCENTILE(field_name, P) FROM {tb_name | stb_name} [WHERE clause]
-
- 表中某列值的百分比分位数,返回double, 不能用在timestamp, binary, ncahr, bool,k的范围0和100之间,0时候等同于MIN,100的时候等同于MAX
- ```
-
- LAST_ROW
- ```
- SELECT LAST_ROW(field_name) FROM {tb_name | stb_name}
-
- 返回表或超级表的最后一条记录,与last函数不同,last_row不支持时间范围限制,强制返回最后一条记录
- ```
-
- DIFF
- ```
- SELECT DIFF(field_name) FROM tb_name [WHERE clause]
-
- 统计表中某列的值与前一行对应值的差,不能应用在timestamp, binary, nchar, bool类型
- ```
-
- SPREAD
- ```
- SELECT SPREAD(field_namne) FROM {tb_name | stb_name}[WHERE clause]
-
- 统计超级表或表中某列的最大值和最小值之差,返回double,不能用在binary, nchar, bool类型,可用于TIEMSTAMP字段表示记录的时间覆盖范围
- ```
-
- 四则运算
- ```
- SELECT field_name [+|-|*|/|%][value | field_name] from {tb_name | stb_name} [WHERE clause]
-
- 统计表或超级表中某列或多列的计算,不能用在timestamp, binary, nchar, bool类型,支持两列或多列之间计算,使用括号表示优先级,Null字段不参与计算,如果参与计算的某行中保包含null,改行的结果是Null
- ```
-
- # 举例
-
- ```
- CREATE TABLE tb1(ts timestamp, col1 int, col2 float, col3 binary(50))
-
- SELECT * FROM tb1 WHERE ts >= NOW - 1h
-
- SELECT * FROM tb1 WHERE ts > '2018-06-01 08:00:00.000' AND ts <= '2018-06-02 08:00:00.000' AND col3 LIKE `%nny` ORDER BY ts DESC
-
- SELECT (col1 + col2) AS `complex` FROM tb1 WHERE ts > '2018-06-01 08:00:00.000' AND col2 > 1.2 LIMIT 10 OFFSET 5
-
- SELECT COUNT(*) FROM tb1 WHERE ts >= NOW - 10m AND col2 > 3.14 >> /home/testoutpu.csv
- ```
-
-
- # 时间维度聚合
-
- 按照时间切割再聚合,比如温度传感器每秒采集一次数据,徐查询每隔10分钟温度的平均值。
-
- ```
- SELECT function_list FROM tb_name
- [WHERE where_condition]
- INTERVAL(interval)
- [FILL ({None | VALUE | PREV | NULL | LINEAR})]
-
- SELECT function_list FROM stb_name
- [WHERE where_condition]
- [GTOUP BY tags]
- [FILL ({VALUE | PREV | NULL | LINEAR})]
- ```
-
- - 聚合时间段由INTERVAL指定,最短时间10毫秒,10a
- - 仅限于单个输出的函数:count, avg, sum, stddev, leastsquares, percentile, min, max, first, last不能用于多行输出函数比如top, bottom, diff和四则运算
- - WHERE语句指定查询的起止时间和过滤条件
- - FILL语句指定某一时间数据确实情况下的填充模式。NONE,也是默认的方式,不填充;VALUE,固定值填充;NULL,使用NULL值填充;PREV,使用上一个非NULL值填充数据
- - 使用FILL时候,务必指定查询的时间区间,针对每次查询系统可返回不超过1千万条结果
- - 在实践维度聚合中,返回的结果中时间序列严格单调递增
- - 如果查询对象是超级表,则聚合函数会作用于该超级表下满足值过滤条件的所有表。如果查询中没有group by语句,则返回的结果按照该时间序列严格单调递增。如果查询中使用了group by语句分组,则返回结果中每个group内部按照时间序列严格单调递增。
-
- ```
- create table sensor(ts timestamp, degree double, pm25 smallint)
-
- SLECT AVG(degree), MAX(degree), LEASTSQUARES(degree), PERCENTILE(degree, 50) FROM sensor
- WHERE TS>=now -1d //过去20小时
- INTERVAL(10M) //以10分钟为一个阶段
- FILL(PREV);
- ```
-
- # 超级表STable
-
- 对单个采集点单独建表导致表数量增加,如何对这些表进行聚合、统计呢?引入STable。
-
- > 什么是超级表STable
-
- - 同类型数据采集点的抽象
- - 包含多长数据结构一样的字表
- - STable为其子表定义了表结构和一组标签。表结构就是表中记录的数据列及其数据类型。标签名也由STable定义,标签值记录每个子表的静态信息,用于对子表进行分组过滤。
- - 子表本质上就是普通的表,由一个时间戳和若干数据列组成
- - 子表与普通表的区别在于每个子表从属于一张超级表,并带有一组STable定义的标签值
- - 每种类型的采集设备可以定义一个STable。比如定义表的每列的数据类型,比如温度、电压、电流。标签信息属于Meta Data,如采集设别额序列号、型号、位置等是静态的。用户在创建表时指定Stable,还可以指定标签的值,也可以事后增加或修改。
-
- ```
- create table thermometer (ts timestamp, degree float) tags (location binary(20), type int)
-
- create table t1 using thermometer tags ('beijing', 10)
- ```
-
- - 可以使用STable创建数量无上限的、具有不同标签的表
- - STable就是具有相同数据模型,不同标签的表的集合
- - 将标签数据和采集的动态数据完全分离,对标签建立了高性能内存索引结构
- - 一个库可以有多个STable, 一个STable有多个子表
-
- > 超级表管理
-
- - 创建超级表:`CREATE TABLE <stable_name> (<field_name> TIMESTAMP, field_name1 field_type,...) TAGS (tag_name tag_type)`,TAGS的总长度不能超过512字节,数据类型不能是timestamp和nchar,不能与其它列名相同,不能为预留关键字
- - 显示已创建的超级表:`show stables;`
- - 删除超级表:`DROP TABLE <stable_name>`,删除超级表的前提要求先删除所有的子表
- - 查看属于某个超级表并满足条件的子表:`SELECT TBNAME,[TAG_NAME,…] FROM <stable_name> WHERE <tag_name> <[=|=<|>=|<>] values..> ([AND|OR] …)`
- - 查看属于某个超级表并满足查询条件的表,TBNAME为关键字:`SELECT COUNT(TBNAME) FROM <stable_name> WHERE <tag_name> <[=|=<|>=|<>] values..> ([AND|OR] …)`
-
- > 写数据时自动创建子表
-
- 当定义好了超级表,在写数据的时候并不知道某个设备是否存在,可以采用自动创建子表,需要注意的是超级表是不能自动创建的。
-
- ```
- INSERT INTO <tb_name> USING <stb_name> TAGS (<tag1_value>,...) VALUES (field_value,...)(field_value,...)...
- ```
-
- 对多个超级表下的子表创建。
-
- ```
- INSERT INTO <tb1_name> USING <stb1_name> TAGS (<tag1_value1>, ...) VALUES (<field1_value1>,...)(<field1_value2>,...)...<tb_name2> USING <stb_name2> TAGS(<tag1_value2>,...) VALUES (<field1_value1>,...)
- ```
-
- > TAG管理
-
- - 添加新的标签:`ALTER TABLE <stable_name> ADD TAG <new_tag_name> <TYPE>`,标签总数不能超过6个
- - 删除标签:`ALTER TABLE <stable_name> DROP TAG <tag_name>`,第一列标签不能删除,至少保留一个标签,从超级表删除某个标签后,其下的所有子表也会自动删除标签
- - 修改标签名:`ALTER TABLE <stable_name> CHANGE TAG <old_tag_name> <new_tag_name>`,其下所有子表的标签名也会改变
- - 修改子表的标签值:`ALTER TABLE <table_name> SET TAG <tag_name>=<new_tag_value>`
-
- > 多表聚合
-
- 通过TAG值进行条件过滤,暂不支持针对binary类型的模糊匹配过滤。
- ```
- SELECT function<field_name>,…
- FROM <stable_name>
- WHERE <tag_name> <[=|<=|>=|<>] values..> ([AND|OR] …)
- INTERVAL (<time range>)
- GROUP BY <tag_name>, <tag_name>…
- ORDER BY <tag_name> <asc|desc>
- SLIMIT <group_limit>
- SOFFSET <group_offset>
- LIMIT <record_limit>
- OFFSET <record_offset>
- ```
-
- - 支持的函数:sum, count, avg, first, last, min, max, top, bottom
- - 针对全部或部分列的投影操作
- - 暂不支持其它类型的聚合计算和四则运算
- - 不支持嵌套
- - 不使用GROUP BY会对满足筛选条件的子表按时间聚合,按照时间戳单调递增输出
- - 使用`ORDER BY _c0 ASC | DESC`对时间戳升序或降序
- - 使用GROUP BY,按tags进行分组,组间的排序由ORDER BY指定,每个组内,按时间单调递增
- - 使用SLIMIT/SOFFSET指定组间分页。使用LIMIT/OFFSET指定组内分页。
-
- > 举例
-
- ```
- 创建超级表:
- CREATE TABLE thermometer (ts timestamp, degree double) TAGS(location binary(20), type int)
-
- 每个采集点一张表:
- CREATE TABLE term1 USING thermometer TAGS('beijing',1);
- CREATE TABLE therm2 USING thermometer TAGS('beijing',2);
- CREATE TABLE therm3 USING thermometer TAGS('tianjin',1);
- CREATE TABLE therm4 USING thermometer TAGS('shanghai',3);
-
- 写入数据
- INSERT INTO therm1 VALUES ('2018-01-01 00:00:00.000',20);
- INSERT INTO therm2 VALUES ('2018-01-01 00:00:00.000',21);
- INSERT INTO therm3 VALUES ('2018-01-01 00:00:00.000',22);
- INSERT INTO therm4 VALUES ('2018-01-01 00:00:00.000',23);
-
- 按标签聚合查询
- SELECT COUNT(*),AVG(degree), MAX(degree), MIN(degree)
- FROM thermoter
- WHERE location='beijing' or location='tianjing'
- GROUP BY location, type
-
- 按时间周期聚合查询
- SELECT COUNT(*),AVG(degree), MAX(degree), MIN(degree)
- FROM thermometer
- WHERE name<>'beijing' and ts>now-1d
- INTEERVAL(10M)
- GROUPBY location,type
- ```
-
- # 高级功能
-
- > 连续查询Continuoous Query
-
- - 定期自动执行
- - 滑动窗口的方式进行计算
- - 简化的、时间驱动的流式计算
- - 针对库中的表或超级表
- - 可以让TDengine推送查询结果,或者将结果写回到TDengine中
- - 每次执行的查询是一个时间窗口time window,时间窗口随着时间流动向前滑动
- - 定义时间窗口的大小interval,每次前向增量时间forward sliding times
- - 使用TAOS SQL定义
- - 采用时间驱动的模式
- - 原始采集数据进行采样down sampling
- - 不同于其它流式计算实时反馈结果,连续查询只在时间窗口关闭以后才计算反馈结果。比如时间窗口周期是1天,那么反馈结果是在23:59:59秒以后才生成反馈结果
- - 反馈的结果有一个时间区间,如果此时有历史记录再写入到这个时间区间,连续查询不会重新执行,不会重新将结果推送给用户,不会更新已存在的计算结果
- - 服务端并不缓存客户端的计算状态,如果应用端崩溃,再次拉起的连续查询将只会从最接近的时间窗口开始计算;如果使用写回模式,TDengine可以确保写回的有效性和连续性。
- - 是在应用端启动连续查询的
-
- ```
- SELECT COUNT(*)
- FROM FOO_TABLE
- INTERVAL(1M) SLIDING(30S)
- 每一分钟统计一次,前向滑动的时间是30秒。
-
- SELECT COUNT(*)
- FROM FOO_TABLE
- INTERVAL(1M)
- 每一分钟统计一次,前向滑动的时间是一分钟
-
- 注意:
- 前向滑动时间不能大于时间窗口的范围,如果大于了,系统将强制设置为时间窗口的范围。
- ```
-
- 将连续查询的结果写回到数据库中:
- ```
- CREATE TABLE QUERY_RES
- AS
- SELECT COUNT(*)
- FROM FOO_TABLE
- INTERVAL(1M) SLIDING(30S)
- ```
-
- 默认如果不输入结束时间,连续查询会一直进行下去。还可以指定结束时间:
- ```
- CREATE TABLE QUERY_RES
- AS
- SELECT COUNT(*)
- FROM FOO_TABLE
- WHERE TS > NOW AND TS <= NOW + 1H
- INTERVAL(1M) SLIDING(30S)
- ```
-
- 查看系统中全部运行的连续查询
- ```
- show streams
- ```
-
- 杀掉对应的连续查询
- ```
- kill stream
- ```
-
- **在写回模式中,如果把写回的表删除,连续查询也会自动停止**。
-
- > 数据订阅Publisher/Subscriber
-
- - 每一张表可视作一个标准的消息队列
- - 支持轻量级的消息订阅与推送服务
- - 使用系统提供的API,用户可以订阅数据库中的某一张表或超级表
- - 订阅的逻辑和操作状态的维护均由客户端完成
- - 客户端定时轮询服务器是否有新的记录到达,有新的记录到达就会将结果反馈到客户
-
- 启动订阅服务:
- ```
- TAOS_SUB *taos_subscribe(char *host, char *user, char *pass, char *db, char *table, int64_t time, int mseconds)
-
- --host: 主机ip地址
- --user: 数据库登录用户名
- --pass: 密码
- --db: 数据库名称
- --table: 超级表或表的名称
- --time: 启动时间,Unix Epoch,单位为毫秒,从1970年1月1日起计算的毫秒数,如果设置为0表示从当前时间开始订阅
- --mseconds: 查询数据库更新的时间间隔,单位为毫秒,一般设置为1000毫秒。返回值为指向TDengine_SUB结构的指针,如果返回为空,表示失败
- ```
-
- 获取订阅结果。用户应用程序置于一个无限循环语句,如果数据库表有新纪录到达,该API将放回最新的记录,如果没有新的记录该API将阻塞,如果返回值为空说明系统出错。
- ```
- TASOS_ROW taos_consume(TAOS_SUB *tsub)
-
- --tsub: taos_subscribe的结构体指针
- ```
-
- 取消订阅。应用程序退出时,务必调用此函数以避免资源泄露。
- ```
- void taos_unsubscribe(TAOS_SUB *tsub)
- ```
-
- 获取返回的一行记录中数据包含多少列。
- ```
- int taos_num_subfields(TAOS_SUB *tsub)
- ```
-
- 获取每列数据的属性(数据类型、名字、长度)。
- ```
- TAOS_FIELD *taos_fetch_subfields(TASO_SUB *tsub)
- ```
-
- > 缓存Cache
-
- - 时间驱动缓存策略First-In-First-Out, FIFO
- - 写驱动的缓存管理机制,和读驱动的缓存模式Least-Recent-Use, LRU不一样
- - 最近写入的数据保存在缓存中,当缓存达到临界值时,将最早的数据批量写入磁盘
- - 获取数据实际就是从缓存中获取,并且是毫秒级的
- - 可以将TDengine当作缓存来使用
- - TDengine重启以后系统的缓存将被清空,之前的缓存数据均会被写入磁盘,缓存数据将不会像专门的key-value缓存系统那样再将之前的缓存数据重新加载到缓存中
- - TDengjine会分配固定大小的内存空间作为缓存空间
- - 每个vnode都有其独立的缓存池,不同的vnode不共享缓存池
- - 每个vnode里面的表共享该vnode的缓存池
- - 缓存的大小由缓存块的大小和数量相关,cacheBlockSize定义每个缓存块的大小,cacheNumOfBlocks定义每个vnode中可以缓存块的数量,TDengine要求每张表至少有2个缓存块可供使用,因此cacheNmOfBlocks的数值不应该小于vnode结点中所包含表数量的两倍
-
- 获取一张表或超级表的最后一条记录
- ```
- select last_row(degree) from thermometer where location='beijing'
- ```
-
- # RESTful Connection
-
- 通过HTTP方式进行。
-
- ```
- http://<ip>:<PORT>/rest/sql
- http://192.168.0.1:6020/rest/sql
-
- -- IP: 集群中的任一台主机
- -- PORT:配置文件中的httpPort,默认值是6020
- -- Header里带身份认证信息,单机版仅支持Basic认证机制
- -- BODY里是一个完整的SQL语句,SQL语句中的数据表应该提供数据库前缀,否则系统会返回错误
- ```
-
- 请求:
- ```
- curl -H 'Authorization:Basic <TOKEN>' -d '<SQL>' <ip>:<PORT>/rest/sql
-
- 或
-
- curl -u username:password -d '<SQL>' <ip>:<PORT>/
-
- TOKEN为{username}:{password}经过Base64编码之后的字符串
- ```
-
- 返回格式:
- ```
- {
- "status": "succ",
- "head": ["column1","column2", …],
- "data": [
- ["2017-12-12 23:44:25.730", 1],
- ["2017-12-12 22:44:25.728", 4]
- ],
- "rows": 2
- }
- ```
-
- # 系统管理
-
- > 练手
-
- 根用户
- ```
- -- 进入根用户: sudo su
- -- 退出根用户: exit
- ```
-
- 根目录
- ```
- --来到根目录: cd /
- --退出控制台:exit
- ```
-
- vi练习
- ```
- --列出目录:ls
- --进入test目录: cd test
- --vi打开文件:vi hello.txt
- --决定光标的位置:
- 方向:h,j,k,l
- 行首:b
- 行尾:w
- 下面一行:o
- 上面一行:O
- 段首:{
- 段尾:}
- --决定插入的位置:
- 选择光标前后插入:i,a
- 选择光标所在行行首行尾插入:i,A
- --退出编辑:esc
- --保存并退出::wq!
- --不保存并退出::q!
-
- ```
-
- > 文件目录结构
-
- /etc/taos/taos.cfg 配置文件
- ```
- -- cd /
- -- cd etc/taos
- ```
-
- /usr/local/taos/driver 动态链接库目录
- ```
- -- cd /
- -- cd usr/local/taos/driver
- ```
-
- /var/lib/taos 数据文件默认目录
- ```
- --cd /
- --cd var/lib/taos
- ```
-
- /var/log/taos 日志文件目录
- ```
- --cd /
- --cd var/log/taos
- ```
-
- /usr/local/taos/bin 可执行文件目录
- ```
- --cd /
- --cd usr/local/taos/bin
-
- taos:shell可执行文件
- taosd:服务端可执行文件
- taosdump:数据导出工具
- rmtaos:卸载
- ```
-
- > 服务端配置
-
- 在/etc/taos/taos.cfg配置,配置完成后需要重启taosd服务才能生效。
-
- 指定配置文件的目录:
- ```
- taosd -c /home/user
- ```
-
- 查看taos.cfg文件:
- ```
- -- cd /
- -- cd etc/taos
- -- ls
- -- cat taos.cfg
- ```
-
- 配置详解:
-
- - internalIp:对外提供服务的ip地址
- - mgmtShellPort:管理结点与客户端通信使用的TCP/UDP端口号,默认6030,6030-6034端口被UDP占用,6030端口被TCP占用
- - vnodeShellPort:数据节点与客户端通信使用的TCP/UDP端口号,默认6035,6035-6039端口被UDP占用,6035端口被UDP占用
- - httpPort:数据结点对外提供RESTful服务使用的TCP端口号,默认6020
- - dataDir:数据库文件目录,默认/var/lib/taos
- - maxUsers:用户最大数量
- - maxDbs:数据库最大数量
- - maxTables:数据表最大数量
- - enableMonitor:系统检测,0关闭,1打开
- - logDir:日志文件目录,默认/var/log/taos
- - numOfLogLines:日志文件的最大行数
- - debugFlag: 131仅错误和报警信息,135:所有
- - days:一个数据文件覆盖的时间长度,单位是天
- - keep:数据库中保留数据的天数
- - rows:文件块中的记录条数
- - comp:文件压缩标志,0关闭,1一阶段压缩,2阶段压缩
- - ctime:数据从写入内存到写入硬盘的最长时间间隔,单位秒
- - clog:数据提交日志标志,0关闭,1打开
- - tables:每个vnode允许创建表的最大数目
- - cache:内存块的字节数大小
- - tblocks:每张表最大的内存块数
- - ablocks:每张表平均的内存块数
- - precision:时间戳,ms表示毫秒,us表示微秒
-
- 创建数据库:
- - 将具有相同特征的表放在一个库里
- - 一个应用有多个库
- - 为每个库配置不同存储参数
- - 客户端通过sql创建的数据库配置参数会覆盖系统配置参数
- ```
- create database demo days 10 cache 16000 ablocks 4
- ```
-
- > 客户端配置
-
- 在/etc/taos/taos.cfg配置,与taosd应用程序共享配置文件。启动taos时,也可以从命令行指定IP地址、端口号、用户名和密码,否则从taos.cfg读取。
-
- 为客户端程序taos指定配置文件目录:
- ```
- taos -c /home/cfg
- ```
-
- 参数详解:
-
- - masterIP:客户端默认发起请求的服务器IP地址
- - charset:指明客户端所使用的字符集,默认UTF-8,TDengine存储nchar类型数据时使用unicode存储,因此客户端需要告知服务自己所使用的字符集,即客户端所在系统的字符集
- - locale:设置系统语言环境,linux上客户端与服务端共享
- - defautlUser:默认登录用户,默认值root
- - defaultPass:默认登录密码,默认值taosdata
-
- > 用户管理
-
- - 创建用户:`CREATE USER user_name PASS 'password'`
- - 删除用户:`DROP USER user_name`,root用户使用
- - 修改用户密码:`ALTER USER user_name PASS 'password'`
- - 显示所有用户:`SHOW USERS`
-
- > 数据导入
-
- - 通过脚本文件导入:在文件中写好sql语句,每行一条,#表示注释
- - 从csv文件导入,每个csv文件属于一张表且格式和需要导入表的结构相同
-
- ```
- insert into tb1 file a.csv b.csv tb2 c.csv ...
- import into tb1 file a.csv b.csv tb2 c.csv ...
- ```
-
- > 数据导出
-
- - 按表导出csv文件,如果用户需要到处一个表或者一个STable表中的数据,可在shell中运行
- ```
- select * from <tb_name> >> a.csv
- ```
-
- - 用taosdump导出数据,通过`taosdump --help`获取更详细的用法说明
- ```
- --导出数据库中一张或多张表:taosdump [OPTION...] dbname tbname ...
- --导出一个或多个数据库:taosdump [OPTION...] --database dbname...
- --导出所有数据库(不含监控数据库): taosdump [OPTION...] --all-databases
- ```
-
- > 系统连接、任务查询关系
-
- 正在进行的查询、流式计算,查看连接:
- ```
- SHOW CONNECTIONS
- ```
-
- 强制关闭数据库连接:
- ```
- KILL CONNECTION <connection-id>
- ```
-
- 显示数据查询:
- ```
- SHOW QUERIES
- ```
-
- 强制关闭数据查询:
- ```
- KILL QUERY <query-id>
- ```
-
- 显示流式计算:
- ```
- KILL STREAM <stream-id>
- ```
-
- > 系统监控
-
- - TDengine启动后会自动创建一个监测数据库SYS,并自动将服务器的CPU,内存,硬盘空间,带宽,请求数,磁盘读写速度,慢查询等信息定时写入该数据库
- - TDengine还将重要的系统操作,比如登录、创建、删除数据库等日志及各种错误报警信息记录下来存放在SYS库里
- - 通过CLI或者WEB图形界面查看监测信息
- - 监测信息的采集默认是打开的,单可以通过修改配置文件中的enableMonitor来修改
-
- # 连接数据库实战
-
- - 数据库ip: 192.168.8.129
|