本文共 4554 字,大约阅读时间需要 15 分钟。
前两天同事在测试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'*.background_dump_dest='E:\oracle\admin\ytks\bdump'*.control_files='E:\ORACLE\ORADATA\YTK_S\CONTROLFILE\CONTROL01.CTL'*.core_dump_dest='E:\oracle\admin\ytks\cdump'*.user_dump_dest='E:\oracle\admin\ytks\udump'*.fal_client='ytks'*.fal_server='ytk'*.log_archive_dest_1='LOCATION=E:\oracle\oradata\ytks\archivelog 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:\oracle\oradata\ytks\archivelog'db_unique_name='ytks'lock_name_space='ytks'db_file_name_convert=('E:\oracle\oradata\ytk', 'E:\oracle\oradata\ytks')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数据库已经关闭。已经卸载数据库。ORACLE 例程已经关闭。
E:\>COPY E:\ORACLE\ORADATA\YTK\DATAFILE\* E:\ORACLE\ORADATA\YTKS\DATAFILEE:\ORACLE\ORADATA\YTK\DATAFILE\O1_MF_SYSAUX_1TDY3TRF_.DBFE:\ORACLE\ORADATA\YTK\DATAFILE\O1_MF_SYSTEM_1TDY2CXS_.DBFE:\ORACLE\ORADATA\YTK\DATAFILE\O1_MF_TEMP_1TDY49L2_.TMPE:\ORACLE\ORADATA\YTK\DATAFILE\O1_MF_UNDOTBS1_1TDY3GNZ_.DBFE:\ORACLE\ORADATA\YTK\DATAFILE\O1_MF_USERS_1TDY4JMK_.DBFE:\ORACLE\ORADATA\YTK\DATAFILE\O1_MF_YANGTK_1THCKSRW_.DBFE:\ORACLE\ORADATA\YTK\DATAFILE\O1_MF_YANGTK_22MWCD5C_.DBFE:\ORACLE\ORADATA\YTK\DATAFILE\TEST01.DBF已复制 8 个文件。
E:\>COPY E:\ORACLE\ORADATA\YTK\ONLINELOG\* E:\ORACLE\ORADATA\YTKS\ONLINELOGE:\ORACLE\ORADATA\YTK\ONLINELOG\REDO01.LOGE:\ORACLE\ORADATA\YTK\ONLINELOG\REDO02.LOGE:\ORACLE\ORADATA\YTK\ONLINELOG\REDO03.LOG已复制 3 个文件。
启动PRIMARY数据库创建STANDBY CONTROLFILE:
SQL> STARTUPORACLE 例程已经启动。
Total System Global Area 251658240 bytesFixed Size 1290012 bytesVariable Size 163578084 bytesDatabase Buffers 79691776 bytesRedo Buffers 7098368 bytes数据库装载完毕。数据库已经打开。SQL> ALTER DATABASE CREATE STANDBY CONTROLFILE AS 'E:\ORACLE\ORADATA\YTKS\CONTROLFILE\CONTROL01.CTL';
数据库已更改。
E:\>COPY E:\ORACLE\10.2\DATABASE\PWDYTK.ORA E:\ORACLE\10.2\DATABASE\PWDYTKS.ORA已复制 1 个文件。
拷贝数据库密码文件后,下面建立ORACLE的服务:
E:\>ORADIM -NEW -SID YTKS -STARTMODE MANUAL实例已创建。
编辑tnsnames.ora和listener.ora文件,添加STANDBY数据库信息,并重启监听。
下面启动STANDBY数据库到MOUNT状态:
SQL> CONN /@YTKS AS SYSDBA已连接到空闲例程。SQL> CREATE SPFILE FROM PFILE='E:\ORACLE\ORADATA\YTKS\INITYTKS.ORA';
文件已创建。
SQL> STARTUP MOUNTORACLE 例程已经启动。
Total System Global Area 251658240 bytesFixed Size 1290012 bytesVariable Size 83886308 bytesDatabase Buffers 159383552 bytesRedo 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 IMMEDIATEORA-03113: 通信通道的文件结束
SQL> CONN /@YTK AS SYSDBA已连接到空闲例程。SQL> STARTUPORA-03113: 通信通道的文件结束
检查alert文件已经出现了错误:
Errors in file e:\oracle\admin\ytk\bdump\ytk_lgwr_3588.trc:ORA-00314: 日志 1 (用于线程 1) 要求的序号 1333 与 0 不匹配ORA-00312: 联机日志 1 线程 1: 'E:\ORACLE\ORADATA\YTK\ONLINELOG\REDO01.LOG'
Tue Dec 11 16:14:05 2007Errors in file e:\oracle\admin\ytk\bdump\ytk_lgwr_3588.trc:ORA-00314: 日志 1 (用于线程 1) 要求的序号 1333 与 0 不匹配ORA-00312: 联机日志 1 线程 1: 'E:\ORACLE\ORADATA\YTK\ONLINELOG\REDO01.LOG'
Tue Dec 11 16:14:05 2007LGWR: terminating instance due to error 314Instance terminated by LGWR, pid = 3588
至此,数据库问题已经模拟出来。下一篇会介绍问题的解决。
转载地址:http://dhnkm.baihongyu.com/