设为首页 收藏本站
查看: 876|回复: 0

[经验分享] Oracle ORA-600[4193] 解决方法 说明

[复制链接]

尚未签到

发表于 2016-7-24 11:13:43 | 显示全部楼层 |阅读模式
  
  ORA-600[41XX] 这种错误基本都于UNDO 有关系。关于ORA-600参数的更多说明,参考我的Blog:
  ORA-600 各个参数含义说明
  http://blog.csdn.net/tianlesoftware/article/details/6645809
  
  ORA-600[4193] 这个错误也是与UNDO 有关系,MOS 上有几篇相关的说明文章.
  
一.MOS说明
  
1.1 ORA-600 [4193] WhenTrying To Open The Database [ID 763566.1]
  
  Symptoms
  Copying databasefrom one server to another server and getting an ORA-600 [4193] error whentrying to open the database on the destination server.
  --copy 数据库从一个server 到另一个server 后,尝试打开时报这个错误。
  
  Cause
  The online redologs were copied when the source database was open,online redo logsshould never be copied when the database is open.
  --导致原因是因为在数据库open时把online redo logs 也一起copy 过去了。 在数据库open状态,online redo log 不应该copy。
  
  Solution
  In this instancethe datafiles were being copied properly after the tablespaces were put in tobackup mode, however, online redo logs should only be copied if the sourcedatabase is shutdown first before copying the online redo logs. Thesource database needed to remain open so, the datafiles were copied again (withthe tablespaces in backup mode) and then a number of archivelogs weretransferred over to the new server and after the last archivelog was appliedthe database could be opened with resetlogs and new online redo logs werecreated on the destination server.
  --当表空间被设置为backup 模式之后,可以copy 数据文件,但是onlineredo log 只能是在数据库shutdown 之后才能copy,如果数据库一直是open 状态,那么只能把datafile copy 过去,然后把归档文件传送过去,最后用openresetlogs的方式打开数据库,在open时online redo log 会自动重建。
  
1.2 Ora-600 [4193] WhenOpening Or Shutting Down A Database [ID 452662.1]
  
  1.2.1 Symptoms
  Errors in alert.log:
  TueJul1713:38:132007
Errorsinfile/home/oracle/oracle/product/10.2.0/yms/rdbms/log/yms_smon_8337.trc:
ORA-00607:Internalerroroccurredwhilemakingachangetoadatablock
ORA-00600:internalerrorcode,arguments:[4193],[3552],[3554],[],[],[]
  
yms_smon_8337.trc:
  SO:0xdfaec728,type:24,owner:0xdf266580,flag:INIT/-/-/0x00
  (buffer)PR:0xdf1f1338FLG:0x1000
classbit:0x80000
kcbbfbp:[BH:0xded4bf40,LINK:0xdfaec768]
kcbbfbx[0]:[BH:0xdece41d8,LINK:0xdfaec788]
where:ktuwh01:ktugus,why:0
buffertsn:2rdba:0x00c00002(3/2)
scn:0x0000.03c95628seq:0x01flg:0x00tail:0x56280e01
frmt:0x02chkval:0x0000type:0x0e=KTUUNDOHEADERW/UNLIMITEDEXTENTS
BH(0xdece41d8)file#:3rdba:0x00c003b6(3/950)class:20ba:0x11d6ba000
set:6blksize:8192bsi:0set-flg:0pwbcnt:0
dbwrid:0obj:-1objn:0tsn:2afn:3
hash:[df870f70,df870f70]lru:[dece4488,dece4028]
obj-flags:object_ckpt_list
ckptq:[dedac4a0,ded47cb8]fileq:[dedac500,ded47cc8]objq:[ded47d78,db7bfd78]
use:[dfaec788,dfaec788]wait:[NULL]
st:XCURRENTmd:EXCLtch:0
flags:mod_startedgotten_in_current_modeblock_written_once
changestate:ACTIVE
changecount:1
LRBA:[0xac3.4de07.0]HSCN:[0xffff.ffffffff]HSUB:[65535]
UsingStateObjects
----------------------------------------
SO:0xdfaec728,type:24,owner:0xdf266580,flag:INIT/-/-/0x00
(buffer)PR:0xdf1f1338FLG:0x1000
classbit:0x80000
kcbbfbp:[BH:0xded4bf40,LINK:0xdfaec768]
kcbbfbx[0]:[BH:0xdece41d8,LINK:0xdfaec788]
where:ktuwh01:ktugus,why:0
buffertsn:2rdba:0x00c003b6(3/950)
scn:0x0000.03be3c7dseq:0x5aflg:0x04tail:0x3c7d025a
frmt:0x02chkval:0x0868type:0x02=KTUUNDOBLOCK
----------------------------------------
Error607inredoapplicationcallback
TYP:0CLS:20AFN:3DBA:0x00c003b6OBJ:4294967295SCN:0x0000.03be3c7dSEQ:90OP:5.1
ktudbredo:siz:132spc:4462flg:0x0012seq:0x0de2rec:0x09
  
  UNDO BLK:
xid: 0x0002.045.00006c61seq:0xde0cnt: 0x60 irb: 0x60 icl: 0x0 flg: 0x0000
  
  1.2.2 Cause
  When we try toapply redo to an undo block (forward changes are made by the applicationof redo to a block) we check that the seq# in the undo record matches theseq# in the redo record.
  --数据库在启动时需要进行一个前滚的操作,在前滚时会应用redo 到undo block上,操作时会检查undorecord里的seq#和 redo record里的seq#.
  
  These seq#should be the same because when we apply a redo record we must apply itto thecorrect version of the block.
  --正常情况下,这2者的seq# 应该是一致的。
  
  We can onlyapply a redo record to a block that contains the same seq# as in the redorecord.
  --在一致的情况下,我们才应用redo record 到undo record。
  
  If the seq# do not match then ORA-600[4193][a]. is raised. .
  Arg [a] Undorecord seq number --> seq: 0xde0 = 3552
Arg Redo record seq number --> seq:0x0de2 = 3554
  --如果不一致就会出现ORA-600[4193][a]的错误。其中a 是undo 里的seq#记录,b是redo 里的seq# 值。 这里的值都是十六进程,我们可以通过to_number() 这个函数来转换一下:
  
  SYS@anqing1(rac1)> Select to_number('de0','xxxx') from dual;
  TO_NUMBER('DE0','XXXX')
  -----------------------
  3552
  
  This implies some kind of block corruptionin either the redo or the undo block.
  --当redo record 和 undo record 不一致时,就会抛出ORA-600[4193]的错误。
  
  相关的文章参考:
  Oracledatafile block 格式 说明
  http://blog.csdn.net/tianlesoftware/article/details/6654786
  
  Oracle 实例恢复时 前滚(roll forward) 后滚(roll back) 问题
  http://blog.csdn.net/tianlesoftware/article/details/6286330
  
  1.2.3 Solution
  1.2.3.1 If Database is opened:
  --在db open 状态下,解决的方法如下:
  1) Find out the rollback segment, based onthe first part of the xid: 0x0002.045.00006c61
  usn=2 is the segment_id
  selectsegment_name,status from dba_rollback_segs where segment_id=2;
  RS_DATA1ONLINE
  
  2) Dump the transaction table of the rollbacksegment to see if all TX are commited:
  alter system dump undoheader RS_DATA1;
  
  Oracle dumpundo 说明
  http://blog.csdn.net/tianlesoftware/article/details/6672417
  
  3) check the trace file created underuser_dump_dest
  In the trace filesearch for the Keyword "TRN TBL"
  TRNTBL::

indexstatecflagswrap# uelscndba
-----------------------------------------------------------------------------
0x00 9 0x000x21eb10x00230x0000.d28c43e90x00000000......
  state=9 means transaction is committed
  
  4) offline the rollback segment:
  alter rollbacksegment rs_data1 offline;
select status from dba_rollback_segs wheresegment_id=2;

5) if STATUS=OFFLINE
  droprollback segment RS_DATA1;
  
  1.2.3.2 If Database doesn't open:
  --如果数据库不是open状态,处理方法如下:
  1. a) If using rollbacksegments, remove the rollback_segments line from init.ora, and open database
  b) If usingundo segments set undo_management = manual in init.ora/spfile, and try to opendatabase.
  2. If database opens means all transactionsare committed, and you can drop the rollback segment or the undo tablespace
  
  
1.3 bug 导致的ORA-600[4193]
  MOS:
  ORA-600 [4193] "seq# mismatch whileadding undo record" [ID 39282.1]
  Bug 8240762 - Undo corruptions with ORA-600[4193]/ORA-600 [4194] or ORA-600 [4137] [ID 8240762.8]
  
  Undo corruptionmay be caused after a shrink and the same undo block may be used for two different transactions causing several internal errors like:
  ORA-600 [4193] / ORA-600 [4194] for newtransactions
  ORA-600 [4137] for a transaction rollback
  
  Undo segment shrink is internally done by Oracle.
  --undo shrink 导致的undo corruptions
  
  Workaround
  Drop the undo segment.
  
Affects:
  Product (Component)
  Oracle Server (Rdbms)
  Range of versionsbelievedto be affected
  Versions >= 10.2 but BELOW 11.2
  Versionsconfirmedas being affected


  • 10.2.0.4   
  • 10.2.0.3  
  Platforms affected
  Generic (all / most platforms affected)
Fixed:
  This issue is fixed in


  • 11.2.0.1       (Base Release)   
  • 11.1.0.7.10       Patch Set Update   
  • 10.2.0.5       (Server Patch Set)   
  • 11.1.0.7       Patch 42 on Windows Platforms   
  • 10.2.0.4       Patch 40 on Windows Platforms  
  
  在Oracle 10.2 以上到11.2 的DB 会受Bug 8240762的影响导致undo 的corruption。在10.2.0.5 中已经修复了这个bug。如果出现这种问题,drop 对应的undo segment 即可。
  
  
二. 小结
  在第一部分列出了官方的一些解释,这里总结一下。
  
  在启动数据库时会先进行一个forward 的操作,这时候会应用一些redo record 到undo block里,在apply 之前会先检查这2个block里面的seq#值,如果一致则ok,不一致,就会出现ORA-600[4193]的错误。
  
  ORA-600[4193]的格式是:ORA-600[4193] [a].
  Arg [a] Undorecord seq number --> seq: 0xde0 = 3552
Arg Redo record seq number --> seq:0x0de2 = 3554
  
  参数A 是undo 里的seq#, 参数B是redo 里的seq#值,这个值可以从trace里也查看,也可以直接dump 对应的块:
  
  Oracle DumpRedo Log File 说明
  http://blog.csdn.net/tianlesoftware/article/details/6670962
  
  Oracle dumpundo 说明
  http://blog.csdn.net/tianlesoftware/article/details/6672417
  
  Oracledatafile block 格式 说明
  http://blog.csdn.net/tianlesoftware/article/details/6654786
  
  dump 出来的seq值是十六进制的,可以使用to_number 函数转换:
  SYS@anqing1(rac1)> Select to_number('de0','xxxx') from dual;
  TO_NUMBER('DE0','XXXX')
  -----------------------
  3552
  
  导致ORA-600[4193]的错误原因,MOS 上提到了2个:
  1.在DB open状态下复制了online redo log。
  在open 状态下的复制,不能复制onlien redo log,而应复制归档,然后用open resetlogs,这样onlineredo log 会自动重建。
  2.BUG 8240762 --shrink undo
  ORA-600 [4193] /ORA-600 [4194] for new transactions
  ORA-600 [4137] for a transaction rollback
  这个bug 存在于Oracle 10.2.0.3,10.2.0.4 以及11gR1的版本里。
  
  出现这种问题的解决方法是重建UNDO 表空间,现在使用SYSTEM下rollbacksegment 的系统基本是没有了。
  
  在下面的Blog里列举了2种重建UNDO 的方法,这里列一种:
  Currentonline Redo 和 Undo 损坏的处理方法
  http://blog.csdn.net/tianlesoftware/article/details/6261475
  
  (1)用spfile创建pfile,然后修改参数:
  #*.undo_tablespace='UNDOTBS1'
  #*.undo_management='AUTO'
  #*.undo_tablespace
  #*.undo_retention
  undo_management='MANUAL'
  rollback_segments='SYSTEM'
  
  (2)用修改之后的pfile,重启DB
  SQL> STARTUP MOUNTpfile='F:/initorcl.ora' ;
  
  (3)删除原来的表空间,创建新的UNDO表空间
  SQL> drop tablespace undotbs;
  SQL> create undo tablespace undotbs1datafile '/u01/oradata/undotbs1.dbf' size 10M;
  
  (4)关闭数据库,修改pfile参数,然后用新的pfile创建spfile,在正常启动数据库。
  *.undo_tablespace='UNDOTBS1'
  *.undo_management='AUTO'
  #undo_management='MANUAL'
  #rollback_segments='SYSTEM'
  
  
  有关UNDO 表空间的更多说明,参考:
  Oracle undo 管理
  http://blog.csdn.net/tianlesoftware/article/details/4901666
  
  Oracle undo 表空间管理
  http://blog.csdn.net/tianlesoftware/article/details/5689558
  
  
  
  
  
  -------------------------------------------------------------------------------------------------------
  版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!
  Email:  tianlesoftware@gmail.com
  Skype:  tianlesoftware
  Blog: http://www.tianlesoftware.com
  Weibo:  http://weibo.com/tianlesoftware
  Twitter: http://twitter.com/tianlesoftware
  Facebook: http://www.facebook.com/tianlesoftware
  
  -------加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请----
  DBA1 群:62697716(满); DBA2 群:62697977(满)DBA3 群:62697850(满)
  DBA 超级群:63306533(满); DBA4 群:83829929 DBA5群: 142216823
  DBA6 群:158654907 DBA7 群:172855474 DBA总群:104207940

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-248573-1-1.html 上篇帖子: Oracle 索引扫描的五种类型 下篇帖子: Oracle数据完整性和锁机制
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表