undo丢失、损坏的管理

 

1、undo回滚段:

 几个重要的视图:

V$undostat

V$rollstat 状态

v$rollname 段的名字

dba_segments

dba_rollback_segs

 undo作用:

 

1、事务处理回退

2、事务处理恢复

3、读一致性

4、闪回数据

 

前滚:事务已经提交但是还没有写入数据文件,前滚写入。

 

回滚:数据已经写入数据文件但是事务还没有提交,则要撤销操作。

 

读一致性:其他回话只能看到没有提交的数据,锁的机制使之实现。

 

undo段中区的状态:

SQL> select extent_id,segment_name,bytes,status from dba_undo_extents where segment_name like '_SYSSMU%';

 EXTENT_ID      BYTES STATUS

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

         0      65536 EXPIRED

         1      65536 EXPIRED

         2    1048576 EXPIRED


free: 区没有被使用;

active: 区中的undo信息对应的事务没有提交;

inactive: 对应的事务已经提交;

expired: 事务提交后,还没有超过undo_retention秒;

unexpired: 事务提交后,还没有超过undo_retention秒;

 

通过项目中发现:新产生的撒销数据没有使用undo的空闲空间,而是先覆盖最早的expired数据。

 

  oracle的undo有两种方式: undo_management


一、如果设为auto,是使用undo表空间  
二、如果设为Manual,使用回滚段
----------------------------------------------------------------------
当undo_management被设置成MENUAL时使用系统回滚段,即将undo records 记录到SYSTEM 表空间下的SYSTEM段

 

以下两种发生查看出来的仅回滚段信息一样:

 

select * from v$rollname;

 

 

select segment_id,segment_name,tablespace_name,status from dba_rollback_segs;

 

 

2、undo丢失的管理:

undo丢失或者损坏的处理需要理解undoautomanual两种管理方式的区别、SCN号。

 

方法1:基于auto


关闭数据库,剪切undo、 备份,启动数据库报错。


 

SQL> select  name from  v$datafile;

NAME

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

D:\U01\ADMINISTRATOR\ORADATA\ORCL1\SYSTEM01.DBF

D:\U01\ADMINISTRATOR\ORADATA\ORCL1\SYSAUX01.DBF

D:\U01\ADMINISTRATOR\ORADATA\ORCL1\UNDOTBS01.DBF

D:\U01\ADMINISTRATOR\ORADATA\ORCL1\USERS01.DBF

D:\U01\ADMINISTRATOR\ORADATA\ORCL1\EXAMPLE01.DBF

D:\U01\ADMINISTRATOR\ORADATA\ORCL1\TEST.DBF


SQL> alter database datafile 'D:\U01\ADMINISTRATOR\ORADATA\ORCL1\UNDOTBS01.DBF' offline drop;

 

SQL>alter  database  open;

 

SQL> create undo tablespace undotbs02 datafile 'D:\U01\ADMINISTRATOR\ORADATA\ORCL1\UNDOTBS02.DBF' size 50m;

 

SQL> alter system set undo_tablespace=undotbs02 scope=spfile;

 

数据库成功打开但是有一个问题是UNDOTBS01还是脱机的。还是有记录在数据库中,占用一定的回滚段。删除不掉数据文件UNDOTBS01所在的表空间。

 

此时再查看回滚段的状态:

 

 

需呀用到参数:_corrupted_rollback_segments

创建pfile将上面检查出来的回滚段都写到里面,之后启动数据库,再将undotbs01删除。create pfile='d:\pfile.ora' from spfiile


*.open_cursors=300

*.pga_aggregate_target=844103680

*.processes=150

*.remote_login_passwordfile='EXCLUSIVE'

*.sga_target=2532311040

*.undo_tablespace='UNDOTBS02'

*._CORRUPTED_ROLLBACK_SEGMENTS=(_SYSSMU10_3905543278$,_SYSSMU9_1752201611$,_SYSSMU8_4073472757$,_SYSSMU7_2045423248$,_SYSSMU6_2178705127$,_SYSSMU5_3833294529$,_SYSSMU4_4259202332$,_SYSSMU3_1902573166$)


之后利用pfile 启动数据库。


SQL> startup nomount pfile='d:\pfile.ora';

SQL> alter database mount;

SQL> alter database  open ;

 

 

此时就可以删除损坏的undo了:

SQL> drop tablespace undotbs1 including  contents and datafiles;

 

之后再次查看回滚段恢复正常:

Select  segment_id,segment_name,tablespace_name,status from dba_rollback_segs;

 


之后基于pfile创建spfile,数据库重新打开。

 

以下摘自:askmaclean

CORRUPTED_ROLLBACK_SEGMENTS(corrupted undo segment list)隐藏参数所独有的功能:

§  在实例启动startup并open database的阶段_CORRUPTED_ROLLBACK_SEGMENTS所列出的undo segments(撤销段/回滚段)将不会被访问读取

§  所有指向这些被_CORRUPTED_ROLLBACK_SEGMENTS列出的undo segments的事务都被认为已经提交了commit,和这个undo segments已经被drop时类似

§  这将导致严重的逻辑讹误

§  如果数据字典上有活跃事务那么将更糟糕,数据字典逻辑讹误会造成数据库管理问题

§  如果bootstrap自举核心对象有活跃事务,那么将无法忽略错误ORA-00704: bootstrap process failure错误,导致无法强制打开数据库(见拙作Oracle数据恢复:解决ORA-00600:[4000] ORA-00704: bootstrap process failure错误一例)

§  衷心地建议用_CORRUPTED_ROLLBACK_SEGMENTS这个参数打开数据库后导出数据并重建数据库,这个参数使用的后遗症可能很顽固

§  Oracle公司内部有叫做TXChecker的工具可以检查问题事务


方法2:基于auto

和方法1类似,利用隐含参数_allow_resetlogs_corruption忽略一致性验证打开时数据库。

 

1、编辑pfile中添加如下:

*. _allow_resetlogs_corruption=true

 

*._CORRUPTED_ROLLBACK_SEGMENTS=(_SYSSMU10_3905543278$,_SYSSMU9_1752201611$,_SYSSMU8_4073472757$,_SYSSMU7_2045423248$,_SYSSMU6_2178705127$,_SYSSMU5_3833294529$,_SYSSMU4_4259202332$,_SYSSMU3_1902573166$)

 

2、启动数据库,之后创建新的undo,将新的undo设置为默认的。

3、删除老的undo。

4、关闭数据库,编辑pfile去掉隐含参数,获得新的spfile。

 

方法3:基于manual

关闭数据库,物理undo剪切到其他目录。启动报错。

 

 

1、设置两个参数:

alter system set undo_management='MANUAL' scope=spfile;

alter system  set  rollback_segments='SYSTEM'   scope=spfile;




2、之后关闭数据库、重启数据库open:删除旧的创建新的


SQL> alter database datafile 'D:\U01\ADMINISTRATOR\ORADATA\ORCL1\UNDOTBS02.DBF' offline drop;

 

SQL> drop tablespace undotbs02  including contents and datafiles;

 

SQL> create undo tablespace undotbs3 datafile 'D:\U01\ADMINISTRATOR\ORADATA\ORCL1\UNDOTBS03.DBF' size 50m;

 

SQL> alter system set undo_tablespace=undotbs3 scope=spfile;

 

3、创建出来pfile,改动参数,再创建新的spfile.

 

*.rollback_segments='SYSTEM'

*.undo_management='MANUAL'

还改成原来的:

*.undo_management=AUTO'

*.undo_tablespace='UNDOTBS3'

 

3、 undo重用机制


free: 区没有被使用;

active: 区中的undo信息对应的事务没有提交;

inactive: 对应的事务已经提交;

expired: 事务提交后,还没有超过undo_retention秒;

unexpired: 事务提交后,还没有超过undo_retention秒;


通过生产中的情况,OGG部署初始化中。存在undo空闲空间调整的很大。Undo_retention参数调整不合适导致的snapshot too old

因此得出优先使用expired过期的数据。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29582917/viewspace-2120956/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29582917/viewspace-2120956/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值