【华为云MySQL技术专栏】TaurusDB库表回收站特性原理及实现

举报
GaussDB 数据库 发表于 2025/12/25 10:18:18 2025/12/25
【摘要】 1、背景介绍在数据库软件的使用过程中,误删表或数据库是导致数据丢失的高危场景。通过DROP TABLE/DROP DATABASE/TRUNCATE TABLE等DDL操作直接删除物理数据对象,其不可逆性使得恢复依赖于物理文件全量备份和增量日志。这种恢复方式存在以下风险:恢复时效性差:全量备份恢复和增量日志需逐条应用可能耗时数小时,恢复过程中用户无法读取到最新数据,可能导致客户业务中断。操作...

1、背景介绍

在数据库软件的使用过程中,误删表或数据库是导致数据丢失的高危场景。通过DROP TABLE/DROP DATABASE/TRUNCATE TABLE等DDL操作直接删除物理数据对象,其不可逆性使得恢复依赖于物理文件全量备份和增量日志。这种恢复方式存在以下风险:

  • 恢复时效性差:全量备份恢复和增量日志需逐条应用可能耗时数小时,恢复过程中用户无法读取到最新数据,可能导致客户业务中断。
  • 操作门槛高:恢复可能需要DBA介入执行复杂恢复流程。
  • 数据安全性低:备份窗口期外的数据存在永久丢失风险。

TaurusDB通过重构DDL处理流程,实现了库表回收站功能。该功能将物理删除转换为逻辑删除,通过“__recyclebin__”系统库实现"删除-恢复-清理"的全生命周期管理。其优势在于:

  • 将MySQL的DDL不可逆操作转化为可回溯操作。
  • 通过元数据操作实现秒级恢复能力。
  • 在保留MySQL兼容性的同时,增加数据冗余保护层。

2、原理介绍

2.1 DDL处理流程重构

TaurusDB库表回收站采用逻辑删除代替物理删除:

  • 物理删除传统的DROP TABLE/DROP DATABASE/TRUNCATE TABLE操作一旦成功执行,物理文件会被立刻删除,无法直接恢复。如需恢复,需要借助数据备份恢复软件拷贝物理文件进行恢复,该方式操作复杂,耗时较长,且可能需要短时间中断业务
  • 逻辑删除TaurusDB库表回收站为相关DDL操作增加一层容错,在相关语句执行成功后,表的物理文件会被保存到“__recyclebin__”数据库下,在未达到用户设置的保存时间前,用户可以随时通过命令查看和恢复该表,降低误删库表导致的数据恢复成本。

库表回收站重构了DROP TABLE/DROP DATABASE/TRUNCATE TABLE语句的执行流程,重构的核心逻辑如下:

  • 保持DDL原子性:删除语句涉及的操作在全部执行后统一提交和回滚,确保多表操作的原子性。
  • 元数据持久化:在数据字典中记录被移入回收站的表的原库/原表/删除时间等元数据。
  • 约束处理:清理关联外键等约束,避免残留约束,影响客户业务。
  • 主备同步:TaurusDB通过自研的主备元数据同步消息机制进行同步,需要扩展同步消息,包含全部回收站相关操作。
  • 保存多版本:TaurusDB回收站支持在回收站中保存相同库下同名表的多个版本和删除时间,用户可以根据时间灵活进行恢复。

以drop database为例,库表回收站基本流程如图1所示:

1.png

图1 drop database基本流程

(1)首先在mysql_rm_table_no_locks中调用rm_table_sort_into_groups构造支持原子性表的数组,然后遍历该数组;

(2)原生DROP DATABASE语句执行成功会自动提交事务,库表回收站调整提交逻辑,将删除操作和回收操作整合到同一个事务中进行执行;

(3)如果当前操作的表支持回收站操作,则将表移入回收站库”__recyclebin__“中,并将原库、原表、删除时间等回收站相关元数据记入数据字典,标记为回收站表,并构造备机元数据同步消息;

(4)如果当前操作的表不支持移入回收站,则直接调用原DROP TABLE逻辑进行删除;

(5)在相关表回收和删除全部完成后统一提交和回滚,保证回收站操作全部成功或全部失败回滚,保持DDL操作原子性。

2.2 回收站操作命令

TaurusDB库表回收站新增purge_table/restore_table/restore_db命令,用于操作回收站中暂存的表。执行回收站恢复操作时,数据库内核会根据数据字典中记录的原库原表信息进行过滤和恢复

  • 支持DDL原子性:单条回收站语句的全部后台操作包含在同一个事务中,执行全部成功并提交或全部失败并回滚,保证DDL原子性,保障主备一致以及数据不丢失。
  • 支持自动和手动清理

    1. 支持设置回收站表的保存时间,后台任务自动清理过期表的数据;

    2. 支持主动清理回收站中的指定表的数据;

    3. 支持快速清空回收站中全部表的数据。

  • 支持指定表和指定库进行恢复

    1. 支持恢复指定表到原库原表,也支持恢复到新库新表;
    2. 支持库级恢复,可批量恢复用户指定库的全部表。

  • 元数据处理:操作成功后清理数据字典中回收站相关表元数据,恢复为普通表。

  • 主备同步:构造TaurusDB元数据同步消息,高效同步回收站恢复/清理操作到全部备机节点,保持主备一致。

以restore database为例,基本流程如图2所示:

2.png

图2 restore database基本流程

(1)首先关闭ddl自动提交,由restore database主动控制事务提交;

(2)从数据字典中根据回收站库名获取需要恢复的全部回收站中表的列表,并按照入参中的指定库名信息过滤全部需要恢复的目标表;

(3)遍历目标表列表,根据THD中保存的用户信息,校验用户是否对相关库表有操作权限;

(4)执行单表恢复,并清理数据字典中被恢复表的回收站相关元数据,恢复为普通表;

(5)构造备机元数据同步消息,高效完成操作的主备数据同步;

(6)在restore database全部相关操作完成后,统一提交和回滚,以及post ddl等后续操作,保障操作原子性。

2.3 高效后台自动清理

新增后台线程,用于自动清理回收站中达到最大保存时间的表,删除后表将无法使用回收站语句对其进行恢复。该后台线程基本流程伪代码如下:

Recycle_scheduler::run() {
    while (running) {
        Table_list* tables = get_recycle_tables(); // 获取回收站表列表
        for (auto& table : tables) {
            if (current_time - table->last_altered > retention_time) {
                purge_table(table); // 物理删除过期表
            }
        }
        wait_time = calculate_next_wakeup(); // 动态计算下一次唤醒时间
        enter_cond(wait_time); // 线程休眠
    }
}

关键优化点

  • 动态调整线程休眠时间,每轮循环最后计算出最早过期表的删除时间,到达该时间点之前不会再次循环尝试删除,避免无效轮询;
  • 支持动态配置回收站中表的保留时间,默认保存3天;
  • 后台删除线程开关或保存时间参数被修改,会立刻触发一轮后台任务,重新计算表的保存时间。

2.4 权限系统扩展

为了保证回收站操作的稳定和权限可控,TaurusDB库表回收站在原有权限体系上新增权限防护:

  • Schema级隔离:通过Recycle_internal_schema_access类实现对回收站相关表操作的特殊权限控制。
  • 操作级鉴权:在用户对“__recyclebin__”库下表执行操作时,原处理逻辑的check_table_access中增加对“__recyclebin__”库权限的额外校验。

TaurusDB库表回收站继承ACL_internal_schema_access实现Recycle_internal_schema_access,并在进程初始化阶段绑定库“__recyclebin__”注册库级权限控制。

当用户对回收站库下的表进行ddl或dml操作,回收站会使用THD中保存的语句类型枚举值和操作所需的ACL类型宏进行位运算判断,确认对于回收站库来说该操作是否是风险操作。如判断该操作为风险操作,则不允许用户执行。

访问TaurusDB库表回收站具体权限要求如下:

  • 查看回收站中指定表:对”__recyclebin__“中表的SELECT权限。

  • 清理回收站中指定表:对”__recyclebin__“中表的DROP权限。

  • 恢复回收站中指定表:对”__recyclebin__“中表的ALTER、DROP权限,以及对恢复的目标表的CREATE、INSERT权限。

2.5 数据同步能力扩展

为了保证回收站操作在主备以及实例间同步的兼容性,TaurusDB进行了如下能力扩展和优化:

  • 主备同步能力扩展:扩展TaurusDB同步消息能力,支持单条语句生成两种以上DDL操作的主备同步消息,失效回收站操作中被移入/移出/删除的表的元数据;

  • Binlog扩展:新增Binlog中记录回收站session级参数字段,保证备机回放时与主机行为一致。且该字段可通过实例参数控制是否写入Binlog,保证和社区版本实例兼容。

  • DRS同步适配:

    1.回收站表名中携带回收站表唯一标识,并会记录在binlog的session级变量中,drop table/drop database/truncate table通过Binlog同步到DRS目标端节点后,内核可以解析并生成和源端相同的表名。保证后续恢复和清理操作可以成功执行;

    2.适配华为云DRS服务全量同步功能。如DRS目标端是支持库表回收站的TaurusDB,则使用逻辑复制进行全量同步时,TaurusDB会自动根据表的唯一标识构建“__recyclebin__”中表的原库/原表/删除时间等元数据,并保存到数据字典中,用于后续执行恢复/删除操作;

    3.和社区版MySQL同步适配。当源端为开启库表回收站的TaurusDB,目标端为不支持库表回收站的数据库产品或低版本TaurusDB时,DRS节点自动解析Binlog中的语句,并过滤回收站相关语法,保证复制正常运行。DRS当前默认采用该方式优化兼容性,建议用户在存在DRS或其他基于Binlog的复制链路时,使用INSERT INTO ... SELECT FROM ...等社区原生语法恢复回收站中的表到指定表,该语句生成INSERT语法与社区版本兼容,保持主备一致,避免出现复制异常。

3、使用方法

用户可以通过设置回收站相关参数控制回收站功能以及后台清理线程的启用和关闭,具体参数如表1所示:

3.png表1 库表回收站参数说明

3.1 查看回收站中暂存的表

表回收站功能提供以下命令用于查询回收站中暂存的表:

call dbms_recyclebin.show_tables();
| SCHEMA         | TABLE               | ORIGIN_SCHEMA | ORIGIN_TABLE | RECYCLED_TIME       | PURGE_TIME          |
| __recyclebin__ | test_db@t1@67ad67cb | test_db       | t1           | 2025-02-13 11:32:27 | 2025-02-16 11:32:27 |
| __recyclebin__ | test_db@t2@67ad67cb | test_db       | t2           | 2025-02-13 11:32:27 | 2025-02-16 11:32:27 |

3.2 清理回收站中指定表

表回收站功能提供以下命令用于清理回收站中暂存的表:

call dbms_recyclebin.purge_table('TABLE_NAME');

3.3 恢复回收站中指定表

表回收站功能提供以下命令用于恢复回收站中的表到原库原表:

call dbms_recyclebin.restore_table('TABLE_NAME');

表回收站功能提供以下命令用于恢复回收站中的表到指定库的指定表:

call dbms_recyclebin.restore_table('TABLE_NAME', 'DEST_DB', 'DEST_TABLE');

3.4 恢复回收站中的指定库

表回收站功能提供以下命令用于恢复回收站中所有指定原库的表到原库:

call dbms_recyclebin.restore_db('DB_NAME');

表回收站功能提供以下命令用于恢复回收站中所有指定原库的表到指定库:

call dbms_recyclebin.restore_db ('DB_NAME', 'DEST_DB');

4、总结

TaurusDB通过库表回收站,将传统DDL的"不可逆操作"转化为"可逆操作",回收站相关操作均保持DDL原子性,保障数据不丢失以及主备一致。提供多种便捷方式查询/恢复/删除实例近期删除的表,在保障数据安全的同时显著降低恢复成本,持续提升企业级数据库的运维效率。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。