标签云
asm 恢复 asm恢复 bbed bootstrap$ dul In Memory kcbzib_kcrsds_1 kccpb_sanity_check_2 kfed MySQL恢复 ORA-00312 ORA-00607 ORA-00704 ORA-01110 ORA-01555 ORA-01578 ORA-08103 ORA-600 2662 ORA-600 2663 ORA-600 3020 ORA-600 4000 ORA-600 4137 ORA-600 4193 ORA-600 4194 ORA-600 16703 ORA-600 kcbzib_kcrsds_1 ORA-600 KCLCHKBLK_4 ORA-15042 ORA-15196 ORACLE 12C oracle dul ORACLE PATCH Oracle Recovery Tools oracle加密恢复 oracle勒索 oracle勒索恢复 oracle异常恢复 ORACLE恢复 Oracle 恢复 ORACLE数据库恢复 oracle 比特币 OSD-04016 YOUR FILES ARE ENCRYPTED 勒索恢复 比特币加密文章分类
- Others (2)
- 中间件 (2)
- WebLogic (2)
- 操作系统 (100)
- 数据库 (1,597)
- DB2 (22)
- MySQL (70)
- Oracle (1,463)
- Data Guard (49)
- EXADATA (7)
- GoldenGate (21)
- ORA-xxxxx (158)
- ORACLE 12C (72)
- ORACLE 18C (6)
- ORACLE 19C (13)
- ORACLE 21C (3)
- Oracle ASM (65)
- Oracle Bug (7)
- Oracle RAC (47)
- Oracle 安全 (6)
- Oracle 开发 (27)
- Oracle 监听 (27)
- Oracle备份恢复 (530)
- Oracle安装升级 (84)
- Oracle性能优化 (62)
- 专题索引 (5)
- 勒索恢复 (75)
- PostgreSQL (17)
- PostgreSQL恢复 (5)
- SQL Server (27)
- SQL Server恢复 (8)
- TimesTen (7)
- 达梦数据库 (2)
- 生活娱乐 (2)
- 至理名言 (11)
- 虚拟化 (2)
- VMware (2)
- 软件开发 (36)
- Asp.Net (9)
- JavaScript (12)
- PHP (2)
- 小工具 (19)
-
最近发表
- Oracle 19c/21c最新patch信息-202404
- PostgreSQL恢复系列:pg_filedump批量处理
- PostgreSQL部分主要字典信息
- PostgreSQL恢复系列:pg_filedump恢复字典构造
- PostgreSQL 16 源码安装
- ORA-00742 ORA-00312 恢复
- 数据库open成功后报ORA-00353 ORA-00354错误引起的一系列问题(本质ntfs文件系统异常)
- ORA-600 ktsiseginfo1故障
- ORA-00600: internal error code, arguments: [16703], [1403], [4] 原因
- 最近遇到几起ORA-600 16703故障(tab$被清空),请引起重视
- ORA-600 2662快速恢复之Patch scn工具
- TNS-12518: TNS:listener could not hand off client connection
- ora.storage无法启动报ORA-12514故障处理
- 断电引起文件scn异常数据库恢复
- ORA-16188: LOG_ARCHIVE_CONFIG settings inconsistent with previously started instance
- .[hudsonL@cock.li].mkp勒索加密数据库完美恢复
- 模拟带库实现rman远程备份
- 又一例:ORA-600 kclchkblk_4和2662故障
- Oracle误删除数据文件恢复
- Oracle 19C 备库DML重定向—DML Redirection
月归档:九月 2012
使用plsql抢救数据
“在oracle出现ORA-8103/ORA-1578/ORA-376″等情况下抢救数据的争论没有停止过,很多人想到的是使用bbed,dul等工具来抢救,其实在很多时候我们使用pl/sql也可以完美的抢救数据.在这里我们通过模拟ORA-8103错误,然后使用plsql来找回数据.这中处理方法相对于bbed风险小,但是缺点是如果数据量大处理时间可能比较长,可能比dul有的一比,但是dul的工具不是任何人都有的.所以整体来说,在大部分情况下,这种方法处理某个数据块错误,抢救某个对象数据,还是很好的方法.
1.有非空列index情况
--创建测试表 SQL> create table xifenfei 2 as 3 select * from dba_objects; Table created. --修改某个项为非空值 SQL> alter table xifenfei modify object_id not null; Table altered. --创建一个唯一index SQL> create unique index ind_xifenfei on xifenfei(object_id); Index created. --表总记录 SQL> select count(*) from xifenfei; COUNT(*) ---------- 50088 --extent的分布情况 SQL> set pages 100 SQL> select file_id,block_id,block_id+blocks-1 2 from dba_extents 3 where segment_name ='XIFENFEI' AND owner='CHF'; FILE_ID BLOCK_ID BLOCK_ID+BLOCKS-1 ---------- ---------- ----------------- 9 1545 1552 9 1553 1560 9 1561 1568 9 1569 1576 9 1577 1584 9 1585 1592 9 1593 1600 9 1601 1608 9 1609 1616 9 1617 1624 9 1625 1632 9 1633 1640 9 1641 1648 9 1649 1656 9 1657 1664 9 1665 1672 9 1673 1800 9 1801 1928 9 1929 2056 9 2057 2184 9 2185 2312 21 rows selected. --2200数据块包含记录 SQL> select count(*) 2 from chf.xifenfei where dbms_rowid.rowid_block_number(rowid)=2200; COUNT(*) ---------- 69 --关闭数据库 SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. --破坏数据块 [oracle@xifenfei ~]$ dd if=/dev/zero of=/u01/oracle/oradata/XFF/users03.dbf bs=8192 count=1 seek=2200 conv=notrunc 1+0 records in 1+0 records out 8192 bytes (8.2 kB) copied, 0.000151554 seconds, 54.1 MB/s --启动数据库 SQL> startup ORACLE instance started. Total System Global Area 318767104 bytes Fixed Size 1267236 bytes Variable Size 104860124 bytes Database Buffers 205520896 bytes Redo Buffers 7118848 bytes Database mounted. Database opened. --查询结果 SQL> select /*+ full(xifenfei) */ count(*) from chf.xifenfei; select /*+ full(xifenfei) */ count(*) from chf.xifenfei * ERROR at line 1: ORA-08103: object no longer exists SQL> create table chf.xifenfei_new 2 as 3 select * from chf.xifenfei; select * from chf.xifenfei * ERROR at line 3: ORA-08103: object no longer exists --创建备份表 SQL> create table chf.xifenfei_new 2 as 3 select * from chf.xifenfei where 1=0; Table created. --创建坏块相关rowid记录表 SQL> create table chf.bad_rows (row_id rowid, oracle_error_code number); Table created. --执行plsql脚本 DECLARE TYPE RowIDTab IS TABLE OF ROWID INDEX BY BINARY_INTEGER; CURSOR c1 IS select /*+ index(xifenfei ind_xifenfei) */ rowid from chf.xifenfei where object_id is NOT NULL; r RowIDTab; rows NATURAL := 20000; bad_rows number := 0 ; errors number; error_code number; myrowid rowid; BEGIN OPEN c1; LOOP FETCH c1 BULK COLLECT INTO r LIMIT rows; EXIT WHEN r.count=0; BEGIN FORALL i IN r.FIRST..r.LAST SAVE EXCEPTIONS insert into chf.xifenfei_new select /*+ ROWID(A) */ * from chf.xifenfei A where rowid = r(i); EXCEPTION when OTHERS then BEGIN errors := SQL%BULK_EXCEPTIONS.COUNT; FOR err1 IN 1..errors LOOP error_code := SQL%BULK_EXCEPTIONS(err1).ERROR_CODE; if error_code in (1410, 8103) then myrowid := r(SQL%BULK_EXCEPTIONS(err1).ERROR_INDEX); bad_rows := bad_rows + 1; insert into chf.bad_rows values(myrowid, error_code); else raise; end if; END LOOP; END; END; commit; END LOOP; commit; CLOSE c1; dbms_output.put_line('Total Bad Rows: '||bad_rows); END; / --查询错误记录 SQL> select count(*) from chf.bad_rows ; COUNT(*) ---------- 69 SQL> select * from chf.bad_rows where rownum<10; ROW_ID ORACLE_ERROR_CODE ------------------ ----------------- AAAMugAAJAAAAiYAAA 8103 AAAMugAAJAAAAiYAAB 8103 AAAMugAAJAAAAiYAAC 8103 AAAMugAAJAAAAiYAAD 8103 AAAMugAAJAAAAiYAAE 8103 AAAMugAAJAAAAiYAAF 8103 AAAMugAAJAAAAiYAAG 8103 AAAMugAAJAAAAiYAAH 8103 AAAMugAAJAAAAiYAAI 8103 9 rows selected. --查询备份表记录 SQL> select count(*) from chf.xifenfei_new; COUNT(*) ---------- 50019 50088-50019=69和被破坏块中记录一致,证明所有好块中记录全部被找回来
2.无非空列index情况
--创建表 SQL> CONN CHF/XIFENFEI Connected. SQL> create table t_xifenfei 2 as 3 select * from dba_objects; Table created. --表中记录总数 SQL> select count(*) from t_xifenfei; COUNT(*) ---------- 50086 --extent分布 SQL> SET PAGES 100 SQL> select file_id,block_id,block_id+blocks-1 2 from dba_extents 3 where segment_name ='T_XIFENFEI' AND owner='CHF'; FILE_ID BLOCK_ID BLOCK_ID+BLOCKS-1 ---------- ---------- ----------------- 9 9 16 9 17 24 9 25 32 9 33 40 9 41 48 9 49 56 9 57 64 9 65 72 9 73 80 9 81 88 9 89 96 9 97 104 9 105 112 9 113 120 9 121 128 9 129 136 9 137 264 9 265 392 9 393 520 9 521 648 9 649 776 21 rows selected. --700数据块中记录数 SQL> select count(*) 2 from chf.t_xifenfei where dbms_rowid.rowid_block_number(rowid)=700; COUNT(*) ---------- 73 --关闭数据库 SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. --破坏block 700的数据块 [oracle@xifenfei ~]$ dd if=/dev/zero of=/u01/oracle/oradata/XFF/users03.dbf bs=8192 count=1 seek=700 conv=notrunc 1+0 records in 1+0 records out 8192 bytes (8.2 kB) copied, 0.000156576 seconds, 52.3 MB/s --启动数据库 SQL> startup ORACLE instance started. Total System Global Area 318767104 bytes Fixed Size 1267236 bytes Variable Size 104860124 bytes Database Buffers 205520896 bytes Redo Buffers 7118848 bytes Database mounted. Database opened. --查询报错 SQL> select count(*) from chf.t_xifenfei; select count(*) from chf.t_xifenfei * ERROR at line 1: ORA-08103: object no longer exists --创建备份表 SQL> CREATE TABLE T_XIFENFEI_NEW 2 AS 3 SELECT * FROM T_XIFENFEI WHERE 1=0; --找回记录 set serveroutput on set concat off DECLARE nrows number; rid rowid; dobj number; ROWSPERBLOCK number; BEGIN ROWSPERBLOCK:=1000; --估算最大的一个块中记录条数 nrows:=0; select data_object_id into dobj from dba_objects where owner = 'CHF' and object_name = 'T_XIFENFEI' -- and subobject_name = '<table partition>' Add this condition if table is partitioned ; for i in (select relative_fno, block_id, block_id+blocks-1 totblocks from dba_extents where owner = 'CHF' and segment_name = 'T_XIFENFEI' -- and partition_name = '<table partition>' Add this condition if table is partitioned -- and file_id != <OFFLINED DATAFILE> This condition is only used if a datafile needs to be skipped due to ORA-376 (A) order by extent_id) loop for br in i.block_id..i.totblocks loop for j in 1..ROWSPERBLOCK loop begin rid := dbms_rowid.ROWID_CREATE(1,dobj,i.relative_fno, br , j-1); insert into CHF.T_XIFENFEI_NEW select /*+ ROWID(A) */ * from CHF.T_XIFENFEI A where rowid = rid; if sql%rowcount = 1 then nrows:=nrows+1; end if; if (mod(nrows,10000)=0) then commit; end if; exception when others then null; end; end loop; end loop; end loop; COMMIT; dbms_output.put_line('Total rows: '||to_char(nrows)); END; / --找回记录数 SQL> SELECT COUNT(*) FROM CHF.T_XIFENFEI_NEW; COUNT(*) ---------- 50013 50086-50013=73 证明非坏块中的数据都被完全寻找回来
参考:
ORA-8103 Troubleshooting, Diagnostic and Solution [ID 268302.1]
Extract rows from a CORRUPT table creating ROWID from DBA_EXTENTS [ID 422547.1]
发表在 Oracle备份恢复
2 条评论
《前世今生的轮回》—歌词改写—《专一爱》
转载朋友改写《前世今生的轮回》为《专一爱》的歌词
前世今生的轮回
=================================
第1章:相遇
——————————————
挥手之间,我就爱上了你
把这份爱牢牢的,放在心里
海誓山盟,的爱,也给了你
把你的样子留在了,脑海里
时间飞逝,爱的那么甜蜜
鱼和猫眯,从此也不再对立
感动上天,与你相偎相依
今生的相遇,不,会,轻,言,分离
第2章:相识
——————————————
前世的轮回,注定了爱你
奈何桥上等着你
梦婆的汤里,留下了回忆
下辈子你能否记的起
心中的秘密,注定是天意
就像牛郎和织女
好好的爱你,乞求天的旨意
我们这辈子要在一起
第3章:相谈
——————————————
一世的情缘,我拥有了你,
把这份甜蜜好好的,去珍,惜
沧海桑田,的爱带给了你,
把你的纯洁,留给了你自己
时间飞逝,爱的那么彻底
老鼠大米推了世俗,在,一起
感动上天,与你经历风雨
今生的相遇,不会,随便,放弃
第4章:相思
——————————————
爱你在心里,没人能代替
把你拥在我怀里
感受你的气息,体会你的爱意
真的真的不能没有你
想你在梦里,念你在心底
失去你,我不愿意
把你的甜蜜,抓在我的手里
会用一生好好的陪你
第5章:相知
——————————————
挥手之间,我们在了一起
彼此的分离有了,心的相聚
罗曼蒂克,式的爱情洗礼
把我们心真正,牵随,在一起
时间飞逝,爱的那么清晰
蜜蜂与蜂蜜,永远不会离弃
感动上天,死心塌地爱你
今生的相遇,注定了,我,爱,你
第6章:相别
——————————————
今世的轮回,爱了你无悔
下辈子还要相会
相思的美味,梦里的相对
来世要紧紧,的跟随
蝴蝶空中飞,述说的很美
感动了月老,的体会
来生的相会,红线来牵随
第7章:结局
————————
生生世世与你一起轮回
生生世世与你一起轮回
专一爱
======================================
第1章:相遇
——————————————
那天下午,我们不期而遇
听这个暖洋洋的,浪漫歌曲
点点滴滴,回忆,那么有趣
把这个午后打扮成,文艺剧
三生石上,刻着你的名字
千山过尽,有缘千里来相聚
红尘擦肩,有你无所畏惧
今生的相遇,你,是,我,的,伴侣
第2章:相识
——————————————
时间的左右,再次的相遇
沧海水边听一曲
巫山的云上,写下了一句
这辈子我要以身相许
难得有情郎,注定是伴侣
就像牛郎和织女
好好的爱你,送你春光和煦
月上了梢头相思屡屡
第3章:相谈
——————————————
风云的流转,白头不相离,
把这份甜蜜好好的,去继,续
惊世不凡,的情无需根据,
幸福里享受,化作相思一缕
日影如飞,带着太多情趣,
此情绵绵守候在你,人,生旅
花香满园,拥抱旷世细雨
风情的款款,他日,还再,相聚
第4章:相思
——————————————
微笑里感动,寄卿又一曲
不问曲终人散聚
感受你的气息,体会你的爱意
真的真的不能没有你
必经的路上,幸福和情趣
遍地是,情思缕缕
多年的以后,还要与你耳语
会用一生好好的陪你
第5章:相知
——————————————
这天下午,我们谈着嫁娶
彼此的心中有了,点点犹豫
习惯想念,你的字字句句
把甜蜜事刻在,这首,老歌曲
人约黄昏,声音那么犹豫
人情和情人,奇妙感觉些许
天长地久,死心塌地赢取
今生的相遇,全部是,你,步,履
第6章:相别
——————————————
相思无尽处,突然的离去
生活也变得无趣,
一世的光阴,何日再相聚
留下这片片,的思虑
朦胧的月光,低叹着情绪
守候着往日,的歌曲
往后的岁月,注定难继续
第7章:结局
——————————————
倦鸟回巢伴着衣衫褴褛
倦鸟回巢伴着衣衫褴褛