我申请这个blog是为了督促自己,把自己平时的一些想法和思考结果保留下来。 本博客所有内容均为原创,如有转载请注明作者和出处

ORA-600(2662)错误的重现和解决(一)

上一篇 / 下一篇  2008-06-19 23:58:26 / 个人分类:ORACLE

前两天同事在测试DATA GUARD的时候将主库的ONLINE日志意外覆盖,造成数据库无法打开,采用隐含参数的方法打开又碰到ORA-600错误,最后采用设置EVENTS的方式解决。

由于是在别人的机器上操作,而且很多操作都是摸索进行,因此没有将操作记录下来。现在打算重现一下问题并简单记录解决过程。

这篇首先尝试重现问题。

 

现有环境,Oracle10.2.0.3 for windows数据库。为了完全模拟问题的方式情况,首先创建STANDBY数据库。

在创建STANDBY数据库之前,首先对数据库进行备份。这样一旦测试出现问题,导致被损坏的数据库无法恢复,也可以通过这个备份来恢复数据库。

下面为创建STANDBY数据库进行准备,这里只列出操作就不详细描述了:

SQL> ALTER DATABASE FORCE LOGGING;

数据库已更改。

SQL> ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(ytk,ytks)';

系统已更改。

SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=E:\oracle\oradata\YTK\archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=ytk';

系统已更改。

SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=ytks LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ytks';

系统已更改。

SQL> ALTER SYSTEM SET FAL_SERVER=ytks;

系统已更改。

SQL> ALTER SYSTEM SET FAL_CLIENT=ytk;

系统已更改。

SQL> ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO;

系统已更改。

创建PFILE

SQL> CREATE PFILE='E:\ORACLE\ORADATA\YTKS\INITYTKS.ORA' FROM SPFILE;

文件已创建。

添加并修改下面的初始化参数:

*.audit_file_dest='E:\oracle\admin\ytks\adump'
!pA7s]+A!E:]}a:H0*.background_dump_dest='E:\oracle\admin\ytks\bdump'
F\Gq,y0*.control_files='E:\ORACLE\ORADATA\YTK_S\CONTROLFILE\CONTROL01.CTL'ITPUB个人空间,?S{#O8ufI`8Sv
*.core_dump_dest='E:\oracle\admin\ytks\cdump'
7i)g[.G ^+W0*.user_dump_dest='E:\oracle\admin\ytks\udump'ITPUB个人空间ceK_| UM$_&f/Hu
*.fal_client='ytks'
&wFo&m g;yjsX,R0*.fal_server='ytk'
*r(e'usE+q%Z0*.log_archive_dest_1='LOCATION=E:\oracle\oradata\ytks\archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=ytks'ITPUB个人空间&@%` m9K8T!sj;Gh;ag
*.log_archive_dest_2='SERVICE=ytk LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ytk'
VyD6\ ^7]C~*@ t0standby_archive_dest='LOCATION=E:\oracle\oradata\ytks\archivelog'
G0AyX"Vf0db_unique_name='ytks'
0F%BBz!bb;B*c$P0lock_name_space='ytks'ITPUB个人空间7Q,d(d'S)sb
db_file_name_convert=('E:\oracle\oradata\ytk', 'E:\oracle\oradata\ytks')ITPUB个人空间9j)a UD1n0aJ3` L4U/`w
log_file_name_convert=('E:\oradle\oradata\ytk', 'E:\oracle\oradata\ytks')

需要注意一点,LOG_FILE_NAME_CONVERT参数设置有误,E:\oracle被写成了E:\oraDle。这个错误意味着LOG_FILE_NAME_CONVERT参数失去了意义。且由于PRIMARY数据库和STANDBY数据库处于同一台服务器上,这样STANDBY数据库在启动RESETLOG后,会将PRIMARY数据库的LOGFILE清除掉。

关闭数据库,采用冷备份的方式,将数据文件拷贝到STANDBY数据库的所在目录:

SQL> SHUTDOWN IMMEDIATE
0C:p s)\D(Ag0
数据库已经关闭。
4vaj^%u3}f5T$K&E3s7xwB0
已经卸载数据库。
'u6C"Nf0p#rqs0ORACLE
例程已经关闭。

E:\>COPY E:\ORACLE\ORADATA\YTK\DATAFILE\* E:\ORACLE\ORADATA\YTKS\DATAFILEITPUB个人空间 t._%b2W Uc'fU ~.o
E:\ORACLE\ORADATA\YTK\DATAFILE\O1_MF_SYSAUX_1TDY3TRF_.DBF
? LaF"p VM{x4oJ0E:\ORACLE\ORADATA\YTK\DATAFILE\O1_MF_SYSTEM_1TDY2CXS_.DBFITPUB个人空间7^)r4c4U1X1DI4N
E:\ORACLE\ORADATA\YTK\DATAFILE\O1_MF_TEMP_1TDY49L2_.TMPITPUB个人空间]d"Q)s3gn
E:\ORACLE\ORADATA\YTK\DATAFILE\O1_MF_UNDOTBS1_1TDY3GNZ_.DBF
j(DH!hM@,m0E:\ORACLE\ORADATA\YTK\DATAFILE\O1_MF_USERS_1TDY4JMK_.DBFITPUB个人空间;?/U,l Y,Z N
E:\ORACLE\ORADATA\YTK\DATAFILE\O1_MF_YANGTK_1THCKSRW_.DBF
:~ ^$r^*a0]0E:\ORACLE\ORADATA\YTK\DATAFILE\O1_MF_YANGTK_22MWCD5C_.DBF
e2w/Jr u0E:\ORACLE\ORADATA\YTK\DATAFILE\TEST01.DBF
,D?9d,v7pR| o0
已复制         8个文件。

E:\>COPY E:\ORACLE\ORADATA\YTK\ONLINELOG\* E:\ORACLE\ORADATA\YTKS\ONLINELOGITPUB个人空间$j0PX~1k%?B
E:\ORACLE\ORADATA\YTK\ONLINELOG\REDO01.LOG
zx sd ~%@U)k0E:\ORACLE\ORADATA\YTK\ONLINELOG\REDO02.LOGITPUB个人空间|(C%[$[.\Pc
E:\ORACLE\ORADATA\YTK\ONLINELOG\REDO03.LOGITPUB个人空间5R|7aNc8G J:b Z1[
已复制         3个文件。

启动PRIMARY数据库创建STANDBY CONTROLFILE

SQL> STARTUPITPUB个人空间!f tr+Yr[0PUCb
ORACLE
例程已经启动。

Total System Global Area  251658240 bytesITPUB个人空间;[^X-J/_`!w1e ^)J
Fixed Size                  1290012 bytesITPUB个人空间)pB4p;x1J0LT W
Variable Size             163578084 bytesITPUB个人空间ds|_$^F$k
Database Buffers           79691776 bytes
5lM6U8h?QC/}-@0Redo Buffers                7098368 bytesITPUB个人空间YyD DL"ik Y
数据库装载完毕。
K_(\ U9?/hV0
数据库已经打开。
{q8C)[m G^6AV0SQL> ALTER DATABASE CREATE STANDBYCONTROLFILEAS'E:\ORACLE\ORADATA\YTKS\CONTROLFILE\CONTROL01.CTL';

数据库已更改。

E:\>COPY E:\ORACLE\10.2\DATABASE\PWDYTK.ORA E:\ORACLE\10.2\DATABASE\PWDYTKS.ORA
5vy~*q w~i0
已复制         1个文件。

拷贝数据库密码文件后,下面建立ORACLE的服务:

E:\>ORADIM -NEW -SID YTKS -STARTMODE MANUALITPUB个人空间 U)[vHvZmm5N
实例已创建。

编辑tnsnames.oralistener.ora文件,添加STANDBY数据库信息,并重启监听。

下面启动STANDBY数据库到MOUNT状态:

SQL> CONN /@YTKS AS SYSDBA
L(i-X R b~T0
已连接到空闲例程。ITPUB个人空间Qh;@!N$h7?r8c
SQL> CREATE SPFILE FROM PFILE='E:\ORACLE\ORADATA\YTKS\INITYTKS.ORA';

文件已创建。

SQL> STARTUP MOUNT
1Y?'onX*a WH0ORACLE
例程已经启动。

Total System Global Area  251658240 bytes
8e"hrg!|T0Fixed Size                  1290012 bytesITPUB个人空间Ua1Y uUG&])y
Variable Size              83886308 bytesITPUB个人空间aMff ?4KR
Database Buffers          159383552 bytesITPUB个人空间8B(Fa9u7IL
Redo Buffers                7098368 bytes
GOl7F z'Q9_0
数据库装载完毕。

由于参数LOG_FILE_NAME_CONVERT设置有误,将STANDBY数据库置于接受归档状态时,后覆盖PRIMARY数据库的日志,从而导致PRIMARY数据库出现错误。

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

数据库已更改。

下面关闭PRIMARY数据库就会出现错误:

SQL> CONN /@YTK AS SYSDBAITPUB个人空间c1y$JE5E(| gF
已连接。ITPUB个人空间C7~(x W {OM Qx
SQL> SHUTDOWN IMMEDIATE
^t,S_3o(BT7z0ORA-03113:
通信通道的文件结束

SQL> CONN /@YTK AS SYSDBAITPUB个人空间j*Aa;dt1F Z5w^
已连接到空闲例程。
\a$s:tZ AM!O,K |0SQL> STARTUP
)n8P2w YY(nkR G E~0ORA-03113:
通信通道的文件结束

检查alert文件已经出现了错误:

Errors in file e:\oracle\admin\ytk\bdump\ytk_lgwr_3588.trc:ITPUB个人空间#O`gy/nFn
ORA-00314:
日志1 (用于线程1)要求的序号13330不匹配ITPUB个人空间$_} O R.[LsAt
ORA-00312:
联机日志1线程1: 'E:\ORACLE\ORADATA\YTK\ONLINELOG\REDO01.LOG'

Tue Dec 11 16:14:05 2007
#N.q)wc Sk0Errors in file e:\oracle\admin\ytk\bdump\ytk_lgwr_3588.trc:
p"J)pav,Q4G(WOj0ORA-00314:
日志1 (用于线程1)要求的序号13330不匹配ITPUB个人空间%Yabwr7bN
ORA-00312:
联机日志1线程1: 'E:\ORACLE\ORADATA\YTK\ONLINELOG\REDO01.LOG'

Tue Dec 11 16:14:05 2007ITPUB个人空间~ xy"e(lJ4tZu
LGWR: terminating instance due to error 314ITPUB个人空间{#q;bMf'L"B.E;Y
Instance terminated by LGWR, pid = 3588

至此,数据库问题已经模拟出来。下一篇会介绍问题的解决。

 


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar