Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2840306
  • 博文数量: 599
  • 博客积分: 16398
  • 博客等级: 上将
  • 技术积分: 6875
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-30 12:04
个人简介

WINDOWS下的程序员出身,偶尔也写一些linux平台下小程序, 后转行数据库行业,专注于ORACLE和DB2的运维和优化。 同时也是ios移动开发者。欢迎志同道合的朋友一起研究技术。 数据库技术交流群:58308065,23618606

文章分类

全部博文(599)

文章存档

2014年(12)

2013年(56)

2012年(199)

2011年(105)

2010年(128)

2009年(99)

分类: Oracle

2010-01-04 12:58:16

上一篇介绍了非归档模式的非当前联机日志文件的丢失的解决方法
这篇介绍非归档模式的当前联机日志文件的丢失。

    由于丢失的当前的联机日志文件,所以可能会丢失部分数据,破坏数据库的完整性,而且普通的重建
日志文件的方式是不可行的,这个时候我们需要借助隐含参数_ALLOW_READ_ONLY_CORRUPTION或者
_ALLOW_RESETLOGS_CORRUPTION打开数据库。打开完数据库后立即用EXP/EXPDP导出数据,然后重建数据库。如果有备份,我们可以考虑借助备份恢复,但是由于数据库处于非归档模式,即使是备份也是数据库某
一个时间点的快照,所以会丢失从备份时间点到现在的数据。当然用隐含参数打开数据库,会破坏数据库的完整性。
SQL> SELECT NAME,OPEN_MODE,LOG_MODE FROM V$DATABASE;
NAME      OPEN_MODE  LOG_MODE
--------- ---------- ------------
TOMSYAN   READ WRITE NOARCHIVELOG
SQL> SELECT GROUP#,SEQUENCE#,STATUS FROM V$LOG;
    GROUP#  SEQUENCE# STATUS
---------- ---------- ----------------
         1        106 INACTIVE
         2        104 INACTIVE
         3        107 CURRENT
SQL> SELECT MEMBER FROM V$LOGFILE WHERE GROUP#=3;
MEMBER
--------------------------------------------------------------------------------
C:\ORACLE\PRODUCT\10.2.0\ORADATA\TOMSYAN\REDO03.LOG
SQL> SHUTDOWN IMMEDIATE
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> HOST DEL C:\ORACLE\PRODUCT\10.2.0\ORADATA\TOMSYAN\REDO03.LOG
SQL> STARTUP
ORACLE 例程已经启动。
Total System Global Area  612368384 bytes
Fixed Size                  1250428 bytes
Variable Size             239078276 bytes
Database Buffers          364904448 bytes
Redo Buffers                7135232 bytes
数据库装载完毕。
ORA-00313: 无法打开日志组 3 (用于线程 1) 的成员
ORA-00312: 联机日志 3 线程 1:
'C:\ORACLE\PRODUCT\10.2.0\ORADATA\TOMSYAN\REDO03.LOG'

SQL> SELECT GROUP#,SEQUENCE#,STATUS FROM V$LOG;
    GROUP#  SEQUENCE# STATUS
---------- ---------- ----------------
         1        106 INACTIVE
         3        107 CURRENT
         2        104 INACTIVE
SQL> ALTER DATABASE CLEAR LOGFILE GROUP 3;
ALTER DATABASE CLEAR LOGFILE GROUP 3
*
第 1 行出现错误:
ORA-00313: 无法打开日志组 3 (用于线程 1) 的成员
ORA-00312: 联机日志 3 线程 1:
'C:\ORACLE\PRODUCT\10.2.0\ORADATA\TOMSYAN\REDO03.LOG'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
 
即使日志文件存在,如果日志文件损坏,重建当前的日志文件也不可行。

利用隐含参数_ALLOW_READ_ONLY_CORRUPTION打开数据库

SQL> ALTER SYSTEM SET "_ALLOW_READ_ONLY_CORRUPTION"=TRUE SCOPE=SPFILE;
系统已更改。
SQL> SHUTDOWN IMMEDIATE;
ORA-01109: 数据库未打开

已经卸载数据库。
ORACLE 例程已经关闭。
SQL> STARTUP MOUNT
ORACLE 例程已经启动。
Total System Global Area  612368384 bytes
Fixed Size                  1250428 bytes
Variable Size             239078276 bytes
Database Buffers          364904448 bytes
Redo Buffers                7135232 bytes
数据库装载完毕。
SQL> ALTER DATABASE OPEN READ ONLY;
数据库已更改。
SQL> SELECT NAME,OPEN_MODE,LOG_MODE FROM V$DATABASE;
NAME      OPEN_MODE  LOG_MODE
--------- ---------- ------------
TOMSYAN   READ ONLY  NOARCHIVELOG
 
这种以只读方法打开的数据库,并不会重建当前的日志文件,优点不会对当前的数据文件造成破坏。

赶紧导出数据库吧。
 
利用隐含参数_ALLOW_RESETLOGS_CORRUPTION打开数据库
SQL> ALTER SYSTEM RESET "_ALLOW_READ_ONLY_CORRUPTION" SCOPE=SPFILE SID='*';
系统已更改。
SQL> ALTER SYSTEM SET "_ALLOW_RESETLOGS_CORRUPTION"=TRUE SCOPE=SPFILE;
系统已更改。

SQL> SHUTDOWN IMMEDIATE
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> STARTUP MOUNT
ORACLE 例程已经启动。
Total System Global Area  612368384 bytes
Fixed Size                  1250428 bytes
Variable Size             239078276 bytes
Database Buffers          364904448 bytes
Redo Buffers                7135232 bytes
数据库装载完毕。
下面需要做一次 media recover 不要OPEN 或者直接OPEN RESETLOGS方式打开数据库。
SQL> RECOVER DATABASE UNTIL CANCEL;
完成介质恢复。
SQL> ALTER DATABASE OPEN RESETLOGS;
数据库已更改。
 
如果 OPEN 方式打开数据库 会有下面的错误
SQL> ALTER DATABASE OPEN ;
ALTER DATABASE OPEN
*
第 1 行出现错误:
ORA-03113: 通信通道的文件结束
如果 OPEN RESETLOGS 方式打开数据库 会有下面的错误
SQL> ALTER DATABASE OPEN RESETLOGS;
ALTER DATABASE OPEN RESETLOGS
*
第 1 行出现错误:
ORA-01139: RESETLOGS 选项仅在不完全数据库恢复后有效。
   通过这种方法打开数据库,Oracle会重建日志文件。
通过隐含参数打开数据库,Oracle会跳过数据库的一致性检查,对数据库造成一定的负面影响。这个时候
我们应该立即导出数据,重建个空数据库,然后再导入,以防数据库以后遇到麻烦。
阅读(2071) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~