不论是使用 ClickHouse 还是其他数据库,如果手抖删掉了一个表,想要恢复是相当困难。但是现在 ClickHouse 支持了 UNDROP TABLE
能力,如果因为手抖误删了一个表,那在短时间内可以快速恢复。
目前 UNDROP TABLE
还是个实验性功能,如果想要体验可以使用最新 v23.3.1.2823-lts 分支。下面来体验一下整个功能。
创建测试表
目前只支持 Atomic 库引擎下的部分表引擎执行 UNDROP TABLE
,MergeTree
、ReplicatedMergeTree
、Distributed
、Log
等都是支持的,但是临时表是不支持使用 UNDROP TABLE
进行恢复的。这里可以在默认的 default 库引擎下创建一个 MergeTree 表引擎进行体验。建表语句如下:
create table test (id Int32) engine=MergeTree() order by id;
建表完毕后,写入一些测试数据,方便后续验证恢复后表是否正常,可以随意写几条:
insert into test values (1),(2),(3),(4),(5);
验证数据写入成功:
select * from test;
┌─id─┐
│ 1 │
│ 2 │
│ 3 │
│ 4 │
│ 5 │
└────┘
删除表
建表及写入数据完成后,执行删除表操作:
drop table test;
此时验证表被删除:
select * from test;
Code: 60. DB::Exception: Received from localhost:9000. DB::Exception: Table default.test doesn't exist. (UNKNOWN_TABLE)
此时,再查询该表会提示表不存在,证明删除成功。
新版本提供了 system.dropped_tables
系统表来查看被删除的表:
select * from system.dropped_tables\G
Row 1:
──────
index: 0
database: default
table: test
uuid: 87b7d1d6-f86d-485e-a254-79d9c58c7464
engine: MergeTree
metadata_dropped_path: /data/ClickHouse/build/programs/data/metadata_dropped/default.test.87b7d1d6-f86d-485e-a254-79d9c58c7464.sql
table_dropped_time: 2023-04-02 12:30:13
这个系统表是记录了已被删除,但是还未被清理数据的表,即表示可以被恢复的表。
恢复表
ClickHouse 在默认配置下,被删除的表在 8min 后才会开始清除任务,所以如果是手抖误删,就可以使用 UNDROP TABLE
进行恢复。
使用方法
1. UNDROP TABLE {test}
这种方式会找到最近被删除的 default.test 表,因为 ClickHouse 可以不断的创建删除同一个名字的表。
2. UNDROP TABLE {test} UUID {uuid}
如果不想恢复最近一次被删除的表,可以通过指定表 uuid 的方式来恢复,具体的 uuid 可以在 system.dropped_tables
系统表中查询到。
3. UNDROP TABLE {test} ON CLUSTER {cluster}
如果在删除表时使用的是 ON CLUSTER
语句,也不要紧,UNDROP TABLE
也支持 ON CLUSTER
。
恢复测试
目前 UNDROP TABLE
还是实验性功能,所以要把 allow_experimental_undrop_table_query
打开:
undrop table test settings allow_experimental_undrop_table_query=1
再查询验证一下,test 表已经被正常恢复了。
当 test 表被恢复后,还可以再次将 test 表删除,可以再使用指定 uuid 的方式来恢复:
undrop table test uuid '87b7d1d6-f86d-485e-a254-79d9c58c7464' settings allow_experimental_undrop_table_query=1
注意,这里的 uuid 是我系统表中查询到的,需要替换成自己真实 uuid 才可以。
如果表删除后超过了默认的 8min,就不能再恢复了,会有一下报错提示:
undrop table test settings allow_experimental_undrop_table_query=1
Code: 60. DB::Exception: Received from localhost:9000. DB::Exception: The drop task of table default.test is in progress, has been dropped or the database engine doesn't support it. (UNKNOWN_TABLE)
到此,UNDROP TABLE
就介绍完毕了,有兴趣体验一下吧。
欢迎添加微信:xiedeyantu,讨论技术问题。