StarRocks RECOVER 命令详解:回收站机制与库/表/分区误删恢复实战
StarRocks RECOVER 命令详解回收站机制与库/表/分区误删恢复实战【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocksRECOVER 是 StarRocks 内置的元数据级误删恢复命令用于在 DROP 之后、回收站彻底清理之前恢复被删除的数据库、表或分区是日常运维中应对误操作的核心手段。本文以 RECOVER 官方文档 为骨架结合 FE 端回收站CatalogRecycleBin与恢复执行LocalMetastore的源码实现完整讲解三种恢复语法、可恢复时间窗口、同名冲突等边界行为并给出可直接复制的实战 SQL。读完本文你将能独立完成DROP 后误删恢复的全流程排查与操作并理解恢复机制为何有 1 天默认时限、为何 TRUNCATE 的数据无法恢复。RECOVER 能恢复什么、不能恢复什么RECOVER 命令用于恢复通过 DROP 命令删除的数据库、表和分区。其底层机制是StarRocks FE 在删除元数据时并不会立即物理清除而是先将删除对象放入内存中的回收站Catalog Recycle Bin等待超过保留期限后才彻底擦除。RECOVER 的本质就是从回收站中取回这条元数据记录并重新挂载回元数据空间。几个必须牢记的边界可恢复窗口默认 1 天由 FE 参数catalog_trash_expire_second控制默认 86400 秒超过该时间后回收站中的元数据将被彻底清除无法再恢复。TRUNCATE TABLE 删除的数据不可恢复TRUNCATE 属于物理数据层面的清空操作不会进入元数据回收站因此 TRUNCATE TABLE 之后的数据无法通过 RECOVER 找回。同名冲突时不恢复旧对象如果在回收站中的对象仍存活期间又以相同名称创建了新的同类型对象则旧的被删对象不会被恢复以避免元数据冲突。语法详解RECOVER 支持三种对象粒度的恢复语法如下1. 恢复数据库RECOVER DATABASE db_name2. 恢复表RECOVER TABLE [db_name.]table_name3. 恢复分区RECOVER PARTITION partition_name FROM [db_name.]table_name语法要点恢复表时db_name可省略使用当前默认数据库也可以显式指定。恢复分区时需同时给出分区名与所属表名FROM关键字后的表名同样支持db.table形式。恢复对象的名称必须与 DROP 时完全一致命令本身不提供改名能力。从源码看 RECOVER 的执行链路在 StarRocks FE 中RECOVER 命令从 SQL 到执行共经过三层核心代码理解这条链路有助于判断问题出在哪个环节。第一层语法分发。语法分析后生成RecoverDbStmt、RecoverTableStmt、RecoverPartitionStmt三种 AST 节点由 DDLStmtExecutor.java 中的visitRecoverDbStatement/visitRecoverTableStatement/visitRecoverPartitionStatement统一转发到LocalMetastore的对应方法。第二层恢复执行。LocalMetastore.java 中实现了三个恢复入口recoverDatabase、recoverTable、recoverPartition恢复前都会做同名校验recoverDatabaseL602-L642先检查目标库是否已存在若已存在直接抛出Database[...] already exist异常随后从回收站取出数据库对象写入 EditLog 持久化恢复记录并自动重建该库内物化视图的异步刷新任务。recoverTableL657-L686先检查库是否存在、同名表是否已存在报ERR_TABLE_EXISTS_ERROR再调用回收站的recoverTable恢复完成后若恢复的是 OLAP 表还会重新注册或注销动态分区调度信息。recoverPartitionL688-L709采用先无锁取表 ID再按表 ID 加写锁复核的乐观锁流程若表在两次查询之间被更换会提示Table[...] has been changed. Try again.。第三层回收站管理。回收站的载体是 CatalogRecycleBin.java其中recoverDatabase、recoverTable、recoverPartition、replayRecover*等方法是真正操作回收站对象与回放 EditLog 的地方。值得注意的是恢复动作本身同样会写入元数据日志因此恢复操作在 FE 重启、主从切换后依然保持一致通过EditLog回放RecoverInfo。catalog_trash_expire_second决定误删后悔药的保质期恢复能力有严格的时间窗口这个窗口由 FE 参数catalog_trash_expire_second决定。在 Config.java 中可以看到其定义public static long catalog_trash_expire_second 86400L; // 1day即默认保留 86400 秒1 天。调整该参数可以改变可恢复窗口例如在fe.conf中设置catalog_trash_expire_second 259200即可将回收站保留期延长到 3 天259200 秒。注意该参数为 FE 静态配置修改后需要重启 FE 或按官方热更新机制生效且仅对修改之后进入回收站的对象生效。从 CatalogRecycleBin.java 的timeExpired方法可以看到过期判断的精确逻辑long expireMs max(Config.catalog_trash_expire_second * 1000L, Config.catalog_recycle_bin_erase_min_latency_ms);也就是说最终擦除延迟取catalog_trash_expire_second与另一个参数catalog_recycle_bin_erase_min_latency_msConfig.java默认 10 分钟的较大值。同时源码中还包含两类加时分支若分区配置了自定义保留期retentionPeriod 0则采用该保留期且此时catalog_trash_expire_second不再生效若对象处于enableEraseLater状态额外追加LATE_RECYCLE_INTERVAL_SECONDS秒的宽限期。另外timeExpired中还可以看到共享数据模式Shared-data下对集群快照内数据库/表的保护位于快照信息中的对象不会被擦除这保证了跨节点元数据一致性场景下回收站操作的可靠性。这些细节说明实际的可恢复窗口并非简单等于catalog_trash_expire_second而是叠加了最小擦除延迟、分区保留期与快照保护等多重逻辑后的结果。实战示例以下示例覆盖三种恢复粒度的完整操作均可在 mysql 客户端或任意 MySQL 兼容客户端中执行。1. 恢复被 DROP 的数据库RECOVER DATABASE example_db;执行后example_db及其中的表、分区元数据将回到可用状态。若当前已存在同名数据库命令会失败并提示库已存在。2. 恢复被 DROP 的表RECOVER TABLE example_db.example_tbl;若执行该语句时example_db.example_tbl已存在例如重新创建了同名表则旧表不会被恢复命令报错提示表已存在。3. 恢复被 DROP 的分区RECOVER PARTITION p1 FROM example_tbl;该语句将名为p1的分区恢复到example_tbl默认为当前库中。若表已被改名或重建会因表 ID 变化而提示重试。恢复后的验证建议数据库级恢复后建议执行SHOW DATABASES确认库已可见并对核心表执行SELECT COUNT(*)抽查数据完整性。表级恢复后可执行SHOW TABLES FROM example_db或DESC example_db.example_tbl确认表结构与分区信息完整。分区级恢复后可执行SHOW PARTITIONS FROM example_tbl确认分区p1重新出现在分区列表中。常见问题与边界行为Q1为什么 RECOVER 提示对象不存在或无法恢复最常见的原因是超过catalog_trash_expire_second默认 1 天回收站中的元数据已被后台擦除线程清理。其次是对象在回收站存活期间被标记为不可恢复例如伴随集群快照约束此时回收站会拒绝恢复。Q2恢复操作本身是否需要 DBA 权限RECOVER 属于元数据变更类 DDL 操作需要具备相应的库/表管理权限权限校验由 StarRocks 的 RBAC 体系统一执行与普通 DDL 一致。Q3TRUNCATE 的表数据能恢复吗不能。TRUNCATE TABLE 是数据清空操作不经过回收站TRUNCATE TABLE 删除的数据无法通过 RECOVER 恢复只能依赖备份恢复等方案。Q4恢复数据库后里面的物化视图会自动恢复吗从recoverDatabase的源码实现看恢复数据库时会调用recoverMvTasks自动重建库内非同步刷新类型物化视图的后台任务但建议恢复后仍检查物化视图的刷新状态。Q5RECOVER 与备份恢复RESTORE有何区别RECOVER 是纯元数据级的回收站取回操作秒级完成不涉及数据文件的搬运前提是 BE 上的数据副本仍在而备份恢复RESTORE是从外部存储快照还原数据适用于更大范围的灾难恢复场景。小结RECOVER 命令是 StarRocks 运维中应对DROP 误删的第一道防线它以 FE 内存回收站为依托在catalog_trash_expire_second默认 1 天的时间窗口内支持数据库、表、分区三个粒度的秒级元数据恢复且恢复过程经过 EditLog 持久化与回放具备跨 FE 故障的一致性保证。运维实践中建议将catalog_trash_expire_second视作明确的 SLA 配置项纳入变更评审对重要业务适当延长保留期同时牢记 TRUNCATE 数据不可恢复重要数据仍需配合定期备份方案兜底。【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →