暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

undo 恢复场景四之数据库abort后undo 部分坏损坏处理办法

原创 四九年入国军 2025-06-05
78

--session 1:
sqlplus scott/oracle
drop table t1;
create table t1 (id int);
insert into t1 select object_id from dba_objects where rownum <=1000;
commit;
insert into t1 select object_id from dba_objects where rownum <=1000;
--此时t1 里面有2000条数据,其中1000条未提交

--查看活动回话对应的undo地址,损坏掉
set linesize  1000
col username for a20
SELECT s.sid, s.serial#, s.username, 
       r.name AS rollback_segment,
       t.used_ublk, t.used_urec
FROM v$session s, v$transaction t, v$rollname r
WHERE s.saddr = t.ses_addr
AND t.xidusn = r.usn;

       SID    SERIAL# USERNAME             ROLLBACK_SEGMENT                USED_UBLK  USED_UREC
---------- ---------- -------------------- ------------------------------ ---------- ----------
       498      50601 SCOTT                _SYSSMU10_930580995$                    1          6
	   
	   
	   
	   
SQL> select EXTENT_ID,FILE_ID,BLOCK_ID,BLOCKS from dba_extents where segment_name='_SYSSMU10_930580995$';

 EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS
---------- ---------- ---------- ----------
         0          4        272          8
         1          4        288          8
         2          4        896        128

--session 2:故意破坏 4,272 block
copy file 4 block 273 to file 4 block 272
sum apply

--强制重启库
--session 3:
sqlplus / as SYSDBA
startup force


Total System Global Area 4680840344 bytes
Fixed Size                  8905880 bytes
Variable Size             872415232 bytes
Database Buffers         3791650816 bytes
Redo Buffers                7868416 bytes
Database mounted.
ORA-00603: ORACLE server session terminated by fatal error
ORA-01092: ORACLE instance terminated. Disconnection forced
ORA-00704: bootstrap process failure
ORA-00604: error occurred at recursive SQL level 1
ORA-01578: ORACLE data block corrupted (file # 4, block # 272)
ORA-01110: data file 4: '/oradata/ORCL/undotbs01.dbf'
Process ID: 99682
Session ID: 498 Serial number: 16206


--屏蔽掉问题回滚掉就行
alter system set "_offline_rollback_segments"='_SYSSMU1_1261223759$' scope=spfile;

--如果定位不到问题回滚段只能当undo丢失处理:
alter  database  datafile 4 offline  drop;

alter database open;

set linesize  1000
SELECT SEGMENT_NAME, OWNER, TABLESPACE_NAME, STATUS FROM DBA_ROLLBACK_SEGS;


SEGMENT_NAME                   OWNER  TABLESPACE_NAME                STATUS
------------------------------ ------ ------------------------------ ----------------
SYSTEM                         SYS    SYSTEM                         ONLINE
_SYSSMU1_1261223759$           PUBLIC UNDOTBS1                       NEEDS RECOVERY
_SYSSMU2_27624015$             PUBLIC UNDOTBS1                       ONLINE
_SYSSMU3_2421748942$           PUBLIC UNDOTBS1                       ONLINE
_SYSSMU4_625702278$            PUBLIC UNDOTBS1                       ONLINE
_SYSSMU5_2101348960$           PUBLIC UNDOTBS1                       ONLINE
_SYSSMU6_813816332$            PUBLIC UNDOTBS1                       ONLINE
_SYSSMU7_2329891355$           PUBLIC UNDOTBS1                       ONLINE
_SYSSMU8_399776867$            PUBLIC UNDOTBS1                       ONLINE
_SYSSMU9_1692468413$           PUBLIC UNDOTBS1                       ONLINE
_SYSSMU10_930580995$           PUBLIC UNDOTBS1                       ONLINE


oradebug setmypid
oradebug event 10046 trace name context forever,level 12;
oradebug tracefile_name
alter database open;



--删除有问题的回滚段
drop rollback segment "_SYSSMU1_1261223759$";

alter system set "_offline_rollback_segments"='' scope=spfile;
shutdown immediate;
startup;
SQL> select count(1) from scott.t1;

  COUNT(1)
----------
      2000

--由于回滚段损坏,之前未提交的数据没回滚调



--屏蔽所有回滚段
--末尾记得加$
dd if=/oradata/ORCL//system01.dbf of=dd.undo bs=8192 skip=224 count=10
strings dd.undo| grep _SYSSMU | cut -d $ -f 1 | sort -u





「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论