[Oracle] 解析在没有备份的情况下undo损坏怎么办

前端技术 2023/09/07 Oracle

如果Oracle在运行中很不幸遇到undo损坏,当然最好的方法是完全恢复,不过如果没有备份,可以采用一种非常规的手段(利用Oracle的隐藏参数),如果此时undo包含未提交的事务,会造成一点点的数据丢失(一般都是可忍受的),如果没有未提交的事务,则不会有数据丢失。其主要步骤有:

1. 修改undo表空间管理为手动;
2. 设置隐藏参数(_offline_rollback_segments或_corrupted_rollback_segments)标识受影响的回滚段,使Oracle忽略其上的未提交事务;
3. 手动删除受影响的回滚段和undo表空间,然后重建新的undo表空间;
4. 还原undo表空间管理为自动。

实验如下:
Step 1.
如果undo数据文件损坏,数据库只能到mount状态,open时会出现以下错误:
ORA-01157: cannot identify/lock data file 14 - see DBWR trace file
ORA-01110: data file 14: \'I:\\INTEL_DATA\\O06DMS0\\UNDO1.O06DMS0\'
说明该undo文件已经损坏或丢失,把该文件offline之后就可以打开数据库了:
SQL> alter database datafile \'I:\\INTEL_DATA\\O06DMS0\\UNDO1.O06DMS0\' offline drop;
SQL> alter database open;
打开数据库的目的是为了找出受影响的回滚段:
SQL> select segment_name,status from dba_rollback_segs;

SEGMENT_NAME                   STATUS
------------------------------ ----------------
SYSTEM                         ONLINE
_SYSSMU10_1201331463$          OFFLINE
_SYSSMU9_2926456744$           OFFLINE
_SYSSMU8_640224757$            OFFLINE
_SYSSMU7_3984293596$           OFFLINE
_SYSSMU6_3694658906$           OFFLINE
_SYSSMU5_3475919656$           OFFLINE
_SYSSMU4_168502732$            OFFLINE
_SYSSMU3_1987193959$           OFFLINE
_SYSSMU2_3908286755$           OFFLINE
_SYSSMU1_3281912951$           OFFLINE

SQL> show parameter undo

NAME                                 TYPE        VALUE
------------------------------------ ----------- -------------
undo_management                      string      AUTO
undo_retention                       integer     900
undo_tablespace                      string      undo1
关闭数据库:
SQL> shutdown immediate;

Step 2.
创建一个临时的pfile:
SQL> create pfile=\'H:\\initO06DMS0.ora\' from spfile;
修改pfile如下:
*.undo_management=\'manual\'   -- undo表空间管理方式修改为手动
*.undo_tablespace=\'undo2\'     --指定一个新的undo表空间
*._offline_rollback_segments=(\'_SYSSMU10_1201331463$\',\'_SYSSMU9_2926456744$\',\'_SYSSMU8_640224757$\',\'_SYSSMU7_3984293596$\',\'_SYSSMU6_3694658906$\',\'_SYSSMU5_3475919656$\',\'_SYSSMU4_168502732$\',\'_SYSSMU3_1987193959$\',\'_SYSSMU2_3908286755$\',\'_SYSSMU1_3281912951$\')  --把所有受影响的回滚段都列在这里
并以改pfile重新启动数据库:
SQL> startup pfile=\'H:\\initO06DMS0.ora\'

Step 3.
手动删除受影响的回滚段:
SQL>drop rollback segment \"_SYSSMU10_1201331463$\";
SQL>drop rollback segment \"_SYSSMU9_2926456744$\";
SQL>drop rollback segment \"_SYSSMU8_640224757$\";
SQL>drop rollback segment \"_SYSSMU7_3984293596$\";
SQL>drop rollback segment \"_SYSSMU6_3694658906$\";
SQL>drop rollback segment \"_SYSSMU5_3475919656$\";
SQL>drop rollback segment \"_SYSSMU4_168502732$\";
SQL>drop rollback segment \"_SYSSMU3_1987193959$\";
SQL>drop rollback segment \"_SYSSMU2_3908286755$\";
SQL>drop rollback segment \"_SYSSMU1_3281912951$\";
手动删除旧的undo表空间:
SQL> drop tablespace undo1 including contents;
重建新的undo表空间:
SQL> create undo tablespace undo2 datafile \'I:\\INTEL_DATA\\O06DMS0\\UNDO2.O06DMS0\' size 100m;
创建新的spfile,覆盖旧的spfile:
SQL> create spfile from pfile=\'H:\\initO06DMS0.ora\';
关闭数据库:
SQL> shutdown immediate;

Step 4.
以原来的spfile启动数据库:
SQL> startup;
还原undo表空间管理为自动:
SQL> alter system set undo_management=\'auto\' scope=spfile;
取消隐藏参数的设置:
SQL> alter system reset \"_offline_rollback_segments\" scope=spfile;
重启使其生效:
SQL> shutdown immediate;
SQL> startup
SQL> show parameter undo

NAME                                 TYPE        VALUE
------------------------------------ ----------- -------------------
undo_management                      string      AUTO
undo_retention                       integer     900
undo_tablespace                      string      undo2

最终检查一下:
SQL> select segment_name,status from dba_rollback_segs;

SEGMENT_NAME                   STATUS
------------------------------ ----------------
SYSTEM                         ONLINE
_SYSSMU40_1968985325$          ONLINE
_SYSSMU39_4040503138$          ONLINE
_SYSSMU38_4059847715$          ONLINE
_SYSSMU37_2692202156$          ONLINE
_SYSSMU36_2617425201$          ONLINE
_SYSSMU35_1133967719$          ONLINE
_SYSSMU34_1916939664$          ONLINE
_SYSSMU33_99444166$            ONLINE
_SYSSMU32_162619813$           ONLINE
_SYSSMU31_830375278$           ONLINE

本文地址:https://www.stayed.cn/item/18561

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。