oracle

推荐列表 站点导航

当前位置:首页 > 数据库 > oracle >

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

来源:网络整理  作者:网络  发布时间:2020-12-11 17:02
Oracle在运行中很不幸遇到undo损坏,当然最好的方法是完全恢复,但如果是在没有备份的情况下undo损坏怎么办?以下就...
_SYSSMU31_830375278$           ONLINE

SQL>drop rollback segment "_SYSSMU6_3694658906$";
------------------------------------ ----------- -------------
SQL>drop rollback segment "_SYSSMU4_168502732$";
_SYSSMU39_4040503138$          ONLINE
取消隐藏参数的设置:

Step 4.
SYSTEM                         ONLINE

SQL>drop rollback segment "_SYSSMU1_3281912951$";
创建新的spfile,覆盖旧的spfile:
SQL> alter system reset "_offline_rollback_segments" scope=spfile;
打开数据库的目的是为了找出受影响的回滚段:
undo_retention                       integer     900
_SYSSMU33_99444166$            ONLINE
_SYSSMU38_4059847715$          ONLINE
ORA-01157: cannot identify/lock data file 14 - see DBWR trace file
SEGMENT_NAME                   STATUS

1. 修改undo表空间管理为手动;
_SYSSMU1_3281912951$           OFFLINE

_SYSSMU9_2926456744$           OFFLINE
SQL> drop tablespace undo1 including contents;
*.undo_tablespace='undo2'     --指定一个新的undo表空间
SQL> create pfile='H:\initO06DMS0.ora' from spfile;
2. 设置隐藏参数(_offline_rollback_segments或_corrupted_rollback_segments)标识受影响的回滚段,使Oracle忽略其上的未提交事务;
undo_management                      string      AUTO
ORA-01110: data file 14: 'I:\INTEL_DATA\O06DMS0\UNDO1.O06DMS0'
SQL> startup
SQL> startup pfile='H:\initO06DMS0.ora'

Step 1.
以原来的spfile启动数据库:
------------------------------ ----------------
SQL> startup;
SQL> alter database datafile 'I:\INTEL_DATA\O06DMS0\UNDO1.O06DMS0' offline drop;
SYSTEM                         ONLINE

SEGMENT_NAME                   STATUS

最终检查一下:
undo_retention                       integer     900

SQL> show parameter undo

_SYSSMU34_1916939664$          ONLINE
_SYSSMU35_1133967719$          ONLINE
_SYSSMU4_168502732$            OFFLINE
创建一个临时的pfile:
4. 还原undo表空间管理为自动。

SQL>drop rollback segment "_SYSSMU7_3984293596$";
还原undo表空间管理为自动:
SQL> shutdown immediate;

_SYSSMU32_162619813$           ONLINE

Step 3.
*.undo_management='manual'   -- undo表空间管理方式修改为手动
SQL> alter database open;
重启使其生效:

实验如下:

Step 2.
_SYSSMU36_2617425201$          ONLINE
_SYSSMU37_2692202156$          ONLINE
undo_tablespace                      string      undo2

_SYSSMU7_3984293596$           OFFLINE
SQL>drop rollback segment "_SYSSMU10_1201331463$";
_SYSSMU3_1987193959$           OFFLINE
3. 手动删除受影响的回滚段和undo表空间,然后重建新的undo表空间;
SQL> shutdown immediate;
SQL> select segment_name,status from dba_rollback_segs;
*._offline_rollback_segments=('_SYSSMU10_1201331463$','_SYSSMU9_2926456744$','_SYSSMU8_640224757$','_SYSSMU7_3984293596$','_SYSSMU6_3694658906$','_SYSSMU5_3475919656$','_SYSSMU4_168502732$','_SYSSMU3_1987193959$','_SYSSMU2_3908286755$','_SYSSMU1_3281912951$')  --把所有受影响的回滚段都列在这里
undo_tablespace                      string      undo1
SQL>drop rollback segment "_SYSSMU5_3475919656$";
并以改pfile重新启动数据库:
SQL>drop rollback segment "_SYSSMU9_2926456744$";
说明该undo文件已经损坏或丢失,把该文件offline之后就可以打开数据库了:
如果undo数据文件损坏,数据库只能到mount状态,open时会出现以下错误:
SQL>drop rollback segment "_SYSSMU2_3908286755$";
_SYSSMU6_3694658906$           OFFLINE
SQL>drop rollback segment "_SYSSMU8_640224757$";
_SYSSMU2_3908286755$           OFFLINE
SQL> show parameter undo

_SYSSMU8_640224757$            OFFLINE
_SYSSMU40_1968985325$          ONLINE
重建新的undo表空间:

NAME                                 TYPE        VALUE
手动删除旧的undo表空间:
undo_management                      string      AUTO
_SYSSMU5_3475919656$           OFFLINE
关闭数据库:
SQL>drop rollback segment "_SYSSMU3_1987193959$";
手动删除受影响的回滚段:
SQL> select segment_name,status from dba_rollback_segs;

SQL> alter system set undo_management='auto' scope=spfile;
SQL> create undo tablespace undo2 datafile 'I:\INTEL_DATA\O06DMS0\UNDO2.O06DMS0' size 100m;

NAME                                 TYPE        VALUE
关闭数据库:
_SYSSMU10_1201331463$          OFFLINE
SQL> shutdown immediate;

------------------------------ ----------------
修改pfile如下:

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

------------------------------------ ----------- -------------------
SQL> create spfile from pfile='H:\initO06DMS0.ora';

相关热词: oracle 解析

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!

本文地址: https://v30.fanwenzhu.com/sql/oracle/2619.shtml

Copyright © www.juheyunku.com      关于 | 合作 | 声明 | 联系 | 更新 | 地图 | Tags

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

2020-12-11 编辑:网络

_SYSSMU31_830375278$           ONLINE

SQL>drop rollback segment "_SYSSMU6_3694658906$";
------------------------------------ ----------- -------------
SQL>drop rollback segment "_SYSSMU4_168502732$";
_SYSSMU39_4040503138$          ONLINE
取消隐藏参数的设置:

Step 4.
SYSTEM                         ONLINE

SQL>drop rollback segment "_SYSSMU1_3281912951$";
创建新的spfile,覆盖旧的spfile:
SQL> alter system reset "_offline_rollback_segments" scope=spfile;
打开数据库的目的是为了找出受影响的回滚段:
undo_retention                       integer     900
_SYSSMU33_99444166$            ONLINE
_SYSSMU38_4059847715$          ONLINE
ORA-01157: cannot identify/lock data file 14 - see DBWR trace file
SEGMENT_NAME                   STATUS

1. 修改undo表空间管理为手动;
_SYSSMU1_3281912951$           OFFLINE

_SYSSMU9_2926456744$           OFFLINE
SQL> drop tablespace undo1 including contents;
*.undo_tablespace='undo2'     --指定一个新的undo表空间
SQL> create pfile='H:\initO06DMS0.ora' from spfile;
2. 设置隐藏参数(_offline_rollback_segments或_corrupted_rollback_segments)标识受影响的回滚段,使Oracle忽略其上的未提交事务;
undo_management                      string      AUTO
ORA-01110: data file 14: 'I:\INTEL_DATA\O06DMS0\UNDO1.O06DMS0'
SQL> startup
SQL> startup pfile='H:\initO06DMS0.ora'

Step 1.
以原来的spfile启动数据库:
------------------------------ ----------------
SQL> startup;
SQL> alter database datafile 'I:\INTEL_DATA\O06DMS0\UNDO1.O06DMS0' offline drop;
SYSTEM                         ONLINE

SEGMENT_NAME                   STATUS

最终检查一下:
undo_retention                       integer     900

SQL> show parameter undo

_SYSSMU34_1916939664$          ONLINE
_SYSSMU35_1133967719$          ONLINE
_SYSSMU4_168502732$            OFFLINE
创建一个临时的pfile:
4. 还原undo表空间管理为自动。

SQL>drop rollback segment "_SYSSMU7_3984293596$";
还原undo表空间管理为自动:
SQL> shutdown immediate;

_SYSSMU32_162619813$           ONLINE

Step 3.
*.undo_management='manual'   -- undo表空间管理方式修改为手动
SQL> alter database open;
重启使其生效:

实验如下:

Step 2.
_SYSSMU36_2617425201$          ONLINE
_SYSSMU37_2692202156$          ONLINE
undo_tablespace                      string      undo2

_SYSSMU7_3984293596$           OFFLINE
SQL>drop rollback segment "_SYSSMU10_1201331463$";
_SYSSMU3_1987193959$           OFFLINE
3. 手动删除受影响的回滚段和undo表空间,然后重建新的undo表空间;
SQL> shutdown immediate;
SQL> select segment_name,status from dba_rollback_segs;
*._offline_rollback_segments=('_SYSSMU10_1201331463$','_SYSSMU9_2926456744$','_SYSSMU8_640224757$','_SYSSMU7_3984293596$','_SYSSMU6_3694658906$','_SYSSMU5_3475919656$','_SYSSMU4_168502732$','_SYSSMU3_1987193959$','_SYSSMU2_3908286755$','_SYSSMU1_3281912951$')  --把所有受影响的回滚段都列在这里
undo_tablespace                      string      undo1
SQL>drop rollback segment "_SYSSMU5_3475919656$";
并以改pfile重新启动数据库:
SQL>drop rollback segment "_SYSSMU9_2926456744$";
说明该undo文件已经损坏或丢失,把该文件offline之后就可以打开数据库了:
如果undo数据文件损坏,数据库只能到mount状态,open时会出现以下错误:
SQL>drop rollback segment "_SYSSMU2_3908286755$";
_SYSSMU6_3694658906$           OFFLINE
SQL>drop rollback segment "_SYSSMU8_640224757$";
_SYSSMU2_3908286755$           OFFLINE
SQL> show parameter undo

_SYSSMU8_640224757$            OFFLINE
_SYSSMU40_1968985325$          ONLINE
重建新的undo表空间:

NAME                                 TYPE        VALUE
手动删除旧的undo表空间:
undo_management                      string      AUTO
_SYSSMU5_3475919656$           OFFLINE
关闭数据库:
SQL>drop rollback segment "_SYSSMU3_1987193959$";
手动删除受影响的回滚段:
SQL> select segment_name,status from dba_rollback_segs;

SQL> alter system set undo_management='auto' scope=spfile;
SQL> create undo tablespace undo2 datafile 'I:\INTEL_DATA\O06DMS0\UNDO2.O06DMS0' size 100m;

NAME                                 TYPE        VALUE
关闭数据库:
_SYSSMU10_1201331463$          OFFLINE
SQL> shutdown immediate;

------------------------------ ----------------
修改pfile如下:

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

------------------------------------ ----------- -------------------
SQL> create spfile from pfile='H:\initO06DMS0.ora';

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供学习参考!
本文地址为 https://v30.fanwenzhu.com/sql/oracle/2619.shtml

相关文章

风云图片

推荐阅读

返回oracle频道首页