从操作错误中恢复
本指南提供了在 TiDB Cloud Lake 中从常见操作错误中恢复的分步说明。
简介
TiDB Cloud Lake 可以帮助你从以下常见操作错误中恢复:
- 意外删除数据库
- 意外删除表
- 错误的数据修改(UPDATE/DELETE 操作)
- 意外截断表
- 数据加载错误
- Schema Evolution 回滚(还原表结构变更)
- 已删除的列或约束
这些恢复能力由 TiDB Cloud Lake 的 FUSE 引擎提供支持。该引擎采用类似 Git 的存储设计,可维护数据在不同时间点的快照。
恢复场景与解决方案
场景:意外删除数据库
如果你意外删除了数据库,可以使用 UNDROP DATABASE 命令将其恢复:
确认已删除的数据库:
SHOW DROP DATABASES LIKE '%sales_data%';恢复已删除的数据库:
UNDROP DATABASE sales_data;验证数据库是否已恢复:
SHOW DATABASES;恢复所有权(如有需要):
GRANT OWNERSHIP on sales_data.* to ROLE <role_name>;
更多详情,请参见 UNDROP DATABASE 和 SHOW DROP DATABASES。
场景:意外删除表
如果你意外删除了表,可以使用 UNDROP TABLE 命令将其恢复:
确认已删除的表:
SHOW DROP TABLES LIKE '%order%';恢复已删除的表:
UNDROP TABLE sales_data.orders;验证表是否已恢复:
SHOW TABLES FROM sales_data;恢复所有权(如有需要):
GRANT OWNERSHIP on sales_data.orders to ROLE <role_name>;
更多详情,请参见 UNDROP TABLE 和 SHOW DROP TABLES。
场景:错误的数据修改或删除
如果你意外修改或删除了表中的数据,可以使用 FLASHBACK TABLE 命令将其恢复到之前的状态:
找出错误操作发生前的快照 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将表恢复到之前的状态:
-- Using snapshot ID ALTER TABLE sales_data.orders FLASHBACK TO (SNAPSHOT => 'c5c538d6b8bc42f483eefbddd000af7d'); -- Or using timestamp ALTER TABLE sales_data.orders FLASHBACK TO (TIMESTAMP => '2023-04-19 04:20:25.062854'::TIMESTAMP);验证数据是否已恢复:
SELECT * FROM sales_data.orders LIMIT 3;
更多详情,请参见 FLASHBACK TABLE。
场景:Schema Evolution 回滚
如果你对表结构进行了不需要的更改,可以回退到之前的 schema:
创建表并添加一些数据:
CREATE OR REPLACE TABLE customers (id INT, name VARCHAR, email VARCHAR); INSERT INTO customers VALUES (1, 'John', 'john@example.com');进行 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 │ │ └─────────┴─────────┴──────┴─────────┴─────────┘查找 schema 更改之前的 snapshot 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回退到之前的 schema(使用较早的 snapshot):
ALTER TABLE customers FLASHBACK TO (SNAPSHOT => '01963ce9cc29735b87886a08d3ca7e2f');验证 schema 已恢复:
DESC customers;输出:
┌─────────┬─────────┬──────┬─────────┬─────────┐ │ Field │ Type │ Null │ Default │ Extra │ ├─────────┼─────────┼──────┼─────────┼─────────┤ │ id │ INT │ YES │ NULL │ │ │ name │ VARCHAR │ YES │ NULL │ │ │ email │ VARCHAR │ YES │ NULL │ │ └─────────┴─────────┴──────┴─────────┴─────────┘
重要注意事项和限制
- 时间限制:恢复仅在保留时间内有效(默认:24 小时)。
- 名称冲突:如果已存在同名对象,则无法执行 undrop——请先重命名数据库或重命名表。
- 所有权:所有权不会自动恢复,需要在恢复后手动授予。
- 临时表:Flashback 不适用于 transient tables(不会存储快照)。
紧急情况:遇到严重数据丢失?请立即联系 TiDB Cloud Lake Support 寻求帮助。