ソースを参照

TDengine入门

master
qdjjx 5年前
コミット
59d29631e3
2個のファイルの変更809行の追加0行の削除
  1. 798
    0
      实践/数据库/TDengine入门.md
  2. 11
    0
      实践/数据库/TDengine安装.md

+ 798
- 0
实践/数据库/TDengine入门.md ファイルの表示

@@ -0,0 +1,798 @@
1
+# 基本概念
2
+
3
+TDengine有三个模块。一个是客户端模块`taosc`。另外两个是服务端模块,一个是管理节点模块`MGMT`,一个是数据节点模块`DNODE`。客户端模块把请求交给管理节点模块,通过TCP/UDP的方式,在配置文件中通过`mgmtShellPort`来配置端口,默认端口是`6030`。客户端模块也会和数据节点模块打交道,也通过TCP/UDP的方式,默认端口是`6035`。
4
+
5
+所有的元数据、存储和查询都会首先和管理节点模块打交道,会有缓存。元数据包括用户、数据库、表。
6
+
7
+在数据节点模块中的一个最重要的概念是虚拟节点`vnode`.一个库可以有很多`vnode`。一个表只会在一个`vnode`里,不会跨`vnode`存在。在写数据的时候里面有一个`预写日志`机制,就是把数据先放在缓存里,如果遇到突然断电的情况也没关系,因为当电力恢复之后缓存的数据还会进入硬盘,专业术语叫做`落盘`。落盘有两种方式。一种是`时间驱动落盘`,就是每隔一段时间缓存数据就会进入硬盘,默认为1小时,在`taos.cfg`中的`commitTime`字段配置;另外一种是`数据驱动落盘`,当缓存数据达到一定规模数据会进入硬盘,并且刷新日志文件。关键几个配置如下:
8
+
9
+```
10
+数据保存位置:
11
+    默认放在了/var/lib/taos/目录中,通过dataDir设置。
12
+
13
+数据分片:
14
+    默认vnode中表数据按10天切片,通过daysPerFile设置。
15
+
16
+保存时间:
17
+    默认是3650天,系统自动删除,通过daysToKeep设置。
18
+
19
+数据块:
20
+    按列存储。
21
+
22
+数据文件种类:
23
+    -data文件
24
+    -head文件
25
+    -last文件
26
+```
27
+
28
+**最佳实践**
29
+
30
+- **一个设备一张表**:提升读取写入速度,在存储介质上是连续的,一张表只有一个写入者,没有锁,以追加的方式写数据
31
+- **采集的物理量**:也就是列,类型包括整型、浮点型、字符串型,没有索引。
32
+- **时间戳**:有索引
33
+- **标签**:保存在超级表的元数据节点中
34
+- **超级表**:方便聚合统计
35
+- **库**:涉及保留时长、备份数、Cache大小、文件块大小、是否压缩分库
36
+- **库和表的数量**:没有限制
37
+
38
+# SQL语句
39
+
40
+- <> 表示用户需要输入的内容
41
+- [] 表示用户输入的内容可选
42
+- | 表示多选一
43
+- ... 表示前面的项可重复多个
44
+
45
+# 时间戳
46
+
47
+- 时间格式:YYYY-MM-DD HH:mm:ss.MS, 2017-08-12 18:25:58.128
48
+- 时间分辨率:默认毫秒
49
+- 服务器内部函数:now表示服务器的当前时间
50
+- 时间戳为0:默认使用服务器当前时间
51
+- Epoche Time,长整数:表示从1970-01-01 08:00:00.000开始的毫秒数
52
+- 时间可以加减:比如`now-2h`,a表示毫秒,s表示秒,m表示分钟,h表示小时,d表示天,w表示周,n表示月,y表示年。比如`select * from t1 where ts > now-2w and ts <=now-1w`
53
+- 启用微秒:通过`enableMicrosecond`
54
+
55
+# 数据类型
56
+
57
+- TIMESTAMP:8 bytes, 时间戳,最小精度为毫秒,从格林威治时间1970-01-01 08:00:00.000开始
58
+- INT:4 bytes, 整型,范围是[-2^31+1,2^31-1],-2^31被用作null值
59
+- BIGINT: 8 bytes,长整型,范围是[-2^59,2^59]
60
+- FLOAT:4 bytes, 浮点型,有效位数6-7
61
+- DOUBLE:8 bytes, 双精度浮点型,有效位数15-16
62
+- BINARY: 长度自定义,记录字符串,最长不能超过504bytes,字符串两端使用单引号,否则英文全部自动转换为小写。使用时需指定大小,比如binary(20)是最长是20个字符的字符串,每个字符站1byte的存储空间,如果字符串超过20个字节,将自动截断。对于字符串内的单引号,用转义符`\'`。
63
+- SMALLINT,2 bytes, 短整型,范围[-32767.32767]
64
+- TINYINT, 1 bytes, 单字节整型,范围[-127,127]
65
+- BOOL, 1 bytes, 布尔类型,true或false
66
+- NCHAR,自定义大小,拥有记录非ASCII字符串,如中文字符,每个nchar占用4个字节大小。字符串两端使用单引号,字符串内的单引号需要转义`\'`,nchar(10)表示最多存储10个nchar字符,占用40bytes空间。如果字符串超出声明长度将被自动截断。
67
+
68
+# 数据库管理
69
+
70
+SQL语句中的英文字符默认不区分大小写,统一自动转换为小写执行。如果有大小写敏感,需要使用单引号把大写字母引用起来。
71
+
72
+- 创建数据库:`CREATE DATABASE MYDB`,默认数据库数据保存10年
73
+- 使用数据库:`USE MYDB`
74
+- 删除数据库:`DROP DATABASE MYDB`
75
+- 显示所有数据库:`SHOW DATABASES`
76
+
77
+# 表管理
78
+
79
+- 创建表:`CREATE TABLE tb_name (timestamp_field_name TIMESTAMP, field1_name data_type1)`表的第一个字段必须是`TIMESTAMP`类型,系统会自动将其设置为主键。表的每行的长度不能超过托4096个字节。使用数据类型binary或nchar需要制定最长的字节数,比如binary(20)
80
+- 删除表:`DROP TABLE tb_name`
81
+- 显示数据库下的所有表信息:`SHOW TABLES`,可以使用like过滤,比如`SHOW TABLES LIKE ...`,%匹配0到任意个字符,_表示匹配一个字符
82
+- 获取表结构:`DESCRIBE`
83
+- 表增加列:·`ALTER TABLE tb_name ADD COLUMN field_name data_type`
84
+- 表删除列:`ALTER TABLE tb_name DROP COLUMN filed_name`
85
+
86
+注意:
87
+
88
+- 如果通过超级表创建,只能针对超级表进行操作,同时针对超级表的结构更改对所有表都会生效。
89
+- 使用`use db_name`操作后操作当前数据库下的表
90
+- 切换到其它数据库的表,可以使用`demo.tb1`来表示
91
+
92
+# 数据写入
93
+
94
+- 插入一条记录:`INSERT INTO tb_name VALUES (field_value, ...)`
95
+- 插入一条记录到指定的列:`INSERT INTO tb_name(field1_name,...) VALUES(field1_value)`,语句中没有出现的列,数据库将自动填充为NULL
96
+- 插入多条记录:`INSERT INTO tb_names VALUES (field1_value1, ...) (field1_value2,...)`
97
+- 按指定的列插入多条记录:`INSERT INTO tb_name(field1_name,...) VALUES(field1_value1,...)(field1_value2,...)`
98
+- 向多个表插入多条记录:`INSERT INTO tb1_name VALUES (field1_value1,...)(field1_value2,...)... tb2_name VALUES (field1_value1,...)(field1_value2,...)...`
99
+- 同时向多个表按列插入多条记录
100
+
101
+```
102
+INSERT INTO tb1_name (tb1_field1_name,...) VALUES(field1_value1,...)(field1_value1,...)
103
+            tb2_name (tb2_field1_name,...) VALUES(field1_value1,...)(field1_value2,...)
104
+```
105
+
106
+注意:
107
+
108
+- 对于同一张表,记录的时间戳必须是递增,否则会跳过插入该条记录;如果时间错为0,会默认使用服务器当前时间作为时间戳
109
+- 如果需要将时间戳小于最后一条记录时间的记录写入到数据库,可以使用IMPORT命令替代INSERT命令,语法是一样的;如果同时IMPORT多条记录,需要保证一批记录是按时间戳排序好的
110
+
111
+# 数据查询
112
+
113
+```
114
+SELECT {* | expr_list} FROM tb_name
115
+    [WHERRE wehre_condition]
116
+    [ORDER BY _c0 {DESC | ASC}]
117
+    [LIMIT limit, [, OFFSET offset]]
118
+    [>> export_file]
119
+
120
+SELECT function_list FROM tb_name
121
+    [WHERE where_condition]
122
+    [LIMIT limit [, OFFSET offset]]
123
+    [>> export_file]
124
+```
125
+
126
+- 返回所有列:*
127
+- 指定列
128
+- 对数字列进行四则运算
129
+- 给列取别名
130
+- where语句结合逻辑判断
131
+- where语句结合通配符
132
+- `_c0`表示首列的时间戳
133
+- 输出结果默认按时间戳升序排列
134
+- ORDER BY只能对时间戳操作,对其它字段操作属于非法
135
+
136
+过滤操作:同时使用多个字段过滤需要使用`AND`,暂时不支持`OR`。针对同一字段的过滤条件必须单一,例如`Value>20 and value <30`是合法的,`Value<20 AND Value <> 5`是非法的。
137
+
138
+- `>` 适用于timestamp 和 numeric types
139
+- `<` 适用于timestamp 和 numeric types
140
+- `>= ` 适用于 timestamp 和 numeric types
141
+- `<=` 适用于 timestamp 和 numeric types
142
+- `=` 适用于所有类型
143
+- `<>` 适用于所有类型
144
+- `%` 适用于 binary 和 nchar
145
+- `_` 适用于 binary 和 nchar
146
+
147
+# SQL函数
148
+
149
+COUNT
150
+```
151
+SELECT COUNT([*|field_name]) FROM tb_name [WHERE clause]
152
+返回行数或某列的非空值数量
153
+返回类型为INT64
154
+应用于全部字段,表和超级表
155
+```
156
+
157
+AVG
158
+```
159
+SELECT AVG(field_name) FROM tb_name [WHERE clause]
160
+
161
+返回统计表或超级表中某列的平均值,返回结果类型为double,不能应用在timestamp, binary, nchar, bool字段
162
+```
163
+
164
+WAVG
165
+```
166
+SELECT WAVG(field_name) FROM tb_name WHERE clause
167
+
168
+加权平均,返回sdouble,不能用在timestamp, binary, nchar, bool类型,适用于表和超级表
169
+```
170
+
171
+SUM
172
+```
173
+SELECT SUM(field_name) FROM tb_name [WHERE clause]
174
+
175
+统计表或超级表某列的和,返回double或int64,不能用在timestamp, binary, nchar, bool
176
+```
177
+
178
+STDDEV
179
+```
180
+SELECT STDDEV(field_name) FROM tb_name [WHERE clause]
181
+
182
+统计某列的均方差,返回double,不能用在timestamp, binary, nchar, bool
183
+```
184
+
185
+LEASTSQUARES
186
+```
187
+SELECT LEASTSQUARES(field_name) FROM tb_name [WHERE clause]
188
+
189
+返回表中某列值是主键(时间戳)的拟合直线方程,返回结果是字符串(斜率,截距),不能应用在timestamp, binary, nchar, bool,自变量是时间戳,因变量是该列的值,适用于表
190
+```
191
+
192
+MIN
193
+```
194
+SELECT MIN(field_name) FROM {tb_name | stb_name} [WHERE clause]
195
+
196
+不能用在timestamp, binary, ncahr, bool
197
+```
198
+
199
+MAX
200
+```
201
+SELECT MAX(field_name) FROM {tb_name | stb_name} [WHERE clause]
202
+```
203
+
204
+FIRST
205
+```
206
+SELECT FIRST(field_name) FROM {tb_name | stb_name} [WHERE clause]
207
+
208
+表或超级表中某列值最先写入的非NULL值,适用于所有字段,各个列FIRST(*),如果结果集中的某列全部为NULL,该列的返回结果也是NULL,如果结果集中所有列全部为NULL值则不返回结果
209
+```
210
+
211
+LAST
212
+```
213
+SELECT LAST(field_name) FROM {tb_name | stb_name} [WHERE clause]
214
+
215
+表或超级表中某列的值最后写入的非NULL值,所有字段,如果返回各个列LAST(*),如果结果集中某列全部为NULL值则该列返回的结果也是NULL,如果结果集中所有列全部为NULL则不返回结果。
216
+```
217
+
218
+TOP
219
+```
220
+SELECT TOP(field_name, K) FROM {tb_name | stb_name} [WHERE clause]
221
+
222
+统计表或超级表中某列的值最大k个非null值,不能用在timestamp, binary, ncahr, bool,k的取值范围在[1,100]
223
+```
224
+
225
+BOTTOM
226
+```
227
+SELECT BOTTOM(field_name, K) FROM {tb_name | stb_name} [WHERE clause]
228
+```
229
+
230
+PERCENTILE
231
+```
232
+SELECT PERCENTILE(field_name, P) FROM {tb_name | stb_name} [WHERE clause]
233
+
234
+表中某列值的百分比分位数,返回double, 不能用在timestamp, binary, ncahr, bool,k的范围0和100之间,0时候等同于MIN,100的时候等同于MAX
235
+```
236
+
237
+LAST_ROW
238
+```
239
+SELECT LAST_ROW(field_name) FROM {tb_name | stb_name}
240
+
241
+返回表或超级表的最后一条记录,与last函数不同,last_row不支持时间范围限制,强制返回最后一条记录
242
+```
243
+
244
+DIFF
245
+```
246
+SELECT DIFF(field_name) FROM tb_name [WHERE clause]
247
+
248
+统计表中某列的值与前一行对应值的差,不能应用在timestamp, binary, nchar, bool类型
249
+```
250
+
251
+SPREAD
252
+```
253
+SELECT SPREAD(field_namne) FROM {tb_name | stb_name}[WHERE clause]
254
+
255
+统计超级表或表中某列的最大值和最小值之差,返回double,不能用在binary, nchar, bool类型,可用于TIEMSTAMP字段表示记录的时间覆盖范围
256
+```
257
+
258
+四则运算
259
+```
260
+SELECT field_name [+|-|*|/|%][value | field_name] from {tb_name | stb_name} [WHERE clause]
261
+
262
+统计表或超级表中某列或多列的计算,不能用在timestamp, binary, nchar, bool类型,支持两列或多列之间计算,使用括号表示优先级,Null字段不参与计算,如果参与计算的某行中保包含null,改行的结果是Null
263
+```
264
+
265
+# 举例
266
+
267
+```
268
+CREATE TABLE tb1(ts timestamp, col1 int, col2 float, col3 binary(50))
269
+
270
+SELECT * FROM tb1 WHERE ts >= NOW - 1h
271
+
272
+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
273
+
274
+SELECT (col1 + col2) AS `complex` FROM tb1 WHERE ts > '2018-06-01 08:00:00.000' AND col2 > 1.2 LIMIT 10 OFFSET 5
275
+
276
+SELECT COUNT(*) FROM tb1 WHERE ts >= NOW - 10m AND col2 > 3.14 >> /home/testoutpu.csv
277
+```
278
+  
279
+
280
+# 时间维度聚合
281
+
282
+按照时间切割再聚合,比如温度传感器每秒采集一次数据,徐查询每隔10分钟温度的平均值。
283
+
284
+```
285
+SELECT function_list FROM tb_name
286
+    [WHERE where_condition]
287
+    INTERVAL(interval)
288
+    [FILL ({None | VALUE | PREV | NULL | LINEAR})]
289
+
290
+SELECT function_list FROM stb_name
291
+    [WHERE where_condition]
292
+    [GTOUP BY tags]
293
+    [FILL ({VALUE | PREV | NULL | LINEAR})]
294
+```
295
+
296
+- 聚合时间段由INTERVAL指定,最短时间10毫秒,10a
297
+- 仅限于单个输出的函数:count, avg, sum, stddev, leastsquares, percentile, min, max, first, last不能用于多行输出函数比如top, bottom, diff和四则运算
298
+- WHERE语句指定查询的起止时间和过滤条件
299
+- FILL语句指定某一时间数据确实情况下的填充模式。NONE,也是默认的方式,不填充;VALUE,固定值填充;NULL,使用NULL值填充;PREV,使用上一个非NULL值填充数据
300
+- 使用FILL时候,务必指定查询的时间区间,针对每次查询系统可返回不超过1千万条结果
301
+- 在实践维度聚合中,返回的结果中时间序列严格单调递增
302
+- 如果查询对象是超级表,则聚合函数会作用于该超级表下满足值过滤条件的所有表。如果查询中没有group by语句,则返回的结果按照该时间序列严格单调递增。如果查询中使用了group by语句分组,则返回结果中每个group内部按照时间序列严格单调递增。
303
+
304
+```
305
+create table sensor(ts timestamp, degree double, pm25 smallint)
306
+
307
+SLECT AVG(degree), MAX(degree), LEASTSQUARES(degree), PERCENTILE(degree, 50) FROM sensor
308
+    WHERE TS>=now -1d //过去20小时
309
+    INTERVAL(10M) //以10分钟为一个阶段
310
+    FILL(PREV);
311
+```
312
+
313
+# 超级表STable
314
+
315
+对单个采集点单独建表导致表数量增加,如何对这些表进行聚合、统计呢?引入STable。
316
+
317
+> 什么是超级表STable
318
+
319
+- 同类型数据采集点的抽象
320
+- 包含多长数据结构一样的字表
321
+- STable为其子表定义了表结构和一组标签。表结构就是表中记录的数据列及其数据类型。标签名也由STable定义,标签值记录每个子表的静态信息,用于对子表进行分组过滤。
322
+- 子表本质上就是普通的表,由一个时间戳和若干数据列组成
323
+- 子表与普通表的区别在于每个子表从属于一张超级表,并带有一组STable定义的标签值
324
+- 每种类型的采集设备可以定义一个STable。比如定义表的每列的数据类型,比如温度、电压、电流。标签信息属于Meta Data,如采集设别额序列号、型号、位置等是静态的。用户在创建表时指定Stable,还可以指定标签的值,也可以事后增加或修改。
325
+
326
+```
327
+create table thermometer (ts timestamp, degree float) tags (location binary(20), type int)
328
+
329
+create table t1 using thermometer tags ('beijing', 10)
330
+```
331
+
332
+- 可以使用STable创建数量无上限的、具有不同标签的表
333
+- STable就是具有相同数据模型,不同标签的表的集合
334
+- 将标签数据和采集的动态数据完全分离,对标签建立了高性能内存索引结构
335
+- 一个库可以有多个STable, 一个STable有多个子表
336
+
337
+> 超级表管理
338
+
339
+- 创建超级表:`CREATE TABLE <stable_name> (<field_name> TIMESTAMP, field_name1 field_type,...) TAGS (tag_name tag_type)`,TAGS的总长度不能超过512字节,数据类型不能是timestamp和nchar,不能与其它列名想听,不能为预留关键字
340
+- 显示已创建的超级表:`show stables;`
341
+- 删除超级表:`DROP TABLE <stable_name>`,删除超级表的前提要求先删除所有的子表
342
+- 查看属于某个超级表并满足条件的子表:`SELECT TBNAME,[TAG_NAME,…] FROM <stable_name> WHERE <tag_name> <[=|=<|>=|<>] values..> ([AND|OR] …)`
343
+- 查看属于某个超级表并满足查询条件的表,TBNAME为关键字:`SELECT COUNT(TBNAME) FROM <stable_name> WHERE <tag_name> <[=|=<|>=|<>] values..> ([AND|OR] …)`
344
+  
345
+> 写数据时自动创建子表
346
+
347
+当定义好了超级表,在写数据的时候并不知道某个设备是否存在,可以采用自动创建子表,需要注意的是超级表是不能创建的。
348
+
349
+```
350
+INSERT INTO <tb_name> USING <stb_name> TAGS (<tag1_value>,...) VALUES (field_value,...)(field_value,...)...
351
+```
352
+
353
+对多个超级表下的子表创建。
354
+
355
+```
356
+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>,...)
357
+```
358
+
359
+> TAG管理
360
+
361
+- 添加新的标签:`ALTER TABLE <stable_name> ADD TAG <new_tag_name> <TYPE>`,标签总数不能超过6个
362
+- 删除标签:`ALTER TABLE <stable_name> DROP TAG <tag_name>`,第一列标签不能删除,至少保留一个标签,从超级表删除某个标签后,其下的所有子表也会自动删除标签
363
+- 修改标签名:`ALTER TABLE <stable_name> CHANGE TAG <old_tag_name> <new_tag_name>`,其下所有子表的标签名也会改变
364
+- 修改子表的标签值:`ALTER TABLE <table_name> SET TAG <tag_name>=<new_tag_value>`
365
+
366
+> 多表聚合
367
+
368
+通过TAG值进行条件过滤,暂不支持针对binary类型的模糊匹配过滤。
369
+```
370
+SELECT function<field_name>,… 
371
+ FROM <stable_name> 
372
+ WHERE <tag_name> <[=|<=|>=|<>] values..> ([AND|OR] …)
373
+ INTERVAL (<time range>)
374
+ GROUP BY <tag_name>, <tag_name>…
375
+ ORDER BY <tag_name> <asc|desc>
376
+ SLIMIT <group_limit>
377
+ SOFFSET <group_offset>
378
+ LIMIT <record_limit>
379
+ OFFSET <record_offset>
380
+```
381
+
382
+- 支持的函数:sum, count, avg, first, last, min, max, top, bottom
383
+- 针对全部或部分列的投影操作
384
+- 暂不支持其它类型的聚合计算和四则运算
385
+- 不支持嵌套
386
+- 不使用GROUP BY会对满足筛选条件的子表按时间聚合,按照时间戳单调递增输出
387
+- 使用`ORDER BY _c0 ASC | DESC`对时间戳升序或降序
388
+- 使用GROUP BY,按tags进行分组,组间的排序由ORDER BY指定,每个组内,按时间单调递增
389
+- 使用SLIMIT/SOFFSET指定组间分页。使用LIMIT/OFFSET指定组内分页。
390
+
391
+> 举例
392
+
393
+```
394
+创建超级表:
395
+CREATE TABLE thermometer (ts timestamp, degree double) TAGS(location binary(20), type int)
396
+
397
+每个采集点一张表:
398
+CREATE TABLE term1 USING thermometer TAGS('beijing',1);
399
+CREATE TABLE therm2 USING thermometer TAGS('beijing',2);
400
+CREATE TABLE therm3 USING thermometer TAGS('tianjin',1);
401
+CREATE TABLE therm4 USING thermometer TAGS('shanghai',3);
402
+
403
+写入数据
404
+INSERT INTO therm1 VALUES ('2018-01-01 00:00:00.000',20);
405
+INSERT INTO therm2 VALUES ('2018-01-01 00:00:00.000',21);
406
+INSERT INTO therm3 VALUES ('2018-01-01 00:00:00.000',22);
407
+INSERT INTO therm4 VALUES ('2018-01-01 00:00:00.000',23);
408
+
409
+按标签聚合查询
410
+SELECT COUNT(*),AVG(degree), MAX(degree), MIN(degree)
411
+FROM thermoter
412
+WHERE location='beijing' or location='tianjing'
413
+GROUP BY location, type
414
+
415
+按时间周期聚合查询
416
+SELECT COUNT(*),AVG(degree), MAX(degree), MIN(degree)
417
+FROM thermometer
418
+WHERE name<>'beijing' and ts>now-1d
419
+INTEERVAL(10M)
420
+GROUPBY location,type
421
+```
422
+
423
+# 高级功能
424
+
425
+> 连续查询Continuoous Query
426
+
427
+- 定期自动执行
428
+- 滑动窗口的方式进行计算
429
+- 简化的、时间驱动的流式计算
430
+- 针对库中的表或超级表
431
+- 可以让TDengine推送查询结果,或者将结果写回到TDengine中
432
+- 每次执行的查询是一个时间窗口time window,时间窗口随着时间流动向前滑动
433
+- 定义时间窗口的大小interval,每次前向增量时间forward sliding times
434
+- 使用TAOS SQL定义
435
+- 采用时间驱动的模式
436
+- 催原始采集数据进行采样down sampling
437
+- 不同于其它流式计算实时反馈结果,连续查询只在时间窗口关闭以后才计算反馈结果。比如时间窗口周期是1天,那么反馈结果是在23:59:59秒以后才生成反馈结果
438
+- 反馈的结果有一个时间区间,如果此时有历史记录再写入到这个时间区间,连续查询不会重新执行,不会重新将结果推送给用户,不会更新已存在的计算结果
439
+- 服务端并不缓存客户端的计算状态,如果应用端崩溃,再次拉起的连续查询将只会从最接近的时间窗口开始计算;如果使用写回模式,TDengine可以确保写回的有效性和连续性。
440
+- 是在应用端启动连续查询的
441
+
442
+```
443
+SELECT COUNT(*) 
444
+FROM FOO_TABLE
445
+INTERVAL(1M) SLIDING(30S)
446
+每一分钟统计一次,前向滑动的时间是30秒。
447
+
448
+SELECT COUNT(*)
449
+FROM FOO_TABLE
450
+INTERVAL(1M)
451
+每一分钟统计一次,前向滑动的时间是一分钟
452
+
453
+注意:
454
+前向滑动时间不能大于时间窗口的范围,如果大于了,系统将强制设置为时间窗口的范围。
455
+```
456
+
457
+将连续查询的结果写回到数据库中:
458
+```
459
+CREATE TABLE QUERY_RES
460
+    AS
461
+    SELECT COUNT(*)
462
+    FROM FOO_TABLE
463
+    INTERVAL(1M) SLIDING(30S)
464
+```
465
+
466
+默认如果不输入结束时间,连续查询会一直进行下去。还可以指定结束时间:
467
+```
468
+CREATE TABLE QUERY_RES
469
+    AS
470
+    SELECT COUNT(*)
471
+    FROM FOO_TABLE
472
+    WHERE TS > NOW AND TS <= NOW + 1H
473
+    INTERVAL(1M) SLIDING(30S)
474
+```
475
+
476
+查看系统中全部运行的连续查询
477
+```
478
+show streams
479
+```
480
+
481
+杀掉对应的连续查询
482
+```
483
+kill stream
484
+```
485
+
486
+**在写回模式中,如果把写回的表删除,连续查询也会自动停止**。
487
+
488
+> 数据订阅Publisher/Subscriber
489
+
490
+- 每一张表可视作一个标准的消息队列
491
+- 支持轻量级的消息订阅与推送服务
492
+- 使用系统提供的API,用户可以订阅数据库中的某一张表或超级表
493
+- 订阅的逻辑和操作状态的维护均由客户端完成
494
+- 客户端定时轮询服务器是否有新的记录到达,有新的记录到达就会将结果反馈到客户
495
+
496
+启动订阅服务:
497
+```
498
+TAOS_SUB *taos_subscribe(char *host, char *user, char *pass, char *db, char *table, int64_t time, int mseconds)
499
+
500
+--host: 主机ip地址
501
+--user: 数据库登录用户名
502
+--pass: 密码
503
+--db: 数据库名称
504
+--table: 超级表或表的名称
505
+--time: 启动时间,Unix Epoch,单位为毫秒,从1970年1月1日起计算的毫秒数,如果设置为0表示从当前时间开始订阅
506
+--mseconds: 查询数据库更新的时间间隔,单位为毫秒,一般设置为1000毫秒。返回值为指向TDengine_SUB结构的指针,如果返回为空,表示失败
507
+```
508
+
509
+获取订阅结果。用户应用程序置于一个无限循环语句,如果数据库表有新纪录到达,该API将放回最新的记录,如果没有新的记录该API将阻塞,如果返回值为空说明系统出错。
510
+```
511
+TASOS_ROW taos_consume(TAOS_SUB *tsub)
512
+
513
+--tsub: taos_subscribe的结构体指针
514
+```
515
+
516
+取消订阅。应用程序退出时,务必调用此函数以避免资源泄露。
517
+```
518
+void taos_unsubscribe(TAOS_SUB *tsub)
519
+```
520
+
521
+获取返回的一行记录中数据包含多少列。
522
+```
523
+int taos_num_subfields(TAOS_SUB *tsub)
524
+```
525
+
526
+获取每列数据的属性(数据类型、名字、长度)。
527
+```
528
+TAOS_FIELD *taos_fetch_subfields(TASO_SUB *tsub)
529
+```
530
+
531
+> 缓存Cache
532
+
533
+- 时间驱动缓存策略First-In-First-Out, FIFO
534
+- 写驱动的缓存管理机制,和读驱动的缓存模式Least-Recent-Use, LRU不一样
535
+- 最近写入的数据保存在缓存中,当缓存达到临界值时,将最早的数据批量写入磁盘
536
+- 获取数据实际就是从缓存中获取,并且是毫秒级的
537
+- 可以将TDengine当作缓存来使用
538
+- TDengine重启以后系统的缓存将被清空,之前的缓存数据均会被写入磁盘,缓存数据将不会像专门的key-value缓存系统那样再将之前的缓存数据重新加载到缓存中
539
+- TDengjine会分配固定大小的内存空间作为缓存空间
540
+- 每个vnode都有其独立的缓存池,不同的vnode不共享缓存池
541
+- 每个vnode里面的表共享该vnode的缓存池
542
+- 缓存的大小由缓存块的大小和数量相关,cacheBlockSize定义每个缓存块的大小,cacheNumOfBlocks定义每个vnode中可以缓存块的数量,TDengine要求每张表至少有2个缓存块可供使用,因此cacheNmOfBlocks的数值不应该小于vnode结点中所包含表数量的两倍
543
+
544
+获取一张表或超级表的最后一条记录
545
+```
546
+select last_row(degree) from thermometer where location='beijing'
547
+```
548
+
549
+# RESTful Connection
550
+
551
+通过HTTP方式进行。
552
+
553
+```
554
+http://<ip>:<PORT>/rest/sql
555
+http://192.168.0.1:6020/rest/sql
556
+
557
+-- IP: 集群中的任一台主机
558
+-- PORT:配置文件中的httpPort,默认值是6020
559
+-- Headler里带身份认证信息,单机版仅致辞Basic认证机制
560
+-- BODY里是一个完整的SQL语句,SQL语句中的数据表应该提供数据库前缀,否则系统会返回错误
561
+```
562
+
563
+请求:
564
+```
565
+curl -H 'Authorization:Basic <TOKEN>' -d '<SQL>' <ip>:<PORT>/rest/sql
566
+
567
+或
568
+
569
+curl -u username:password -d '<SQL>' <ip>:<PORT>/
570
+
571
+TOKEN为{username}:{password}经过Base64编码之后的字符串
572
+```
573
+
574
+返回格式:
575
+```
576
+{
577
+    "status": "succ",
578
+    "head": ["column1","column2", …],
579
+    "data": [
580
+        ["2017-12-12 23:44:25.730", 1],
581
+        ["2017-12-12 22:44:25.728", 4]
582
+    ],
583
+    "rows": 2
584
+} 
585
+```
586
+
587
+# 系统管理
588
+
589
+> 练手
590
+
591
+根用户
592
+```
593
+-- 进入根用户: sudo su
594
+-- 退出根用户: exit
595
+```
596
+
597
+根目录
598
+```
599
+--来到根目录: cd /
600
+--退出控制台:exit
601
+```
602
+
603
+vi练习
604
+```
605
+--列出目录:ls
606
+--进入test目录: cd test
607
+--vi打开文件:vi hello.txt
608
+--决定光标的位置:
609
+    方向:h,j,k,l 
610
+    行首:b
611
+    行尾:w
612
+    下面一行:o
613
+    上面一行:O
614
+    段首:{
615
+    段尾:}
616
+--决定插入的位置:
617
+    选择光标前后插入:i,a
618
+    选择光标所在行行首行尾插入:i,A
619
+--退出编辑:esc
620
+--保存并退出::wq!
621
+--不保存并退出::q!
622
+
623
+```
624
+
625
+> 文件目录结构
626
+
627
+/etc/taos/taos.cfg 配置文件
628
+```
629
+-- cd /
630
+-- cd etc/taos
631
+```
632
+
633
+/usr/local/taos/driver 动态链接库目录
634
+```
635
+-- cd /
636
+-- cd usr/local/taos/driver
637
+```
638
+
639
+/var/lib/taos 数据文件默认目录
640
+```
641
+--cd /
642
+--cd var/lib/taos
643
+```
644
+
645
+/var/log/taos 日志文件目录
646
+```
647
+--cd /
648
+--cd var/log/taos
649
+```
650
+
651
+/usr/local/taos/bin 可执行文件目录
652
+```
653
+--cd /
654
+--cd usr/local/taos/bin
655
+
656
+taos:shell可执行文件
657
+taosd:服务端可执行文件
658
+taosdump:数据导出工具
659
+rmtaos:卸载
660
+```
661
+
662
+> 服务端配置
663
+
664
+在/etc/taos/taos.cfg配置,配置完成后需要重启taosd服务才能生效。
665
+
666
+指定配置文件的目录:
667
+```
668
+taosd -c /home/user
669
+```
670
+
671
+查看taos.cfg文件:
672
+```
673
+-- cd /
674
+-- cd etc/taos
675
+-- ls
676
+-- cat taos.cfg
677
+```
678
+
679
+配置详解:
680
+
681
+- internalIp:对外提供服务的ip地址
682
+- mgmtShellPort:管理结点与客户端通信使用的TCP/UDP端口号,默认6030,6030-6034端口被UDP占用,6030端口被TCP占用
683
+- vnodeShellPort:数据节点与客户端通信使用的TCP/UDP端口号,默认6035,6035-6039端口被UDP占用,6035端口被UDP占用
684
+- httpPort:数据结点对外提供RESTful服务使用的TCP端口号,默认6020
685
+- dataDir:数据库文件目录,默认/var/lib/taos
686
+- maxUsers:用户最大数量
687
+- maxDbs:数据库最大数量
688
+- maxTables:数据表最大数量
689
+- enableMonitor:系统检测,0关闭,1打开
690
+- logDir:日志文件目录,默认/var/log/taos
691
+- numOfLogLines:日志文件的最大行数
692
+- debugFlag: 131仅错误和报警信息,135:所有
693
+- days:一个数据文件覆盖的时间长度,单位是天
694
+- keep:数据库中保留数据的天数
695
+- rows:文件块中的记录条数
696
+- comp:文件压缩标志,0关闭,1一阶段压缩,2阶段压缩
697
+- ctime:数据从写入内存到写入硬盘的最长时间间隔,单位秒
698
+- clog:数据提交日志标志,0关闭,1打开
699
+- tables:每个vnode允许创建表的最大数目
700
+- cache:内存块的字节数大小
701
+- tblocks:每张表最大的内存块数
702
+- ablocks:每张表平均的内存块数
703
+- precision:时间戳,ms表示毫秒,us表示微秒
704
+
705
+创建数据库:
706
+- 将具有相同特征的表放在一个库里
707
+- 一个应用有多个库
708
+- 为每个库配置不同存储参数
709
+- 客户端通过sql创建的数据库配置参数会覆盖系统配置参数
710
+```
711
+create database demo days 10 cache 16000 ablocks 4
712
+```
713
+
714
+> 客户端配置
715
+
716
+在/etc/taos/taos.cfg配置,与taosd应用程序共享配置文件。启动taos时,也可以从命令行指定IP地址、端口号、用户名和密码,否则从taos.cfg读取。
717
+
718
+为客户端程序taos指定配置文件目录:
719
+```
720
+taos -c /home/cfg
721
+```
722
+
723
+参数详解:
724
+
725
+- masterIP:客户端默认发起请求的服务器IP地址
726
+- charset:指明客户端所使用的字符集,默认UTF-8,TDengine存储nchar类型数据时使用unicode存储,因此客户端需要告知服务自己所使用的字符集,即客户端所在系统的字符集
727
+- locale:设置系统语言环境,linux上客户端与服务端共享
728
+- defautlUser:默认登录用户,默认值root
729
+- defaultPass:默认登录密码,默认值taosdata
730
+
731
+> 用户管理
732
+
733
+- 创建用户:`CREATE USER user_name PASS 'password'`
734
+- 删除用户:`DROP USER user_name`,root用户使用
735
+- 修改用户密码:`ALTER USER user_name PASS 'password'`
736
+- 显示所有用户:`SHOW USERS`
737
+
738
+> 数据导入
739
+
740
+- 通过脚本文件导入:在文件中写好sql语句,每行一条,#表示注释
741
+- 从csv文件导入,每个csv文件属于一张表且格式和需要导入表的结构相同
742
+
743
+```
744
+insert into tb1 file a.csv b.csv tb2 c.csv ...
745
+import into tb1 file a.csv b.csv tb2 c.csv ...
746
+```
747
+
748
+> 数据导出
749
+
750
+- 按表导出csv文件,如果用户需要到处一个表或者一个STable表中的数据,可在shell中运行
751
+```
752
+select * from <tb_name> >> a.csv
753
+```
754
+
755
+- 用taosdump导出数据,通过`taosdump --help`获取更详细的用法说明
756
+```
757
+--导出数据库中一张或多张表:taosdump [OPTION...] dbname tbname ...
758
+--导出一个或多个数据库:taosdump [OPTION...] --database dbname...
759
+--导出所有数据库(不含监控数据库): taosdump [OPTION...] --all-databases
760
+```
761
+
762
+> 系统连接、任务查询关系
763
+
764
+正在进行的查询、流式计算,查看连接:
765
+```
766
+SHOW CONNECTIONS
767
+```
768
+
769
+强制关闭数据库连接:
770
+```
771
+KILL CONNECTION <connection-id>
772
+```
773
+
774
+显示数据查询:
775
+```
776
+SHOW QUERIES
777
+```
778
+
779
+强制关闭数据查询:
780
+```
781
+KILL QUERY <query-id>
782
+```
783
+
784
+显示流式计算:
785
+```
786
+KILL STREAM <stream-id>
787
+```
788
+
789
+> 系统监控
790
+
791
+- TDengine启动后会自动创建一个监测数据库SYS,并自动将服务器的CPU,内存,硬盘空间,带宽,请求数,磁盘读写速度,慢查询等信息定时写入该数据库
792
+- TDengine还将重要的系统操作,比如登录、创建、删除数据库等日志及各种错误报警信息记录下来存放在SYS库里
793
+- 通过CLI或者WEB图形界面查看监测信息
794
+- 监测信息的采集默认是打开的,单可以通过修改配置文件中的enableMonitor来修改
795
+
796
+# 连接数据库实战
797
+
798
+- 数据库ip: 192.168.8.129

+ 11
- 0
实践/数据库/TDengine安装.md ファイルの表示

@@ -103,4 +103,15 @@ failed to connect to server
103 103
 show databases;
104 104
 use test;
105 105
 select * from t;
106
+```
107
+
108
+-其它连接时采用的
109
+
110
+```
111
+--查看当前的ip:ifconfig, 当前ip为:192.168.8.110
112
+--sudo su
113
+--cd /
114
+--cd etc/taos
115
+--vi taos.cfg
116
+--把internalIp改成110
106 117
 ```

読み込み中…
キャンセル
保存