drop table 合并后还可以用obadmin从sstable中dump出数据

【 使用环境 】测试环境
【 OB or 其他组件 】OB
【 使用版本 】OceanBase_CE 4.3.1.0
【问题描述】
drop table 合并后还可以从sstable中dump出数据,这是为什么?
ob_admin dumpsst -f /home/admin/observer/store/ -d macro_block -a 320 -t 200001 -q

【复现路径】
步骤1: 创建表,并插入数据。
create table t1(id int,col1 varchar(10));
insert into t1 values(1,‘test data’);
commit;

步骤2: 获取表的 tablet_id、macro_id,并用 ob_admin dump 出 sstable 中的数据
1.先获取表的TABLET_ID
select DATABASE_NAME,TABLE_NAME,TABLET_ID from CDB_OB_TABLE_LOCATIONS where table_name=‘t1’ and DATABASE_NAME=‘test’ and tenant_id=1002;

2.触发一次合并,使数据落盘
alter system major freeze tenant=‘my_tenant’;
SELECT * FROM oceanbase.CDB_OB_ZONE_MAJOR_COMPACTION;

3.获得表的MACRO_ID
select TABLET_ID,MACRO_ID_LIST from GV$OB_TABLET_COMPACTION_HISTORY where TABLET_ID=200001 and TYPE=‘MAJOR_MERGE’ order by START_TIME ;

4.使用 ob_admin dump出磁盘中的数据
cd /home/admin/observer
export OB_ADMIN_LOG_DIR=/tmp
ob_admin dumpsst -f /home/admin/observer/store/ -d macro_block -a 320 -t 200001 -q

步骤3:删除表,并dump相同位置的数据
drop table t1;
purge recyclebin;
alter system major freeze tenant=‘my_tenant’;
–确认合并完成后,并超过 undo_retention 时间
export OB_ADMIN_LOG_DIR=/tmp
ob_admin dumpsst -f /home/admin/observer/store/ -d macro_block -a 320 -t 200001 -q

稍等,这边联系下相关同学

dump是对数据块来说的,drop表后并没有新数据覆盖数据块所以就还可以dump数据

可以这么理解吗?sstable 是调用 fallocate() 预分配的,写入数据后,再删除数据,合并时会重新向宏块中写入排序去重后的数据,合并过程如果没有向被删除的表占用的宏块写入数据,是由文件系统来更新元数据并标记相应的数据块为可用,但数据本身不会立即被擦除。后续写入数据,合并时可以写到这些标记为可用的数据块。 其实这和普通的删除文件操作一样,也是由文件系统来更新元数据并标记相应的数据块为可用,并不回立刻擦除数据

1 个赞

大概是这个意思,但ob数据都是自己管理的

感谢答疑 :grinning: