ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

TDEngine常用命令实战:从建库查询到故障排查的完整指南

TDEngine常用命令实战:从建库查询到故障排查的完整指南 TDEngine 用久了你会发现最趁手的工具往往不是花里胡哨的界面而是命令行里那套 taos 指令。做时序库的日常无非是建库建表、写数据、查聚合、盯集群状态、处理权限这些动作用一行命令敲出来比在 Web 界面上点半天要快得多。这篇文章把我实际用 TDEngine 这段时间最常用的命令和功能梳理了一遍也把几个高频报错的排查思路放了进来适合刚上手时序数据库、准备在生产环境用 TDEngine或者已经在用但想系统补一补命令体系的读者。1. 整体思路先分清 TDEngine 命令体系的几条线1.1 一套命令三个入口很多人第一次接触 TDEngine 都会懵因为“命令”这个词其实覆盖了三层东西。第一层是操作系统层面的服务管理命令比如systemctl start taosd、systemctl status taosd管的是数据库进程有没有跑起来。第二层是命令行客户端taos里的交互式命令和 SQL 语句进入之后可以建库、建表、写数据、查数据。第三层是配套工具命令比如taosdump负责备份恢复taosBenchmark负责压力测试和造数据。这三层职责完全不同但都叫“TDEngine 命令”。我见过不少同事把taos和taosd搞混甚至有人在没启动服务的时候直接敲taos然后抱怨连不上。分清这三层之后大部分“命令不生效”的困惑就解决了一半。1.2 命令对象时序模型要先想清楚操作 TDEngine 的命令之前一定要先在脑子里过一遍它的数据模型库 database、超级表 stable、子表 child table再加上普通表。超级表可以理解成一张“带标签的模板”它定义了采集数据的字段结构比如时间戳、电压、电流还定义了一组标签比如设备编号、设备类型、安装位置。真正存数据的是一张张子表每张子表都继承超级表的结构并且拥有固定的标签值。普通表则是不带标签的独立表适合不需要按设备维度拆分的简单场景。很多命令容易出错本质上是因为没分清操作对象。比如CREATE TABLE和CREATE STABLE压根是两码事前者建普通表后者建超级表。后面讲具体命令的时候我会反复强调这一点因为这是 TDEngine 和 MySQL、PostgreSQL 最大的思维差异。1.3 版本差异2.x 与 3.x 的坑先泼一盆冷水TDEngine 2.x 和 3.x 的命令细节有不少差异。同样是查看集群状态2.x 和 3.x 在字段展示、命令分类上就不完全一样超级表相关的查询语法也有调整备份工具的版本演变就更明显了2.x 的 taosdump 和 3.x 的参数项需要分别确认。我自己的习惯是在每套环境部署完以后第一件事就是跑一下taos -V或者taosd -V确认当前版本号。然后到官网找对应版本文档别拿 2.x 的命令硬套 3.x。本文内容以 3.x 为主涉及版本差异的地方我会顺带提一句实操时一定以你实际部署版本的官方文档为准。2. 环境准备与连接方式2.1 服务端和命令行检查新装 TDEngine 之后我建议至少按这个顺序做一遍检查。第一步确认服务进程状态systemctl start taosd systemctl status taosd看到active (running)才说明服务端起来了。如果起不来先去看日志TDEngine 的日志默认在/var/log/taos/目录下文件名类似taosdlog.0。配置文件在/etc/taos/taos.cfg很多启动失败都是端口被占、数据目录权限不对、磁盘空间不足导致的。第二步进入命令行客户端taos出现Welcome to the TDEngine Command Line Interface之类的提示就说明能连上服务端。然后执行show databases;能列出至少log这个系统库就说明整条链路是通的。如果连show databases都不行那就得回头检查服务端和网络了。这里有个经验生产环境建议把数据目录dataDir从系统盘挪到独立数据盘。TDEngine 的时序数据写入量通常很大日志和data都在系统盘的话磁盘一满整个集群都会出问题单独挂盘至少不会拖垮系统分区。2.2 可视化工具连接DBeaver 里的驱动配置虽然命令行很高效但做复杂查询和图表分析时很多人还是喜欢用 DBeaver。要在 DBeaver 里连 TDEngine关键一步是把 JDBC 驱动配置好。TDEngine 3.x 提供了两类 JDBC 驱动一类是原生驱动连接串前缀是jdbc:TSDB://走 6030 端口另一类是 RESTful 驱动连接串前缀是jdbc:TAOS-RS://走 6041 端口。在 DBeaver 里需要先新建驱动管理器把驱动 jar 添加进去。具体做法是从 Maven 中央仓库或者官方发行页面下载对应的 JDBC 驱动 jar 包然后在 DBeaver 的“数据库驱动管理器”里新建驱动填好驱动名称、类名和 URL 模板。以 RESTful 驱动为例Driver Class 是com.taosdata.jdbc.rs.RestfulDriverURL 模板可以写成jdbc:TAOS-RS://{host}:6041/{database}。连接不上的时候先手动测一下端口通不通telnet 你的TDEngine地址 6030 telnet 你的TDEngine地址 6041端口不通再放通防火墙或安全组大多数情况不是驱动配置的问题而是网络访问被拦住了。2.3 RESTful 与编程接口的基本姿势除了命令行程序接入 TDEngine 最常用的方式就是 RESTful 接口。默认端口 6041直接用 HTTP POST 发 SQL 就能拿到 JSON 结果。curl -u root:taosdata -d show databases http://你的TDEngine地址:6041/rest/sql这种轻量级方式特别适合前端、脚本、边缘网关做数据上报和查询。Python、Go、Node.js 都有对应的客户端库底层多数也是走 RESTful 或者原生连接。不过要注意一个细节RESTful 接口只是“入口变了”背后的 SQL 解析、权限校验、license 校验一样都不少。也就是说如果授权限制了某些查询能力换任何一种外部接口都可能被拦这个在后面讲 0x83a 错误时会专门展开。3. 高频命令全解析从建库到查询3.1 库与表管理建库参数先想清楚建库是 TDEngine 所有工作的第一步。我建库时的习惯是不盲目用默认参数先把保留时间和文件跨度定下来。CREATE DATABASE monitor KEEP 365 DURATION 30 BUFFER 256 WAL_LEVEL 1;这条命令里几个参数值得多说几句。KEEP 365表示数据保留 365 天超过这个时间的数据会被自动清理所以它直接决定了你要准备多少磁盘空间。DURATION 30表示每 30 天的数据会划分到一个数据文件组里这个参数越小单次文件合并的成本越低但产生的文件数量也越多。BUFFER是写入缓冲内存块大小WAL_LEVEL是预写日志级别如果数据可靠性要求高WAL 级别不能设太低。修改库参数可以用ALTER DATABASEALTER DATABASE monitor KEEP 180;需要注意DURATION这类物理文件管理参数一般建库时就要定好后期能不能改、改了有什么影响不同版本策略不一样。删除库要格外小心DROP DATABASE monitor;这条命令会把整个库物理删除数据不经过回收站。我吃过大亏有一次在测试环境把库名写错了直接清掉了另一套数据。所以执行之前务必确认当前连接的是哪套环境可以用show databases;先看一看再动手。建表分普通表和超级表。普通表适合结构单一、不需要标签维度的场景CREATE TABLE IF NOT EXISTS sensor_001 (ts TIMESTAMP, temperature FLOAT, humidity FLOAT);超级表则是 TDEngine 的核心用法适合设备接入这类天然带标签的场景CREATE STABLE device_metric (ts TIMESTAMP, voltage FLOAT, current FLOAT, temperature FLOAT) TAGS (device_id BINARY(20), device_type BINARY(20), location BINARY(64));看到没结构字段里放随时间变化的数据标签字段放不随时间变化的设备属性。然后每个具体设备建一张子表CREATE TABLE dev_0001 USING device_metric TAGS (DEV0001, sensor, beijing);查看当前库里有什么表、表结构是什么SHOW TABLES; SHOW STABLES; DESCRIBE dev_0001;DESCRIBE能看到字段名、类型和长度排查类型不匹配问题的时候特别好用。3.2 时序数据写入与查询时间过滤是命根子写入一条数据非常简单INSERT INTO dev_0001 VALUES (now, 220.5, 1.2, 36.5);批量追加写入时可以在一个INSERT后面跟多组值时序数据库的写入本质是“追加”而不是“更新”所以要尽量攒批写入。查询这块我的经验是时间过滤条件必须写。TDEngine 是列式存储加时间分区不写时间范围等于逼它全表扫描。一个子表几万条没问题但 50 张子表、每张上百万条的时候全表扫能把集群拖垮。正常的单表聚合查询长这样SELECT AVG(voltage), MAX(current), MIN(temperature), COUNT(*) FROM dev_0001 WHERE ts NOW - 1h;时间窗口聚合是时序数据库的看家功能SELECT _wstart, _wend, AVG(voltage) FROM dev_0001 WHERE ts NOW - 1d INTERVAL(10m) FILL(PREV);INTERVAL(10m)表示按 10 分钟切一个窗口_wstart和_wend是窗口的起止时间。FILL(PREV)表示窗口内没有数据时用前一个值填充如果你不想要填充值就把FILL去掉或者写FILL(NONE)。更高级一点的用法是滑动窗口SELECT COUNT(*) FROM dev_0001 WHERE ts NOW - 1h INTERVAL(1h) SLIDING(10m);这条命令能实现“每 10 分钟滑动一次统计最近 1 小时的数据”非常适合作业率、在线率这种滚动指标。如果要对超级表做“每台设备各自统计”用PARTITION BY tbnameSELECT COUNT(*) FROM device_metric WHERE ts NOW - 1h PARTITION BY tbname;这条命令是运维监控场景最常用的一招能一次性把所有设备的记录数按子表切分开来统计。如果还要按标签维度汇总那就用GROUP BYSELECT location, AVG(temperature) FROM device_metric WHERE ts NOW - 1h INTERVAL(5m) GROUP BY location;注意GROUP BY后面跟的是标签列不能直接跟普通字段。时间窗口聚合和标签分组组合使用是 TDEngine 查询的精髓这个组合目前我见过最频繁用在设备巡检、区域趋势分析场景里。3.3 集群状态与系统监控SHOW 家族命令运维排查问题时SHOW家族命令是最高频的入口。我把常用的都列出来SHOW DNODES; -- 查看数据节点 SHOW MNODES; -- 查看管理节点 SHOW VGROUPS; -- 查看虚拟节点分组 SHOW QUERIES; -- 查看正在执行的查询 SHOW CONNECTIONS; -- 查看当前连接 SHOW STREAMS; -- 查看流式计算任务 SHOW USERS; -- 查看用户列表SHOW DNODES能看到集群里有哪些数据节点、状态是不是 ready、还有多少磁盘空间这是巡检的第一条命令。SHOW VGROUPS能看数据分片情况如果某个 vgroup 的 vnode 分布不均衡就需要考虑负载调整。最实用的是SHOW QUERIES。有一次线上查询特别慢我用这条命令看到一条异常 SQL 一直在跑然后用KILL QUERY把它终止了集群立刻恢复。命令格式大约是这样KILL QUERY 查询ID;这里的查询 ID 可以从SHOW QUERIES的输出里拿到。3.4 用户与权限别只盯着 rootTDEngine 默认有个root用户密码是taosdata。生产环境千万别只用 root至少要按团队职责拆一下权限。创建用户CREATE USER monitor PASS your_password;授权GRANT read ON monitor.* TO monitor;这条命令的意思是给monitor用户开通monitor库的只读权限。write权限就是写入all就是全部权限。撤销权限REVOKE read ON monitor.* FROM monitor;改密码ALTER USER monitor PASS new_password;删除用户DROP USER monitor;有一个细节很容易踩坑授权的时候库名写得不对或者表名带上了但权限类型不支持命令执行完虽然不报错但实际访问时会被拒绝。所以授权之后最好切换到普通用户试一下查询别等上线了才发现权限没生效。4. 一套完整实操从零开始搭一个设备监控时序库4.1 场景设计先算数据量再定参数假设现在要采集 50 台设备的电压、电流和温度每 5 秒上报一次数据要保留 30 天。先算一笔账每台设备一天上报 24 * 60 * 60 / 5 17280 条50 台设备一天就是 864000 条30 天大约是 2592 万条。这个量级对 TDEngine 来说完全没压力但建库参数还是要规划一下。CREATE DATABASE iot_data KEEP 30 DURATION 3 WAL_LEVEL 1;KEEP 30对应业务要求DURATION 3表示大约 3 天生成一个数据文件这个跨度比较适合 5 秒一条这种较高频写入文件增长和合并节奏都比较好控。4.2 执行和验证过程一条条敲给你看先指定数据库USE iot_data;建超级表CREATE STABLE device_metric (ts TIMESTAMP, voltage FLOAT, current FLOAT, temperature FLOAT) TAGS (device_id BINARY(20), device_type BINARY(20), location BINARY(64));然后循环建 50 张子表。手动一条条敲不现实我是直接写脚本生成的for i in $(seq 1 50); do taos -s USE iot_data; CREATE TABLE dev_$(printf %04d $i) USING device_metric TAGS (DEV$(printf %04d $i), sensor, beijing); donetaos -s这个参数可以执行单条或多条 SQL写完直接退出非常适合脚本化运维。写一条测试数据INSERT INTO dev_0001 VALUES (now, 220.5, 1.2, 36.5);然后立刻查回来SELECT * FROM dev_0001 ORDER BY ts DESC LIMIT 5;看到刚写入的数据说明链路正常。接下来验证所有子表是否建好SHOW TABLES;正常应该有 50 张子表加上一张超级表。如果某张表缺失再用DESCRIBE dev_0001对比检查是不是标签或字段写错了。最后做一次多维度查询验证聚合能力SELECT _wstart, AVG(voltage), AVG(current), AVG(temperature) FROM device_metric WHERE ts NOW - 1h PARTITION BY tbname INTERVAL(5m);这条命令能看到每台设备每 5 分钟的电压、电流、温度均值基本就是监控大屏的 SQL 原型。4.3 备份与恢复taosdump 的基本姿势备份这件事越早做越好。TDEngine 官方的备份恢复工具是taosdump常用方式如下。备份指定数据库taosdump -o /data/backup -D iot_data-o指定输出目录-D指定要备份的数据库。恢复时反过来taosdump -i /data/backup -D iot_data-i指定输入目录。实测下来恢复前不一定需要手动建库工具会自动重建。这里有两个经验一是备份不要放在系统盘尤其是大数据量场景备份文件很容易把磁盘撑满二是备份尽量安排在业务低峰期虽然 taosdump 对在线业务影响不大但大量读取还是会占用系统 IO 和网络带宽。5. 高频报错排查与心得5.1 0x83a 查询被 license 限制怎么办这个报错在最近的使用中真的频繁出现错误原文是tdengine error (0x83a): query denied by license: external query is restricted翻译过来就是查询被授权策略拒绝了原因写得挺直白——外部查询受到限制。我遇到这类问题时的排查思路是这样的第一步先用命令行客户端taos执行同样的 SQL。如果命令行能正常出结果说明 SQL 本身没什么问题被拦的是“外部访问”这个入口也就是 JDBC、RESTful、DBeaver 这些非 CLI 渠道。第二步检查当前授权范围。不同版本查看授权信息的命令不一样常见的是SHOW GRANTS;或者SHOW LICENSES;能列出授权的节点数、到期时间、功能限制等。第三步确认是不是测试版或试用版授权的限制。有些免费授权对“外部查询”能力做了限制这是正常的授权策略不是集群故障。生产环境的话联系服务商确认当前授权是否能覆盖你的连接方式必要时申请更高级别的授权。这里我想专门叮嘱一句别想着去绕授权校验。这类限制是 license 在服务端强制校验的绕过既不安全也不合规唯一正路是确认授权范围并合理申请。排查时把版本、连接方式、授权情况三样信息备齐问题一般很快就能定位。5.2 HoltWinters 预测函数报错处理TDEngine 内置了HOLTWINTERS时间序列预测函数适合做温度趋势、流量波动这类简单预测。但实测中用它的报错率不低最典型的就是数据类型不匹配。错误信息通常会指向某个列不是 double 类型。解决办法是显式做类型转换SELECT HOLTWINTERS(CAST(temperature AS DOUBLE), 20) FROM device_metric WHERE ts NOW - 7d;CAST(temperature AS DOUBLE)把原列转成 double20表示预测未来 20 个点。这条命令在时序预测场景里很常用。除了类型转换HOLTWINTERS对数据质量也很敏感时间戳要递增且尽量等间隔数据不能有太多缺失点预测的点数要小于输入点数。如果你的原始数据有乱序或者缺失建议先做一次窗口聚合重采样比如SELECT AVG(temperature) FROM device_metric WHERE ts NOW - 7d INTERVAL(5m) FILL(LINEAR);把重采样结果作为输入再做 HoltWinters 预测稳定性会好很多。遇到 “double 报错”我的排查顺序是先DESCRIBE看字段类型再SELECT 原始列 LIMIT 5看实际值最后套CAST或者调整函数参数。5.3 连接失败、查询慢等实战经验最后再整理几个高频场景都是我实际踩过的坑。连接失败多半是端口问题。原生连接走 6030RESTful 走 6041防火墙或者云安全组没开就直接超时。先telnet 主机IP 端口验证通不通再检查 taosd 进程是否正常。查询慢多半是没带时间范围。时序库最忌讳不带ts过滤的查询。另外查询涉及超级表时尽量带上标签过滤条件把扫描范围缩到更小的子表集合上。磁盘满这个比想象中更容易发生。TDEngine 的日志在/var/log/taos/加上数据文件业务高峰期很容易把磁盘吃紧。我在生产环境会专门做磁盘空间告警数据目录和日志目录分开监控。磁盘一满写入会异常查询也可能报错而且恢复起来比单纯报错麻烦得多。进程起不来先看日志不要反复重启。/var/log/taos/taosdlog.0的最后几十行基本能告诉你原因。配置写错、端口被占、数据目录权限不对这三类原因占了大多数。除了这些我还发现一个好的预防习惯部署完 TDEngine 之后第一时间把SHOW DNODES;、SHOW MNODES;、SHOW VGROUPS;、SHOW USERS;这些命令跑一遍把输出留个快照。这相当于给集群拍了一张“体检底片”后面出任何问题先和这张底片对比往往很快就能发现变化点。我个人实际用下来有一个体会TDEngine 的命令并不可怕真正决定你是否能用好它的是你对数据模型理解得有多深。超级表和子表的映射关系想清楚了建表命令和查询命令就都顺理成章了。另外不管你用哪个版本先花两分钟把 SHOW 家族命令和权限命令过一遍后面排查问题会省非常多的时间。这也是我每换一套环境都会做的第一件事。
返回列表