转自:http://blog.csdn.net/tianlesoftware/article/details/6261475

Oracle 不同故障的恢复方案

http://blog.csdn.net/tianlesoftware/archive/2010/12/30/6106178.aspx

Oracle undo 表空间管理

http://blog.csdn.net/tianlesoftware/archive/2010/07/11/5689558.aspx

上面的2篇Blog 讲到了Oracle 一些故障下的恢复方法,但是还有2点,之前没有做详述。即current online redo 损坏的情况和undo的损坏情况。 之所以把他们放一起讲,是因为他们之间有联系。

在做操作之前,最好把控制文件,redo log 和数据文件做一个冷备份,以防万一.

一.  UNDO 的补充信息

所以这里补充说明一下。 在补充之前先讲一下undo segment的概念。

在blog:Oracle undo 管理

http://blog.csdn.net/tianlesoftware/archive/2009/11/30/4901666.aspx

中提到了Oracle 的undo 有两种管理方式,通过参数undo_management来设置auto 和 manual。

1.1 当undo_management被设置成MENUAL时使用系统回滚段, 即将undo records 记录到SYSTEM 表空间下的SYSTEM段。

SQL> col segment_name format a10

SQL> select segment_name,tablespace_name,bytes,next_extent  from dba_segments where segment_type='ROLLBACK';

SEGMENT_NA TABLESPACE_NAME       BYTES NEXT_EXTENT

---------- ------------------------------ ---------- -----------

SYSTEM     SYSTEM                 393216     1048576

通过上面的这条语句,我们查到了这个用于rollback 的system segment 存在与system 表空间。 默认情况下,只有一个segment,并且它还比较小,所以,如果使用system 段来存储undo records。肯定会影响数据库的性能。 所以Oracle 是建议使用Undo tablespace 来管理undo records。

1.2  当undo_management设置成AUTO时使用UNDO tablespace来管理回滚段。 这个时候,我们将有多个undo segment,并且这些segment 是存放在UNDO 表空间里的。 这样对DB的性能就会提高。

SQL> select segment_name,tablespace_name,bytes,next_extent  from dba_segments where segment_type='TYPE2 UNDO';

SEGMENT_NAME    TABLESPACE_NAME    BYTES NEXT_EXTENT

-------------------- -------------------- ---------- -----------

_SYSSMU1$            UNDOTBS1                1179648       65536

_SYSSMU2$            UNDOTBS1                1179648       65536

_SYSSMU3$            UNDOTBS1                2228224       65536

_SYSSMU4$            UNDOTBS1                1179648       65536

_SYSSMU5$            UNDOTBS1                 262144       65536

_SYSSMU6$            UNDOTBS1                1179648       65536

_SYSSMU7$            UNDOTBS1                1179648       65536

_SYSSMU8$            UNDOTBS1                1179648       65536

_SYSSMU9$            UNDOTBS1                1179648       65536

_SYSSMU10$           UNDOTBS1                1179648       65536

通过以上SQL的查询结果,我们可以看出,有10个undo segment来存放undo records。

以上我们是通过dba_segment 表查看的结果。 也可以通过v$rollstat和v$rollname 两个视图来查看信息。 这2个视图会显示所有rollback 段的信息。包括system段和undo段。

SQL> col name format a15

SQL> select s.usn,n.name,s.extents,s.hwmsize,s.status from v$rollstat s, v$rollname n where s.usn=n.usn;

USN NAME               EXTENTS    HWMSIZE STATUS

---------- --------------- ---------- ---------- ---------------

0 SYSTEM                   6     385024 ONLINE

1 _SYSSMU1$                3    7659520 ONLINE

2 _SYSSMU2$                3    9691136 ONLINE

3 _SYSSMU3$                4    7462912 ONLINE

4 _SYSSMU4$                3   76668928 ONLINE

5 _SYSSMU5$                4    8511488 ONLINE

6 _SYSSMU6$                3    7462912 ONLINE

7 _SYSSMU7$                3   33480704 ONLINE

8 _SYSSMU8$                3    8577024 ONLINE

9 _SYSSMU9$                3    7462912 ONLINE

10 _SYSSMU10$               3   13754368 ONLINE

11 rows selected.

二.  UNDO 损坏的情况

了解了第一部分的补充知识后,我们在来看一下undo 损坏的情况。 出现这种情况,大多数是因为异常宕机,在启动的时候报的错误。DB 不能启动。

比如:ORA-00600: internal error code, arguments: [4194],

对于Undo 损坏的情况,能用备份恢复最好,如果不能,就只能通过一些特殊的方法来恢复。

2.1 方法一,使用system segment。

在Blog:

Oracle undo 表空间管理

http://blog.csdn.net/tianlesoftware/archive/2010/07/11/5689558.aspx

提到了一种方法,就是使用SYSTEM 的回滚段, 步骤如下:

(1)用spfile 创建pfile,然后修改参数:

#*.undo_tablespace='UNDOTBS1'

#*.undo_management='AUTO'

#*.undo_tablespace

#*.undo_retention

undo_management='MANUAL'

rollback_segments='SYSTEM'

(2)用修改之后的pfile,重启DB

SQL> STARTUP MOUNT pfile='F:/initorcl.ora' ;

(3)删除原来的表空间,创建新的UNDO 表空间

SQL> drop tablespace undotbs;

SQL> create undo tablespace undotbs1 datafile '/u01/oradata/undotbs1.dbf' size 10M;

(4)关闭数据库,修改pfile参数,然后用新的pfile创建spfile,在正常启动数据库。

*.undo_tablespace='UNDOTBS1'

*.undo_management='AUTO'

#undo_management='MANUAL'

#rollback_segments='SYSTEM'

2.2. 方法二:跳过损坏的segment

在方法一里面,我们使用了system segment。 通过第一部分我们了解到,undo segment 有多个,我们可以通过alert log 来查看正在使用的是哪些segment,这些段有可能损坏了。 我们只需要把这些损坏的segment 跳过,先正常启动DB,在创建新的UNDO 表空间,在切换一下。

(1)修改pfile,添加参数:

*._corrupted_rollback_segments='_SYSSMU11$','_SYSSMU12$','_SYSSMU13$'

这些字段的值,我们通过alert log 查看。 也可以通过如下命令查看:

#strings system01.dbf | grep _SYSSMU | cut -d $ -f 1 | sort -u

(2)用修改之后的pfile启动DB

因为跳过了哪些损坏的segment,所以DB 可以正常启动。

(3)创建新的UNDO 表空间,并切换过来

SQL> create undo tablespace undotbs1 datafile '/u01/oradata/undotbs1.dbf' size 10M;

SQL> alter system set undo_tablespace=undotbs1;

SQL> drop tablespace undotbs;

(4)修改pfile,创建spfile,并正常启动

删除:

*._corrupted_rollback_segments='_SYSSMU11$','_SYSSMU12$','_SYSSMU13$'

以上就是UNDO 出现故障的2种处理方法。

三.  Current online Redo 损毁的处理

其实在之前的不同故障处理的那篇blog里已经提到了这点。 但这种情况是一种特殊的情况。 所以还是单独拿出来说明一下。

current online log 损坏有两种恢复方法:

(1)如果有归档和备份,可以用不完全恢复。

SQL>startup mount;

SQL>recover database until cancel; 先选择auto,尽量恢复可以利用的归档日志,然后重新执行:

SQL>recover database until cancel; 这次输入cancel,完成不完全恢复,

用resetlogs打开数据:

SQL>alter database open resetlogs; 打开数据库

(2)强制恢复, 这种方法可能会导致数据不一致

sql>startup mount;

sql>alter system set "_allow_resetlogs_corruption"=true scope=spfile;

sql>recover database until cancel;

sql>alter database open resetlogs;

这里主要看2点:

(1)使用了_allow_resetlogs_corruption 参数

(2)这种情况下,可能会报ORA-600[2662](SCN有关)和 ORA-600[4000](回滚段有关)的错误。

使用_allow_resetlogs_corruption参数,强制的打开数据库,可能会导致逻辑的坏块,从而影响数据字典。 所以,即使使用该参数正常打开后,也需要做的一个操作:逻辑导出数据。 重建实例,导入实例。 消除逻辑坏块的可能性。

如果使用_allow_resetlogs_corruption参数启动报了undo segment的错误而无法启动,处理方法参考第二节中undo 的处理情况。 只要DB 能正常open,就导出数据,重建实例,在导入。

非当前redo:

alter database clear unarchived logfile group 4;

Current online Redo 和 Undo 损坏的处理方法的更多相关文章

  1. 当数据库没有备份,redo或undo损坏

    数据库在没有备份的情况下,如果数据库redo或undo损坏,可以通过如下方法处理,但是不一定成功 把init文件中的: undo_management=manual 然后启动数据库到mount 状态后 ...

  2. SQL Server 中日志的的作用(Redo和Undo)

    简介 之前我已经写了一个关于SQL Server日志的简单系列文章.本篇文章会进一步挖掘日志背后的一些概念,原理以及作用. 数据库的可靠性 在关系数据库系统中,我们需要数据库可靠,所谓的可靠就是当遇见 ...

  3. 【知识点整理】Oracle中NOLOGGING、APPEND、ARCHIVE和PARALLEL下,REDO、UNDO和执行速度的比较

    [知识点整理]Oracle中NOLOGGING.APPEND.ARCHIVE和PARALLEL下,REDO.UNDO和执行速度的比较 1  BLOG文档结构图 2  前言部分 2.1  导读和注意事项 ...

  4. 【转】ORACLE的REDO与UNDO

    一.什么是redo?redo:oracle在在线或者归档重做日志文件中的记录的信息,外以出现失败时可以利用这些数据来"重放"事务.每个oracle数据都至少有二个在线重做日志组,每 ...

  5. 09 redo and undo

    本章提要-----------------------------------------------redo, undo 定义redo, undo 如何工作如何访问 redo, undo提交和回滚- ...

  6. Oracle 9 - redo和undo

    1.redo redo 有在线redo日志和归档redo日志, 从Oracle 10g开始还新增加了flashback技术. 每个Oracle数据库至少有2个在线重做日志组,循环写. 只有INSERT ...

  7. redo、undo、binlog的区别

    在MySQL中,redo.undo.binlog经常见,但很容易混淆这三者.   redo undo binlog 作用 保持事务的持久性 帮助事务回滚及MVCC的功能 进行Point-In-Time ...

  8. current online redo logfile 丢失的处理方法

    昨天做了rm -rf操作后的恢复演练,并且是在没有不论什么备份的情况下.今天在做破坏性操作前,做了个rman全备,然后在线删除所有数据库文件,包含控制文件,数据文件,在线日志文件,归档文件等.来看看有 ...

  9. 说说MySQL中的Redo log Undo log都在干啥

        在数据库系统中,既有存放数据的文件,也有存放日志的文件.日志在内存中也是有缓存Log buffer,也有磁盘文件log file,本文主要描述存放日志的文件.     MySQL中的日志文件, ...

随机推荐

  1. Sea Battle CodeForces - 729D

    题意: 有n个格子,a条船,每条船占b个格子.事先已经射击了k个格子,且这k次射击不会射到船上,求再射击几次可以射到某一条船的某一部分 思路: 观察样例可以发现,如果五个0,船的长度是3,那么这五个0 ...

  2. Cube Stack

    Cube Stack 有一点lazy思想,设三个数组cnt代表它以下的有多少个元素(直到栈底),top[x]代表x所在栈的栈顶元素,dad[x]代表x所在栈的栈底元素,先寻找父亲,然后递归更新累加cn ...

  3. MySQL数据库crash的问题分析

    [问题] 生产环境有多台slave服务器,不定期的会crash,下面是error log中的堆栈信息 Thread pointer: 0x7f1e54b26410 Attempting backtra ...

  4. GCC&&GDB在OI中的介绍

    序言 这本来是用Word写的,但是后来我换了系统所以只能用markdown迁移然后写了...... $\qquad$本文主要投食给那些在Windows下活了很久然后考试时发现需要用命令行来操作时困惑万 ...

  5. BZOJ5384 有趣的字符串题 回文树

    神奇的结论: 一个字符串的所有回文后缀的长度,可以形成$k$个等差数列,$k$是$log$级的 考虑前$R$个字符组成的字符串,对于一个等差数列,假设组成这个等差数列的回文串,最短的叫$a$,最长的叫 ...

  6. javac编译出现需要标识符问题解决

    因为没有写public static void mian(String[] args) 在类里面只有属性和方法,内部类.不能直接写System.out.println():

  7. PHPMailer 使用方法(支持群发):

    一.下载函数包 地址:https://github.com/PHPMailer/PHPMailer 二.测试服务器环境 通过phpinfo()函数打印出是否支持Sockets(Socket属于php的 ...

  8. 前端性能优化 —— 减少HTTP请求

    简要:对于影响页面呈选 的因素有3个地方:服务器连接数据库并计算返回数据 , http请求以及数据(文件)经过网络传输 , 文件在浏览器中计算渲染呈选: 其中大约80%的时间都耗在了http请求上,所 ...

  9. System.currentTimeMillis()方法

    用途一:计算某任务 耗费的毫秒 用途二:获得当前的系统时间 用途三:用当前毫秒数给文件命名等 其他用途:比如随机数的种子数等 示例: package currenttimemillis方法; impo ...

  10. C# Redis缓存过期实现延迟通知实战演练

    一.场景描述 在实际开发过程中经常会遇到一些有时效性数据的业务场景,比如订单支付处理超时提醒.当用户在商城上进行下单支付,我们假设如果8小时没有进行支付,那么就后台自动对该笔交易的状态修改为订单关闭取 ...