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

前两天同事在测试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:oracleoradataYTKarchivelog 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:ORACLEORADATAYTKSINITYTKS.ORA' FROM SPFILE;

文件已创建。

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

*.audit_file_dest='E:oracleadminytksadump'
*.background_dump_dest='E:oracleadminytksbdump'
*.control_files='E:ORACLEORADATAYTK_SCONTROLFILECONTROL01.CTL'
*.core_dump_dest='E:oracleadminytkscdump'
*.user_dump_dest='E:oracleadminytksudump'
*.fal_client='ytks'
*.fal_server='ytk'
*.log_archive_dest_1='LOCATION=E:oracleoradataytksarchivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=ytks'
*.log_archive_dest_2='SERVICE=ytk LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ytk'
standby_archive_dest='LOCATION=E:oracleoradataytksarchivelog'
db_unique_name='ytks'
lock_name_space='ytks'
db_file_name_convert=('E:oracleoradataytk', 'E:oracleoradataytks')
log_file_name_convert=('E:oradleoradataytk', 'E:oracleoradataytks')

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

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

SQL> SHUTDOWN IMMEDIATE数据库已经关闭。已经卸载数据库。
ORACLE
例程已经关闭。

E:>COPY E:ORACLEORADATAYTKDATAFILE* E:ORACLEORADATAYTKSDATAFILE
E:ORACLEORADATAYTKDATAFILEO1_MF_SYSAUX_1TDY3TRF_.DBF
E:ORACLEORADATAYTKDATAFILEO1_MF_SYSTEM_1TDY2CXS_.DBF
E:ORACLEORADATAYTKDATAFILEO1_MF_TEMP_1TDY49L2_.TMP
E:ORACLEORADATAYTKDATAFILEO1_MF_UNDOTBS1_1TDY3GNZ_.DBF
E:ORACLEORADATAYTKDATAFILEO1_MF_USERS_1TDY4JMK_.DBF
E:ORACLEORADATAYTKDATAFILEO1_MF_YANGTK_1THCKSRW_.DBF
E:ORACLEORADATAYTKDATAFILEO1_MF_YANGTK_22MWCD5C_.DBF
E:ORACLEORADATAYTKDATAFILETEST01.DBF
已复制 8 个文件。

E:>COPY E:ORACLEORADATAYTKONLINELOG* E:ORACLEORADATAYTKSONLINELOG
E:ORACLEORADATAYTKONLINELOGREDO01.LOG
E:ORACLEORADATAYTKONLINELOGREDO02.LOG
E:ORACLEORADATAYTKONLINELOGREDO03.LOG
已复制 3 个文件。

启动PRIMARY数据库创建STANDBY CONTROLFILE

SQL> STARTUP
ORACLE
例程已经启动。

Total System Global Area 251658240 bytes
Fixed Size 1290012 bytes
Variable Size 163578084 bytes
Database Buffers 79691776 bytes
Redo Buffers 7098368 bytes
数据库装载完毕。数据库已经打开。
SQL> ALTER DATABASE CREATE STANDBY CONTROLFILE AS 'E:ORACLEORADATAYTKSCONTROLFILECONTROL01.CTL';

数据库已更改。

E:>COPY E:ORACLE10.2DATABASEPWDYTK.ORA E:ORACLE10.2DATABASEPWDYTKS.ORA已复制 1 个文件。

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

E:>ORADIM -NEW -SID YTKS -STARTMODE MANUAL实例已创建。

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

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

SQL> CONN /@YTKS AS SYSDBA已连接到空闲例程。
SQL> CREATE SPFILE FROM PFILE='E:ORACLEORADATAYTKSINITYTKS.ORA';

文件已创建。

SQL> STARTUP MOUNT
ORACLE
例程已经启动。

Total System Global Area 251658240 bytes
Fixed Size 1290012 bytes
Variable Size 83886308 bytes
Database Buffers 159383552 bytes
Redo Buffers 7098368 bytes
数据库装载完毕。

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

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

数据库已更改。

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

SQL> CONN /@YTK AS SYSDBA已连接。
SQL> SHUTDOWN IMMEDIATE
ORA-03113:
通信通道的文件结束

SQL> CONN /@YTK AS SYSDBA已连接到空闲例程。
SQL> STARTUP
ORA-03113:
通信通道的文件结束

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

Errors in file e:oracleadminytkbdumpytk_lgwr_3588.trc:
ORA-00314:
日志 1 (用于线程 1) 要求的序号 1333 0 不匹配
ORA-00312:
联机日志 1 线程 1: 'E:ORACLEORADATAYTKONLINELOGREDO01.LOG'

Tue Dec 11 16:14:05 2007
Errors in file e:oracleadminytkbdumpytk_lgwr_3588.trc:
ORA-00314:
日志 1 (用于线程 1) 要求的序号 1333 0 不匹配
ORA-00312:
联机日志 1 线程 1: 'E:ORACLEORADATAYTKONLINELOGREDO01.LOG'

Tue Dec 11 16:14:05 2007
LGWR: terminating instance due to error 314
Instance terminated by LGWR, pid = 3588

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

yangtingkun 发表于:2008.06.19 23:57 ::分类: ( ORACLE ) ::阅读:(807次) :: 评论 (1)
re: ORA-600(2662)错误的重现和解决(一) [回复]

right

yangtingkun 评论于: 2008.06.20 13:47

发表评论
标题

在此添加评论
表情符号: smile laughing tongue angry crying sad wassat wink

称呼

邮箱地址(可选)

个人主页(可选)

 authimage


切换风格
新闻聚合
博客日历
文章归档...
最新发表...
最新评论...
最多阅读文章...
最多评论文章...
博客统计...
Blog信息
网站链接...