Oracle非关键文件恢复,redo、临时文件、索引文件、密码文件

吃鸡数据库 2014-09-29

增量备份的应用在recovery阶段,不再restore阶段

了解数据库设置表:
SQL>desc database_properties
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 PROPERTY_NAME                            NOT NULL VARCHAR2(30)
 PROPERTY_VALUE                                    VARCHAR2(4000)
 DESCRIPTION                                        VARCHAR2(4000)

关键性与非关键性
非关键性文件是指数据库和大多数应用程序没有它也能继续运行的文件。例如,如果数据库丢失了一个多路复用重做日志文件,仍可使用其它重做日志文件副本来保持数据库持续运行。
虽然丢失非关键性文件不会导致数据库崩溃,但它会削弱数据库的功能。例如:丢失索引表空间会导致应用程序和查询的运行速度大幅减慢,或者,如果这些索引用于强制实施约束,则丢失后甚至会导致应用程序无法使用。
丢失联机重做日志组(只要不是当前联机日志组)会导致在 LGWR 下一次尝试写入组时数据库操作被挂起,直到生成新的日志文件为止。


丢失临时表空间会使用户无法运行查询或创建索引,直到将这些用户分配到新的临时表空间为止。
 --10g时丢失临时表空间,数据库不能启动,当11g时,丢失了临时文件,数据库会自动创建一个同名同位的临时文件;
 --11g中发生此情时发生这种情况时,启动过程中会在预警日志中显示类似下面的消息:
 --
Re-creating tempfile /u01/app/Oracle/oradata/orcl/temp01.dbf
----------------------------------------------------------------------------------------------------------------

一、日志成员丢失:
    要处理重做日志文件的丢失问题,了解重做日志组的可能状态非常重要。在 Oracle DB 正常运行过程中,重做日志组会循环经历三种不同的状态。按照循环的顺序,状态分别是:

CURRENT:此状态表明 LGWR 正在向重做日志组写入数据,以记录数据库中正在进行的所有事务处理的重做数据。该日志组将保持此状态,直到切换至其它日志组为止。

ACTIVE:重做日志组仍包含恢复实例所需的重做数据。这是尚未执行检查点期间重做日志组所处的状态,重做日志组中出现的所有数据更改都将写出到数据文件。

INACTIVE:上述检查点已经执行,这表示不再需要该重做日志组来恢复实例,它可以变为下一个 CURRENT 日志组。

对在线redo log的操作:

查看日志组的状态:
SQL>select GROUP#,SEQUENCE#,MEMBERS,ARCHIVED,STATUS from v$log;

    GROUP#  SEQUENCE#    MEMBERS ARC STATUS
---------- ---------- ---------- --- ----------------
        1          7          2 YES INACTIVE
        2          8          2 NO  CURRENT
        3          6          2 YES INACTIVE
查看日志文件的状态:
SQL>select GROUP# ,TYPE,MEMBER from v$logfile;

    GROUP# TYPE      MEMBER
---------- -----------------------------------------------------------------
        3 ONLINE
/u01/app/oracle/oradata/PROD/onlinelog/o1_mf_3_b22567o2_.log

        3 ONLINE
/u01/app/oracle/fast_recovery_area/PROD/onlinelog/o1_mf_3_b2256827_.log

        2 ONLINE
/u01/app/oracle/oradata/PROD/onlinelog/o1_mf_2_b2255zsg_.log

        2 ONLINE
/u01/app/oracle/fast_recovery_area/PROD/onlinelog/o1_mf_2_b22560gb_.log

        1 ONLINE
/u01/app/oracle/oradata/PROD/onlinelog/o1_mf_1_b2255npg_.log

        1 ONLINE
/u01/app/oracle/fast_recovery_area/PROD/onlinelog/o1_mf_1_b2255nxl_.log

  --删除原有的日志组;(只操作状态为inactive的日志组)
  --若要操作日志组为current时,需先进行日志切换:alter system switch logfile;
  --若为active时,则可强制进行检查点:alter system checkpoint;

1.操作日志文件;

1).当某个日志组中的一个数据文件丢失,对其在线操作,先添加,再删除;

alter database add logfile member '/u01/app/oracle/oradata/PROD/onlinelog/o1_mf_2_b_.log' to group 2;

alter database drop logfile member '/u01/app/oracle/oradata/PROD/onlinelog/o1_mf_1_b2255npg_.log' to group 2;

2).在线添加一个组,再添加一个成员;

SQL>alter database add logfile group 4 '/u01/app/oracle/oradata/ORCL/onlinelog/redo04.log'size 100m;

SQL>alter database add logfile member'/u01/app/oracle/oradata/ORCL/onlinelog/redo04_b.log' to group 4;

3).查看日志组及成员;
SQL>select GROUP#,members,BYTES/1024/1024 size_M,STATUS,ARCHIVED from v$log;


2.日志文件丢失,重启或alter system switch logfile 触发报错;生产库中一般是日志切换触发错误;

1)丢失非current redo日志组

select a.group#, a.status, a.archived,b.member from v$log a,v$logfile b where a.group#=b.group#;
  --查看日志组状态及文件虽在位置

$rm /u01/app/oracle/oradata/ENMOEDU/redo09*
    --删除第九组的全部文件
$ls /u01/app/oracle/oradata/ENMOEDU/redo09*
    --查看是否删除成功
   
Sql> shutdown immediate
Sql> startup
    --重启数据库触发出错
Sql> startup mount
Sql> alter database clear logfile group 9;
    --重建了第九组的了两个文件,两个文件都是空的;
Sql> alter database open;

 cat  /u01/app/oracle/oradata/ENMOEDU/redo03*;
    --查看物理地址,查看是否生成文件


SQL>select GROUP#,members,BYTES/1024/1024 size_M,STATUS,ARCHIVED from v$log;
    --查看日志组及成员


Alert日志中的错误:
Errors in file

/u01/app/oracle/diag/rdbms/enmoedu/ENMOEDU/trace/ENMOEDU_lgwr_35031.trc:
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: '/u01/app/oracle/oradata/ENMOEDU/redo01.log'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
Errors in file /u01/app/oracle/diag/rdbms/enmoedu/ENMOEDU/trace/ENMOEDU_lgwr_35031.trc:
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: '/u01/app/oracle/oradata/ENMOEDU/redo01.log'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3

2).丢失当前redo日志组

select a.group#, a.status, a.archived,b.member
from v$log a,v$logfile b
where a.group#=b.group#;

$rm /u01/app/oracle/oradata/ENMOEDU/redo09*;

alter system switch logfile;
/
/
数据库出现hanging现象,在alert.log中报错;

或重启数据库触发错误:
Sql> shutdown immediate
Sql> startup
  --触发出错
SQL> startup mount
ORACLE instance started.

Total System Global Area  237998080 bytes
Fixed Size                  2227216 bytes
Variable Size            192938992 bytes
Database Buffers          37748736 bytes
Redo Buffers                5083136 bytes
Database mounted.

SQL> alter database clear logfile group 9;
    --丢失current状态日志组,不能这样恢复

alter database clear logfile group 9
*
ERROR at line 1:
ORA-00350: log 9 of instance ENMOEDU (thread 1) needs to be archived
ORA-00312: online log 9 thread 1: '/u01/app/oracle/oradata/ENMOEDU/redo03.log'


SQL> alter database clear unarchived logfile group 9;
    --无归档恢复
Database altered.

验证:

!ls /u01/app/oracle/oradata/ENMOEDU/
 
SQL> select GROUP#,members,BYTES/1024/1024 size_M,STATUS,ARCHIVED from v$log;


----------------------------------------------------------------------------------------------------------------


二、丢失临时文件:

1.--查看临时文件的位置及名称
SYS>select name from v$tempfile;
/u01/app/oracle/oradata/PROD/datafile/o1_mf_temp_b22570tq_.tmp

2.--删除临时文件
SYS>!rm /u01/app/oracle/oradata/PROD/datafile/o1_mf_temp_b22570tq_.tmp

3.--触发错误,临时文件未找到
SYS>create global temporary table tab_temp as select * from dba_objects;
create global temporary table tab_temp as select * from dba_objects
                                                        *
ERROR at line 1:
ORA-01116: error in opening database file 201
ORA-01110: data file 201:
'/u01/app/oracle/oradata/PROD/datafile/o1_mf_temp_b22570tq_.tmp'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3

4.在知道临时数据文件丢失时,可以不需要重新启动数据库就可以在丢失了临时文件后进行恢复;

SQL> ALTER TABLESPACE temp ADD TEMPFILE '/u01/app/oracle/oradata/orcl/temp02.dbf' SIZE 20M;
 Tablespace altered.

 

SQL> ALTER TABLESPACE temp DROP TEMPFILE '/u01/app/oracle/oradata/orcl/temp01.dbf';
 

Tablespace altered.
 

5. 1)在11g中还可以重启数据库,数据库会自动重建临时数据文件,可以查看alert日志看相关信息(一般直接第4步就可以了)

shutdown immediate;

SYS>startup
ORACLE instance started.
Total System Global Area  839282688 bytes
Fixed Size                  2257880 bytes
Variable Size            545262632 bytes
Database Buffers          289406976 bytes
Redo Buffers                2355200 bytes
Database mounted.
Database opened.

SYS>select name from v$tempfile;
/u01/app/oracle/oradata/PROD/datafile/o1_mf_temp_b29o0g6r_.tmp

1 row selected.
  --数据库重建

2)在11g以前,如数据库不能重起,可以创建新的临时表空间:

create temporary tablespace temp2 tempfile
'/u01/app/oracle/oradata/orcl/temp2.dbf' size 10m reuse autoextend on  maxsize  200m;

SQL>alter database default temporary tablespace temp2;
  --将新的表空间设置为默认的临时表空间

SQL>drop tablespace temp including contents and datafiles;
  --删除旧的表空间及其数据

SQL>ALTER TABLESPACE temp ADD TEMPFILE '/u01/app/oracle/oradata/orcl/temp2.dbf' SIZE 20M;
  --给临时表空间添加文件

SYS>select * from database_properties
        where property_name='DEFAILT_TEMP_TABLESPACE';  --查看当前数据库默认数据库

相关推荐