迁移脚本的日志中报错RMAN-06571: datafile 78 does not have recoverable copy,经查看发现78号文件曾经被offline drop掉。于是重建控制文件,在控制文件中把78号文件去掉,重建控制后,数据库能够mount,mount后数据文件是一致,但是open 时会报错ora-600,异常宕掉。
1 2 3 4 5 6 7 8 9 |
SYS@mydbtst> alter database open; alter database open * ERROR at line 1: ORA-01092: ORACLE instance terminated. Disconnection forced ORA-00600: internal error code, arguments: [25025], [78], [], [], [], [], [], [], [], [], [], [] Process ID: 6028 Session ID: 521 Serial number: 15 |
经检查,这个78号文件是undo的一个文件。上述的处理方法,对于处理一般的数据文件是可行的,但是对于undo文件的问题,就不能用上述这个方法处理了。应该用下面的处理方法,具体的处理方法如下:
1. 加上管理方式为manual:
1 2 3 4 5 6 |
…… *.streams_pool_size=134217728 *.undo_retention=3600 *.undo_tablespace='UNDOTBS1' *.undo_management='manual' ~ |
2. 启动之后,做recovery:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
SYS@mydbtst> startup pfile='/tmp/pfile_bak.ora'; ORACLE instance started. Total System Global Area 2522189824 bytes Fixed Size 2230912 bytes Variable Size 1157629312 bytes Database Buffers 1342177280 bytes Redo Buffers 20152320 bytes Database mounted. ORA-01113: file 1 needs media recovery ORA-01110: data file 1: '+DG_DATA001/mydbtst/datafile/system.453.813666469' SYS@mydbtst> recover database using backup controlfile; ORA-00279: change 9436796441761 generated at 08/01/2014 10:07:10 needed for thread 1 ORA-00289: suggestion : +FRA_SMALL_MDG ORA-15173: entry 'ARCHIVELOG' does not exist in directory 'mydbtst' ORA-00280: change 9436796441761 for thread 1 is in sequence #4 <<<<<<<需要sequence # 4的日志,查v$log和v$logfile之后,确认哪个redo log放入 Specify log: {<RET>=suggested | filename | AUTO | CANCEL} +DATA_SMALL_MDG/mydbtst/onlinelog/group_1.1156.854401821 Log applied. Media recovery complete. SYS@mydbtst> SYS@mydbtst> alter database open; alter database open * ERROR at line 1: ORA-01589: must use RESETLOGS or NORESETLOGS option for database open SYS@mydbtst> alter database open resetlogs; Database altered. SYS@mydbtst> SYS@mydbtst> |
3. 新建新的undo
1 2 3 4 5 |
SYS@mydbtst> create undo tablespace undo_new datafile '+DG_DATA001/mydbtst/datafile/undo_new01.dbf' size 200m; Tablespace created. SYS@mydbtst> |
4. 检查UNDOTBS1的undo segment,幸运的是,我没有发现needs recovery的undo segment,所以后续也不用隐含参数”_corrupted_rollback_segments”跳过need recovery的undo segment来重启了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
SYS@mydbtst> select tablespace_name,segment_name,status from dba_rollback_segs; TABLESPACE_NAME SEGMENT_NAME STATUS ------------------------------ ------------------------------ ---------------- SYSTEM SYSTEM ONLINE UNDOTBS1 _SYSSMU1_3981220827$ OFFLINE UNDOTBS1 _SYSSMU2_2541240231$ OFFLINE UNDOTBS1 _SYSSMU3_4103266798$ OFFLINE UNDOTBS1 _SYSSMU4_1110676785$ OFFLINE UNDOTBS1 _SYSSMU5_3829116805$ OFFLINE UNDOTBS1 _SYSSMU6_347720470$ OFFLINE UNDOTBS1 _SYSSMU7_3507999319$ OFFLINE UNDOTBS1 _SYSSMU8_3681584916$ OFFLINE UNDOTBS1 _SYSSMU9_630455542$ OFFLINE UNDOTBS1 _SYSSMU10_2221096320$ OFFLINE …… TABLESPACE_NAME SEGMENT_NAME STATUS ------------------------------ ------------------------------ ---------------- UNDO_NEW _SYSSMU110_852046607$ OFFLINE UNDO_NEW _SYSSMU111_1868020771$ OFFLINE 112 rows selected. SYS@mydbtst> |
5. 由于不需要隐含参数跳过,可以直接drop原来的undo:
1 2 3 |
SYS@mydbtst> drop tablespace UNDOTBS1 including contents and datafiles; Tablespace dropped. |
6. 修改pfile为auto和新的undo_new
1 2 3 4 5 6 7 8 9 |
cnsz181007:mydbtst > vi pfile_bak.ora …… *.streams_pool_size=134217728 *.undo_retention=3600 *.undo_tablespace='undo_new' *.undo_management='auto' ~ |
7. 用该pfile重启:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
cnsz181007:mydbtst > sqlplus "/ as sysdba" SQL*Plus: Release 11.2.0.3.0 Production on Fri Aug 1 11:59:56 2014 Copyright (c) 1982, 2011, Oracle. All rights reserved. Connected to an idle instance. SYS@mydbtst> startup pfile='/tmp/pfile_bak.ora'; ORACLE instance started. Total System Global Area 2522189824 bytes Fixed Size 2230912 bytes Variable Size 1157629312 bytes Database Buffers 1342177280 bytes Redo Buffers 20152320 bytes Database mounted. Database opened. SYS@mydbtst> |