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丢失或者损坏的处理需要理解undo的auto和manual两种管理方式的区别、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/