
SCAN 命令使用手册
概述
SCAN 是 TDengine 在 3.3.8.0 及以后版本中新增的数据库维护命令,用于扫描数据库或特定 VGroup,检查数据完整性、索引状态等健康状况。扫描过程中发现的异常会记录到系统日志中,便于数据库运维和故障排查。
命令语法
1. 扫描整个数据库
sql
SCAN DATABASE db_name [START WITH time_point] [END WITH time_point];
参数说明:
db_name: 要扫描的数据库名称START WITH: (可选)扫描起始时间点END WITH: (可选)扫描结束时间点
时间点格式:
- 整数时间戳:
1234567890 - 字符串时间:
'2024-12-01 00:00:00' - TIMESTAMP 字符串:
TIMESTAMP '2024-12-01 00:00:00'
示例:
sql
-- 扫描整个数据库
SCAN DATABASE mydb;
-- 扫描指定时间范围
SCAN DATABASE mydb START WITH '2024-12-01 00:00:00' END WITH '2024-12-02 00:00:00';
-- 使用时间戳
SCAN DATABASE mydb START WITH 1701388800000 END WITH 1701475200000;
2. 扫描指定 VGroups
sql
SCAN [db_name] VGROUPS IN (vgroup_id_list) [START WITH time_point] [END WITH time_point];
参数说明:
db_name: (可选)数据库名称,如果省略则使用当前数据库vgroup_id_list: VGroup ID 列表,用逗号分隔START WITH、END WITH: 时间范围(可选)
示例:
sql
-- 扫描指定 VGroups
SCAN VGROUPS IN (1, 2, 3);
-- 指定数据库和 VGroups
SCAN mydb VGROUPS IN (5, 10, 15);
-- 指定时间范围的 VGroup 扫描
SCAN mydb VGROUPS IN (1, 2) START WITH '2024-12-01' END WITH '2024-12-02';
查看扫描任务
1. 查看所有扫描任务
sql
SHOW SCANS;
返回信息:
- 扫描任务 ID
- 数据库名称
- 扫描状态(运行中/已完成/失败)
- 开始时间
- 进度信息
示例输出:
scan_id | database | status | start_time | progress
--------|----------|-----------|---------------------|----------
1 | mydb | running | 2024-12-02 10:00:00 | 45%
2 | testdb | completed | 2024-12-02 09:00:00 | 100%
2. 查看扫描任务详情
sql
SHOW SCAN scan_id;
参数说明:
scan_id: 扫描任务的 ID
示例:
sql
SHOW SCAN 1;
返回详细信息:
- 扫描的具体范围
- 已扫描的数据量
- 发现的问题数量
- 错误详情(如有)
停止扫描任务
sql
KILL SCAN scan_id;
参数说明:
scan_id: 要停止的扫描任务 ID
示例:
sql
KILL SCAN 1;
扫描检查项
SCAN 命令会检查以下内容:
数据完整性
- 数据文件 CRC 校验
- 数据块完整性验证
- 时间戳顺序检查
元数据一致性
- 超级表与子表的对应关系
- 标签数据完整性
- Schema 版本一致性
索引状态
- 索引文件完整性
- 索引与数据的对应关系
VGroup 信息
- VGroup 分片信息
- 副本同步状态
错误日志
扫描过程中发现的错误会记录到:
-
系统日志文件
- 路径:
/var/log/taos/taosd.log(默认位置) - 错误级别:ERROR 或 WARNING
- 路径:
-
通过命令查看
sqlSHOW SCAN scan_id; -- 查看特定任务的错误详情
典型错误类型
数据文件损坏
Error: blockDataCheck failed! line:
元数据不一致
Error: Super table metadata mismatch for table xxx
时间序列错误
Error: Timestamp out of order in table xxx
索引异常
Error: Index file corrupted for table xxx
使用场景
1. 定期健康检查
sql
-- 每周扫描一次数据库
SCAN DATABASE production;
2. 故障排查
sql
-- 检查特定时间段的数据
SCAN DATABASE mydb START WITH '2024-12-01' END WITH '2024-12-02';
3. 性能优化前检查
sql
-- 扫描特定 VGroups
SCAN VGROUPS IN (1, 2, 3, 4, 5);
4. 数据迁移后验证
sql
-- 全库扫描验证
SCAN DATABASE migrated_db;
SHOW SCANS;
最佳实践
-
避免高峰期扫描
- 在业务低峰期执行扫描任务
- 避免影响正常业务查询性能
-
分批扫描大型数据库
sql-- 分时间段扫描 SCAN DATABASE bigdb START WITH '2024-01-01' END WITH '2024-01-31'; SCAN DATABASE bigdb START WITH '2024-02-01' END WITH '2024-02-28'; -
监控扫描进度
sql-- 定期查看扫描状态 SHOW SCANS; -
保存扫描日志
- 定期备份 taosd.log
- 建立告警机制,发现错误及时处理
-
针对性扫描
sql-- 仅扫描可能有问题的 VGroups SCAN VGROUPS IN (10, 11, 12);
权限要求
执行 SCAN 命令需要:
- 数据库的 ALTER 权限或更高权限
- root 用户或数据库管理员权限
注意事项
⚠️ 重要提示:
- 扫描是一个资源密集型操作,可能影响数据库性能
- 扫描任务可以被中断(使用 KILL SCAN)
- 扫描不会修改数据,仅进行检查
- 建议在非业务高峰期执行
- 对于大型数据库,建议使用时间范围限制扫描范围
相关命令
COMPACT DATABASE: 数据库压缩整理TRIM DATABASE: 清理数据库SHOW VGROUPS: 查看 VGroup 信息SHOW TRANSACTIONS: 查看事务状态
故障处理流程
是 否 执行 SCAN SHOW SCANS 查看进度 发现错误? 查看错误详情 扫描完成 分析日志 执行修复操作 重新扫描验证
如有问题或需要技术支持,请查阅 TDengine 官方文档或联系技术支持团队。
关于 TDengine
TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。