[20250512]drop table的恢复3(包含lob类型字段)(补充).txt --//尝试drop table的恢复,发现脚本还可以做一些改进,既然通过bbed扫描的方式知道每块的行记录,这样可以减少扫描范围。 --//参考链接[20250512]drop table的恢复3(包含lob类型字段).txt 1.环境: SCOTT@book01p> @ ver2 ============================== PORT_STRING : x86_64/Linux 2.4.xx VERSION : 21.0.0.0.0 BANNER : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production BANNER_FULL : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production Version 21.3.0.0.0 BANNER_LEGACY : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production CON_ID : 0 PL/SQL procedure successfully completed. 2.恢复: --//前面的步骤略、 SCOTT@book01p> drop table scanblock purge ; Table dropped. SCOTT@book01p> create table scanblock ( file_id number,block_id number,rowsnum number ) tablespace TSP_AUDIT; Table created. --//建立新表增加字段rowsnum。 --//扫描数据文件确定数据段号。 $ . finddoid.sh 12 128 32640 128559 data_object_id 128559 max_row = 153 $ paste -d',' scan_128559.txt scan_row_128559.txt | head -4 12,171,151 12,172,151 12,173,151 12,174,153 $ paste -d',' scan_128559.txt scan_row_128559.txt | tail -10 12,24598,151 12,24599,151 12,24600,0 12,24601,0 12,24602,0 12,24603,0 12,24604,151 12,24605,32 12,24606,0 12,24607,0 --//有一些数据块根本不需要扫描。 $ paste -d',' scan_128559.txt scan_row_128559.txt | sed 's/^/insert into scanblock values (/;s/$/);/' | head -4 insert into scanblock values (12,171,151); insert into scanblock values (12,172,151); insert into scanblock values (12,173,151); insert into scanblock values (12,174,153); $ paste -d',' scan_128559.txt scan_row_128559.txt | sed 's/^/insert into scanblock values (/;s/$/);/' >| xz.txt --//执行xz.txt,并且提交。 SCOTT@book01p> truncate table bak_t5 ; Table truncated. SYS@book01p> set timing on SYS@book01p> @ txt/truncTz.txt SCOTT T5_DROP SCOTT BAK_T5 PL/SQL procedure successfully completed. Elapsed: 00:00:14.90 SYS@book01p> set timing off --//这样扫描比原来快了5秒。 SCOTT@book01p> select count(*) from bak_t5; COUNT(*) ---------- 10000 3.附上改进的脚本: DECLARE v_fno NUMBER; v_s_bno NUMBER; v_e_bno NUMBER; v_rowid ROWID; v_owner VARCHAR2 (100) := '&&1'; v_table VARCHAR2 (100) := '&&2'; v_o_owner VARCHAR2 (100) := '&&3'; v_o_table VARCHAR2 (100) := '&&4'; v_dataobj NUMBER; v_sql VARCHAR2 (4000); v_tablespace VARCHAR2 (100); nrows NUMBER; BEGIN nrows := 0; SELECT data_object_id INTO v_dataobj FROM dba_objects WHERE owner = v_owner AND object_name = v_table; SELECT tablespace_name INTO v_tablespace FROM dba_tables WHERE owner = v_owner AND table_name = v_table; -- FOR i -- IN (SELECT relative_fno, block_id, blocks FROM dba_extents WHERE owner = v_owner AND segment_name = v_table AND extent_id = 0 -- UNION ALL -- SELECT relative_fno, block_id, blocks FROM dba_free_space WHERE tablespace_name = v_tablespace -- UNION ALL -- SELECT relative_fno, block_id, blocks -- FROM (SELECT relative_fno -- ,block_id -- ,blocks -- ,ROW_NUMBER () OVER (PARTITION BY owner, segment_name, partition_name ORDER BY extent_id DESC) -- rn -- FROM dba_extents -- WHERE tablespace_name = v_tablespace AND extent_id > 0) -- WHERE rn = 1) -- for i in (select file_id relative_fno,block_id, 1 blocks from scott.scanblock) for i in (select file_id relative_fno,block_id, 1 blocks,rowsnum-1 rowsnum from scott.scanblock) LOOP v_fno := i.relative_fno; v_s_bno := i.block_id; v_e_bno := i.block_id + i.blocks - 1; FOR j IN v_s_bno .. v_e_bno LOOP BEGIN -- FOR x IN 0 .. &&5 FOR x IN 0 .. i.rowsnum LOOP v_rowid := DBMS_ROWID.rowid_create ( 1 ,v_dataobj ,v_fno ,j ,x); v_sql := 'insert into ' || v_o_owner || '.' || v_o_table || ' select * from ' || v_owner || '.' || v_table || ' where rowid=:1'; EXECUTE IMMEDIATE v_sql USING v_rowid; IF SQL%ROWCOUNT = 1 THEN nrows := nrows + 1; END IF; IF (MOD (nrows, 10000) = 0) THEN COMMIT; END IF; END LOOP; EXCEPTION WHEN OTHERS THEN NULL; END; COMMIT; END LOOP; END LOOP; END; /
[20250512]drop table的恢复3(包含lob类型字段)(补充).txt
来源:这里教程网
时间:2026-03-03 21:57:02
作者:
编辑推荐:
- [20250512]drop table的恢复3(包含lob类型字段)(补充).txt03-03
- [20250513]建立完善finddoid.sh脚本3.txt03-03
- 评测揭秘!同一份外卖,拼好饭为什么更有性价比?03-03
- [20250513]bbed读取数据块8 fffext.sh.txt03-03
- [20250509]建立完善hidez.sql脚本.txt03-03
- [20250514]21c使用dbms_metadata.get_ddl参看临时表定义问题(整理).txt03-03
- 大表归档,要注意哪些坑?稍有不慎造成业务宕机!03-03
- 京东敢烧钱做外卖,原来是因为电商赚麻了03-03
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 评测揭秘!同一份外卖,拼好饭为什么更有性价比?
评测揭秘!同一份外卖,拼好饭为什么更有性价比?
26-03-03 - 京东敢烧钱做外卖,原来是因为电商赚麻了
京东敢烧钱做外卖,原来是因为电商赚麻了
26-03-03 - 深入浅出 Rust 并发:RwLock 与 Mutex 在 Tauri 项目中的实践
- 创新靶点与双机制策略崛起,AACR揭幕ADC治疗新纪元
创新靶点与双机制策略崛起,AACR揭幕ADC治疗新纪元
26-03-03 - Robotaxi新消息密集释放,量产元年来临谁在领跑?
Robotaxi新消息密集释放,量产元年来临谁在领跑?
26-03-03 - Oracle集群+ACFS竟让OGG故障率归零,太不可思议了!
Oracle集群+ACFS竟让OGG故障率归零,太不可思议了!
26-03-03 - 刘强东上街送外卖,美团王兴还睡得着吗?
刘强东上街送外卖,美团王兴还睡得着吗?
26-03-03 - 【KWDB 创作者计划】_KWDB引领数据库技术革新的璀璨之星
【KWDB 创作者计划】_KWDB引领数据库技术革新的璀璨之星
26-03-03 - 全娱乐生态驱动增长,从财报看阿里影业穿越周期的发展韧性
全娱乐生态驱动增长,从财报看阿里影业穿越周期的发展韧性
26-03-03 - 被问能不能不还钱,周鸿祎称360借条“不是我公司”!真相来了
被问能不能不还钱,周鸿祎称360借条“不是我公司”!真相来了
26-03-03
