ARTICLE DETAIL

资讯详情

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

TDengine 数据删除详解:DELETE 语法、标记删除机制与 SECURE_DELETE 物理擦除

TDengine 数据删除详解:DELETE 语法、标记删除机制与 SECURE_DELETE 物理擦除 TDengine 数据删除详解DELETE 语法、标记删除机制与 SECURE_DELETE 物理擦除【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengineDELETE 语句用于从 TDengine 的普通表、子表或超级表中删除指定时间范围内的数据是清理设备异常数据、纠正误写入数据的主要手段。本文以官方文档为核心结合仓库源码与测试用例系统讲解 DELETE 的语法、WHERE 约束、标记删除的底层原理、空间回收机制以及数据库级/表级/语句级 SECURE_DELETE 物理擦除的完整用法与已知限制帮助你在生产环境中安全、准确地执行数据删除。DELETE 语法与参数DELETE 语句的完整语法如下DELETE FROM [db_name.]tb_name [WHERE condition] [SECURE_DELETE];各参数说明db_name可选表所在的数据库名缺省时使用当前数据库。tb_name必填要删除数据的表名可以是基础表、子表或超级表。condition可选过滤条件。不带条件时删除表中的全部数据需谨慎使用。WHERE仅支持对第一列主时间戳列进行过滤。SECURE_DELETE可选关键字。指定后本次删除在写入删除标记之外还会对匹配时间范围内的磁盘数据块进行物理覆写。也可以通过CREATE DATABASE ... SECURE_DELETE 1在数据库级别默认开启该行为。典型使用场景设备故障、传感器漂移或协议解析错误会写入一批异常数据。相比重建表或全量重导DELETE 可以精准地按时间范围清理这些数据同时不影响其余正常数据。WHERE 条件只允许过滤主时间戳列与许多关系型数据库不同TDengine 的 DELETE 语句在WHERE子句上有一项强约束——只支持对第一列主时间戳列进行过滤不能按普通数据列或标签列过滤。这一设计源于时序数据库以时间为主序的数据组织方式删除操作本质上是对某个时间区间打删除标记而非逐行定位删除。例如删除meters超级表中时间戳早于2021-10-01 10:40:00.100的全部数据DELETE FROM meters WHERE ts 2021-10-01 10:40:00.100;执行后的返回信息格式为Deleted 102000 row(s) from 1020 table(s) (0.421950s)这表示从 1020 张子表中总共删除了 102000 行数据。其中1020 table(s)正是该超级表下被扫描并标记删除的子表数量。从语法解析层面看DELETE 语句由解析器在 source/libs/parser/inc/sql.y 中处理cmd :: DELETE FROM full_table_name(A) where_clause_opt(B) SECURE_DELETE.where_clause_opt允许条件为空即全表删除SECURE_DELETE作为可选的独立关键字追加在语句末尾。删除的底层原理标记删除而非立即物理擦除执行 DELETE 后数据并不会立刻从磁盘上消失。其底层流程是写入删除标记删除操作会转化为对目标表、目标时间范围 [startTs, endTs] 的删除请求并在内存表memtable中为相应数据行写入删除标记。仓库中该入口为 source/dnode/vnode/src/tsdb/tsdbMemTable.c 的tsdbDeleteTableData(STsdb *pTsdb, int64_t version, tb_uid_t suid, tb_uid_t uid, TSKEY sKey, TSKEY eKey, int8_t secureDelete)。查询时过滤此后所有查询在读取数据块时都会结合删除标记进行过滤被标记的行不再出现在任何查询结果中。空间延迟回收被标记删除的行所占据的磁盘空间不会立即释放而是留待后续的 KEEP 过期淘汰或数据重组COMPACT统一回收。在节点侧删除请求由 source/dnode/vnode/src/vnd/vnodeSvr.c 的vnodeProcessDeleteReq处理最终调用tsdbDeleteTableData完成标记写入。该函数还会在删除前校验表是否存在、suid是否匹配并在 同一文件 中通过vnodeTxnCheckConflict检查表是否处于PREPARED_DROP准备删除的待提交状态避免 DELETE 与 DROP 并发冲突。磁盘空间的释放KEEP 过期与数据重组由于 DELETE 采用标记删除磁盘空间的最终回收依赖以下两种机制1. KEEP 过期自动删除数据库的KEEP参数决定数据文件的保留天数。数据保存时间超过KEEP后数据库会自动删除对应数据以释放存储空间。KEEP的默认值为 3650取值范围 [1, 365000]且必须大于等于DURATION参数值的 3 倍。详见 Databases。KEEP支持带单位写法如KEEP 100h、KEEP 10d单位支持m分钟、h小时、d天不带单位时默认单位为天如KEEP 50。企业版支持多级存储可设置最多 3 个保留时间如KEEP 100h,100d,3650d需满足 keep0 ≤ keep1 ≤ keep2社区版不支持多级存储即使配置多个保留时间也只会取最长的那个生效。2. 手动数据重组COMPACT企业版可通过手动触发数据重组COMPACT来主动合并数据文件并回收被删除行占用的空间详见 Data Reorganization。相关数据库参数还包括COMPACT_INTERVAL自动重组执行间隔与COMPACT_TIME_RANGE等见 Databases。SECURE_DELETE物理覆写磁盘数据块普通 DELETE 只写删除标记数据块的原始字节仍残留在磁盘文件中存在被直接读取恢复的风险。对于数据保密要求高的场景TDengine 提供了SECURE_DELETE在写删除标记的同时物理覆写匹配时间范围内的磁盘数据块。三种启用方式方式一数据库级默认开启CREATE DATABASE db_name ... SECURE_DELETE 1;SECURE_DELETE是数据库创建选项之一见 Databases取值 0默认或 10删除只写标记不立即物理覆写磁盘数据块1除写删除标记外同时物理覆写磁盘 DATA/STT 文件中对应时间范围的数据降低从文件系统直接恢复已删除数据的风险。已创建的数据库可通过ALTER DATABASE db_name SECURE_DELETE 1动态切换。方式二表级配置SECURE_DELETE同样可以作为表选项TABLE_OPTION在CREATE STABLE/CREATE TABLE时设置或通过ALTER STABLE/ALTER TABLE调整。从 source/libs/parser/inc/sql.y 的语法定义看table_options和alter_table_option均支持SECURE_DELETE NK_INTEGER。方式三语句级临时指定在单条 DELETE 语句末尾追加SECURE_DELETE关键字仅对本次删除生效DELETE FROM meters WHERE ts 2021-10-01 10:40:00.100 SECURE_DELETE;值得注意的继承规则在执行层表级与语句级的 secure delete 设置会做合并。在 source/libs/parser/src/parTranslater.c 中可以看到pDelete-secureDelete | pTbl-pMeta-secureDelete;即语句显式指定与表元数据配置的 secureDelete 按“或”合并只要任一层面开启本次删除就会执行物理覆写。物理擦除的实现策略物理覆写逻辑集中在 source/dnode/vnode/src/tsdb/tsdbSecureErase.c核心是对磁盘上的 DATA 文件和 STT 文件逐一扫描对落在 [sKey, eKey] 区间内、属于目标 (suid, uid) 的数据块执行两种策略完全包含的数据块块范围 ⊆ [sKey, eKey]直接在数据文件中的块偏移位置覆写原始字节。零模式tsSecureEraseMode 0填 0随机模式填随机字节并通过tsdbWriteFile/tsdbFsyncFile更新页 CRC。由于删除标记已保证这些行永远不会被读取直接覆写是安全的。部分重叠的数据块块范围 ∩ [sKey, eKey] ≠ ∅必须保留未删除行的数据因此先解压将目标行的 VALUE 字节清零再重新压缩写回。此路径始终使用零填充——如果使用随机填充重压缩后的数据块会比原块更大无法原地写回除非触发文件重组。已知限制务必了解仓库源码在 tsdbSecureErase.c 顶部以注释形式明确列出了多项已知限制SSD 磨损均衡SSD 控制器可能将同一逻辑块映射到不同物理单元覆写后旧物理单元可能仍残留数据。要求绝对物理清除时需依赖 ATA Secure Erase 或全盘加密。操作系统页缓存fsync 之后 OS 页缓存中仍可能保留旧数据真正的物理清除需要静态加密encryption-at-rest配合密钥销毁或硬件级安全擦除。WAL 仍含原始数据原始写入经过 WAL 日志WAL 文件中可能仍保留明文数据需等待 checkpoint 后的 WAL 裁剪逐步清除。多副本一致性该覆写代码只在 Raft 领导者上执行跟随者副本仅通过 WAL 回放应用逻辑删除不会触发文件级覆写。要获得全部副本的完整擦除各副本需独立执行覆写当前架构不支持通过 Raft 复制物理文件操作。旧格式文件tsdb1该实现只处理新的 tsdb2 文件格式旧格式文件暂不支持依赖后续压缩compaction才能最终清除。完整的安全删除说明可参考 Data Security · Secure Delete。测试用例佐证三级配置均被验证仓库测试目录 test/cases/07-DataDeletion/ 下包含多组 DELETE 相关测试其中 test_delete_secure_delete.py 完整覆盖了上述三种启用方式标注Since: v3.4.0.0test_database_secure_delete_enableCREATE DATABASE ... SECURE_DELETE 1后用SHOW CREATE DATABASE验证配置生效test_database_secure_delete_disableALTER DATABASE ... SECURE_DELETE 0动态关闭test_stable_secure_delete_enable数据库关闭 secure delete但在CREATE STABLE ... SECURE_DELETE 1表级开启并用SHOW CREATE TABLE验证test_delete_statement_with_secure_delete_option执行带SECURE_DELETE关键字的 DELETE 语句后通过SELECT COUNT(*)验证删除效果。其余如 test_delete.py、test_delete_stable.py、test_delete_childtable.py、test_delete_normaltable.py 分别覆盖普通表、超级表、子表等不同表类型的删除场景。注意事项与最佳实践删除不可恢复一旦数据被删除无法恢复务必谨慎。官方推荐的做法是先用相同的WHERE条件执行SELECT确认待删除行再执行DELETE。全表删除需三思不带WHERE条件会删除表中全部数据属于高危操作生产环境建议先确认表内数据量。条件仅限时间列WHERE只支持主时间戳列过滤无法按标签列或普通列删除需要按标签清理时应改用删除子表或重建表等方式。空间回收有延迟标记删除不会立即释放磁盘空间如需尽快回收可结合KEEP策略或在企业版中手动触发 COMPACT。安全场景按需开启 SECURE_DELETE物理覆写会带来额外的 IO 开销且受 SSD 磨损均衡、OS 页缓存、WAL 等限制无法保证绝对物理清除。对保密数据建议同时配合静态加密含 WAL 加密与硬件级安全擦除形成纵深防护。【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表