跳到主要内容

数据误操作恢复指南

本指南提供了从 Databend 中常见操作错误恢复的分步说明。

简介

Databend 可以帮您恢复这些常见操作错误:

  • 误删数据库或表
  • 数据错误修改或删除
  • 表结构误操作
  • 数据误加载

这些恢复能力由 Databend 的 FUSE 引擎及其类似 Git 的存储设计提供支持,该设计维护了不同时间点的数据快照。

恢复场景和解决方案

场景:意外删除数据库

如果您意外删除了数据库,可以使用 UNDROP DATABASE 命令恢复它:

  1. 识别已删除的数据库:

    SHOW DROP DATABASES LIKE '%sales_data%';
  2. 恢复已删除的数据库:

    UNDROP DATABASE sales_data;
  3. 验证数据库是否已恢复:

    SHOW DATABASES;
  4. 恢复所有权(如果需要):

    GRANT OWNERSHIP on sales_data.* to ROLE <role_name>;

重要提示:删除的数据库只能在保留期内恢复(默认为 24 小时)。

有关更多详细信息,请参见 UNDROP DATABASESHOW DROP DATABASES

场景:意外删除表

如果您意外删除了表,可以使用 UNDROP TABLE 命令恢复它:

  1. 识别已删除的表:

    SHOW DROP TABLES LIKE '%order%';
  2. 恢复已删除的表:

    UNDROP TABLE sales_data.orders;
  3. 验证表是否已恢复:

    SHOW TABLES FROM sales_data;
  4. 恢复所有权(如果需要):

    GRANT OWNERSHIP on sales_data.orders to ROLE <role_name>;

重要提示:删除的表只能在保留期内恢复(默认为 24 小时)。

有关更多详细信息,请参见 UNDROP TABLESHOW DROP TABLES

场景:不正确的数据更新或删除

如果您意外修改或删除了表中的数据,可以使用 FLASHBACK TABLE 命令将其恢复到之前的状态:

  1. 识别不正确操作之前的快照 ID 或时间戳:
SELECT * FROM fuse_snapshot('sales_data', 'orders');
   snapshot_id: c5c538d6b8bc42f483eefbddd000af7d
snapshot_location: 29356/44446/_ss/c5c538d6b8bc42f483eefbddd000af7d_v2.json
format_version: 2
previous_snapshot_id: NULL
[... ...]
timestamp: 2023-04-19 04:20:25.062854
  1. 将表恢复到之前的状态:
   -- 使用快照 ID
ALTER TABLE sales_data.orders FLASHBACK TO (SNAPSHOT => 'c5c538d6b8bc42f483eefbddd000af7d');

-- 或使用时间戳
ALTER TABLE sales_data.orders FLASHBACK TO (TIMESTAMP => '2023-04-19 04:20:25.062854'::TIMESTAMP);
  1. 验证数据是否已恢复:
SELECT * FROM sales_data.orders LIMIT 3;

重要提示:回溯操作仅适用于现有表,并且在保留期内。

有关更多详细信息,请参见 FLASHBACK TABLE

场景:Schema 演变回滚

如果您对表的结构进行了不必要的更改,可以恢复到之前的 schema:

  1. 创建一个表并添加一些数据:
CREATE OR REPLACE TABLE customers (id INT, name VARCHAR, email VARCHAR);
INSERT INTO customers VALUES (1, 'John', 'john@example.com');
  1. 进行 schema 更改:
ALTER TABLE customers ADD COLUMN phone VARCHAR;
DESC customers;

输出:

┌─────────┬─────────┬──────┬─────────┬─────────┐
│ Field │ Type │ Null │ Default │ Extra │
├─────────┼─────────┼──────┼─────────┼─────────┤
│ id │ INT │ YES │ NULL │ │
│ name │ VARCHAR │ YES │ NULL │ │
│ email │ VARCHAR │ YES │ NULL │ │
│ phone │ VARCHAR │ YES │ NULL │ │
└─────────┴─────────┴──────┴─────────┴─────────┘
  1. 查找 schema 更改之前的快照 ID:
SELECT * FROM fuse_snapshot('default', 'customers');

输出:

snapshot_id: 01963cefafbb785ea393501d2e84a425  timestamp: 2025-04-16 04:51:03.227000  previous_snapshot_id: 01963ce9cc29735b87886a08d3ca7e2f
snapshot_id: 01963ce9cc29735b87886a08d3ca7e2f timestamp: 2025-04-16 04:44:37.289000 previous_snapshot_id: NULL
  1. 恢复到之前的 schema(使用较早的快照):
ALTER TABLE customers FLASHBACK TO (SNAPSHOT => '01963ce9cc29735b87886a08d3ca7e2f');
  1. 验证 schema 是否已恢复:
DESC customers;

输出:

┌─────────┬─────────┬──────┬─────────┬─────────┐
│ Field │ Type │ Null │ Default │ Extra │
├─────────┼─────────┼──────┼─────────┼─────────┤
│ id │ INT │ YES │ NULL │ │
│ name │ VARCHAR │ YES │ NULL │ │
│ email │ VARCHAR │ YES │ NULL │ │
└─────────┴─────────┴──────┴─────────┴─────────┘

重要注意事项和限制

  • 时间限制:恢复仅在保留期内有效(默认:24 小时)。
  • 名称冲突:如果存在具有相同名称的对象,则无法取消删除 - 首先重命名数据库重命名表
  • 所有权:所有权不会自动恢复 - 恢复后手动授予它。
  • 临时表:回溯不适用于临时表(不存储快照)。

对于紧急情况:遇到严重数据丢失?立即联系 Databend 支持以获得帮助。 联系 Databend 支持