OceanBase中支持闪回Truncate表吗?(v3 VS v4)
Oracle DBA都知道Oracle的回收站功能可以做drop table后的flashback操作,之前在网上我也做过这方面的分享<Know more about ORACLE’S RECYCLEBIN>,目前部分国产数据库在回收站功能上做了flashback truncate table的支持,像GaussDB (ustore), GoldenDB, Oceanbase同样也支持回收站的功能,今天看到一篇文档, 是有人问Oceanbase支持truncate吗?利用deepseek回答的,答案也对,也不对,只是不够严谨,这可能也是目前国产数据库在快速迭代期的现状,相对oracle,在国产库上大部分DBA实战经验不足,或因资源没有环境,导致多是文档类专家,这也就和deepseek类大模型一样,很容易产生错误的后果。
这是我在GaussDB的测试 体验一下GaussDB集中式(本地部署)的Flashback/TIMECAPSULE 闪回功能
先看AI回答
Deepseek公网
Deepseek带深度思考
某私域数据库AI
下面我在Oceanbase V4.2 动手测试一下
1,测试drop table
2,测试truncate table
[root@anbob.com ~]# obclient -h192.168.56.100 -P2883 -usys@ob_ora Welcome to the OceanBase. Commands end with ; or \g. Your OceanBase connection id is 11 Server version: OceanBase 4.2.1.2 (r102010012023120119-130bf91ba413a00bb696fe8853906fde1f29f83d) (Built Dec 1 2023 20:00:25) Copyright (c) 2000, 2018, OceanBase and/or its affiliates. All rights reserved. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. obclient [SYS]> select sysdate from dual; +-----------+ | SYSDATE | +-----------+ | 07-APR-25 | +-----------+ 1 row in set (0.049 sec) obclient [SYS]> SHOW VARIABLES LIKE 'recyclebin'; +---------------+-------+ | VARIABLE_NAME | VALUE | +---------------+-------+ | recyclebin | OFF | +---------------+-------+ 1 row in set (0.193 sec) obclient [SYS]> SET recyclebin = on; --- set [Global] recyclebin = xx 回收站开关 Query OK, 0 rows affected (0.188 sec) obclient [SYS]> SHOW VARIABLES LIKE 'recyclebin'; +---------------+-------+ | VARIABLE_NAME | VALUE | +---------------+-------+ | recyclebin | ON | +---------------+-------+ 1 row in set (0.034 sec) obclient [SYS]> create table test_drop (id int); Query OK, 0 rows affected (12.081 sec) obclient [SYS]> SHOW RECYCLEBIN; Empty set (0.051 sec) obclient [SYS]> create index idx_test_drop_id on test_drop(id); Query OK, 0 rows affected (37.705 sec) obclient [SYS]> insert into test_drop values(1); Query OK, 1 row affected (1.285 sec) obclient [SYS]> commit; Query OK, 0 rows affected (0.921 sec) obclient [SYS]> SHOW VARIABLES LIKE 'recyclebin'; +---------------+-------+ | VARIABLE_NAME | VALUE | +---------------+-------+ | recyclebin | ON | +---------------+-------+ 1 row in set (0.066 sec) obclient [SYS]> show recyclebin; Empty set (0.178 sec) ## 测试drop obclient [SYS]> drop table test_drop; Query OK, 0 rows affected (4.124 sec) obclient [SYS]> show recyclebin; +------------------------------+-------------------------------+-------+------------------------------+ | OBJECT_NAME | ORIGINAL_NAME | TYPE | CREATETIME | +------------------------------+-------------------------------+-------+------------------------------+ | RECYCLE_$_1_1744018087127440 | __idx_500014_IDX_TEST_DROP_ID | INDEX | 07-APR-25 05.28.07.531431 PM | | RECYCLE_$_1_1744018088617104 | TEST_DROP | TABLE | 07-APR-25 05.28.08.582432 PM | +------------------------------+-------------------------------+-------+------------------------------+ 2 rows in set (0.062 sec) obclient [SYS]> select * from TEST_DROP; ORA-00942: table or view 'SYS.TEST_DROP' does not exist obclient [SYS]> flashback table TEST_DROP to before drop; Query OK, 0 rows affected (1.431 sec) obclient [SYS]> select * from TEST_DROP; +------+ | ID | +------+ | 1 | +------+ 1 row in set (0.156 sec) obclient [SYS]> show recyclebin; Empty set (0.221 sec) obclient [SYS]> select INDEX_NAME from dba_indexes where TABLE_NAME='TEST_DROP'; +--------------------------------+ | INDEX_NAME | +--------------------------------+ | RECYCLE_OBIDX_1744018222289605 | +--------------------------------+ 1 row in set (0.632 sec) obclient [SYS]> SELECT i.index_name, i.index_type, i.uniqueness, -> c.column_name, c.column_position -> FROM user_indexes i -> JOIN user_ind_columns c ON i.index_name = c.index_name -> WHERE i.table_name = 'TEST_DROP'; +--------------------------------+------------+------------+-------------+-----------------+ | INDEX_NAME | INDEX_TYPE | UNIQUENESS | COLUMN_NAME | COLUMN_POSITION | +--------------------------------+------------+------------+-------------+-----------------+ | RECYCLE_OBIDX_1744018222289605 | NORMAL | NONUNIQUE | ID | 1 | +--------------------------------+------------+------------+-------------+-----------------+ 1 row in set (4.406 sec) ## 测试truncate obclient [SYS]> show variables like 'ob_enable_truncate_flashback'; +------------------------------+-------+ | VARIABLE_NAME | VALUE | +------------------------------+-------+ | ob_enable_truncate_flashback | OFF | +------------------------------+-------+ 1 row in set (0.352 sec) obclient [SYS]> set ob_enable_truncate_flashback = on; Query OK, 0 rows affected (0.147 sec) obclient [SYS]> show variables like 'ob_enable_truncate_flashback'; +------------------------------+-------+ | VARIABLE_NAME | VALUE | +------------------------------+-------+ | ob_enable_truncate_flashback | ON | +------------------------------+-------+ 1 row in set (0.115 sec) obclient [SYS]> truncate table TEST_DROP; Query OK, 0 rows affected (4.676 sec) obclient [SYS]> show recyclebin; Empty set (0.121 sec) obclient [SYS]> show variables like 'ob_enable_truncate_flashback'; +------------------------------+-------+ | VARIABLE_NAME | VALUE | +------------------------------+-------+ | ob_enable_truncate_flashback | ON | +------------------------------+-------+ 1 row in set (0.149 sec) obclient [SYS]> select * from v$version; +---------------------------------------------------------------------------------------------------------------+--------+ | BANNER | CON_ID | +---------------------------------------------------------------------------------------------------------------+--------+ | OceanBase 4.2.1.2 (r102010012023120119-130bf91ba413a00bb696fe8853906fde1f29f83d) (Built Dec 1 2023 20:00:25) | 0 | +---------------------------------------------------------------------------------------------------------------+--------+ 1 row in set (0.261 sec)
可见DROP TABLE可以进回收站,但是truncate table没有, 去官方看一下参数的解释。
官方文档OB v4版本ob_enable_truncate_flashback参数章节
ob_enable_truncate_flashback
用于设置是否启用表截断的闪回。
“该变量已不再使用。在 V4.x 版本中,执行 TRUNCATE TABLE 操作不再支持进入回收站。尽管在 V4.x 版本中,该变量仍可查询和设置,但相关功能并不会生效。”
那直接说结论,truncate table 在回收站打开,并且ob_enable_truncate_flashback打开时,在v3版本是可以进回收站的,但是在V4 版本中不再支持。 哪为什么不支持了呢?因为机制发生了改变。
在官方博客上有一篇博主写的比较详细,建议阅读<浅析 OceanBase 4.x 版本的 truncate table 为什么不进回收站了?>,意思是在Oceanbase v4之前版本, truncate table 使用的是 drop table + create table, 而drop table是进__recyclebin的内部库改名, 所以之前truncate 复用了drop的功能,OceanBase 在 4.x 版本新增加了一个 tablet 的概念,如同oracle中的segment与tables的关系. 这一引入,解决的是当有大量业务对象truncate时,在表及所有附属对象元信息在truncate 的re-create时的开销. 直接换成了类似Oracle 的segment操作和修改data_object_id的内部操作.
— over —
上一篇:
目前这篇文章还没有评论(Rss)