OCP认证考试指南(20):恢复Oracle数据库

1、恢复结构与进程

在介质失败后,根据受损文件的类型,存在不同的恢复方法。数据库由控制文件、联机重做日志文件以及数据文件组成。如果复用了控制文件或联机重做日志文件,那么恢复受损的这些文件十分容易。

对于受损的控制文件,可以将其替换为某个复用副本,也可以使用CREATE CONTROLFILE命令重建。

受损的联机重做日志文件可以被重新生成。Oracle提供了一个ALTER DATABASE CLEAR LOGFILE GROUP #(#代表受损成员的日志文件组号)命令,使用这个命令可以删除与重建某个日志文件组的成员。如果数据库在archivelog模式中运行,那么日志文件组必须在Oracle允许执行清除日志文件命令之前已被归档。上述命令的一种变化是ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP #,执行这个命令可以删除和重建一个即时已被成功归档的日志文件,但执行之后必须对整个数据库进行备份。

恢复受损数据文件需要使用备份与归档日志。在导致某个数据文件受损的介质失败之后,存在下列两种恢复选项:完全恢复,不会丢失任何数据;不完全恢复,通过在完成之前停止恢复进程来故意丢失一些数据。不完全恢复是一个高级过程;完全恢复是一个两阶段过程:首先,必须从备份中还原受损文件;之后,必须使用归档日志文件中的信息将数据库提前至被还原的文件与数据库其余部分同步的时刻,从而恢复这个文件。

在Oracle环境中,“还原”意味着使用备份替换受损的或丢失的文件,“恢复”意味着通过使用归档日志来同步受损文件与数据库的剩余部分。

因为RMAN从不备份联机重做日志,所以RMAN无法用于恢复受损的联机日志文件。RMAN能够还原与恢复控制文件和数据文件。

为了打开数据库,所有控制文件副本、每个联机日志文件组的至少一个成员以及所有联机数据文件都必须存在且同步。如果SMON进程在启动期间发现情况并非如此,那么启动就不会完成。如果某个控制文件副本受损或丢失,那么启动会停止在NOMOUNT模式中,告警日志中会写下受损控制文件副本的详细信息。假如控制文件没有任何问题,SMON进程会将继续打开数据库。

如果一个或多个数据文件是通过备份还原的,那么这些文件几乎肯定已过期较长时间,联机重做日志也无法返回至恢复上述文件的时间。此时,我们必须使用归档日志文件来进行恢复,这是一个必须手动启动的过程。

如果在数据库打开时出现介质损坏,那结果取决于受影响的文件。任何控制文件副本受损都会导致实例立即终止。作为SYSTEM表空间或活动的撤销表空间一部分的数据文件受损也会造成同样的结果。但是,在联机日志受损时,只要日志文件组中存在幸存的成员,那么就不会造成实例的终止。

和备份一样,RMAN也可以完成还原操作。如果RMAN备份操作生成的是备份集而非映像副本,那就只能使用RMAN进行还原操作,否则无法从备份集中抽取出数据文件。SQL*Plus命令或RMAN可以完成还原之后的恢复操作,但此时存在同样的限制,只有使用RMAN才能从备份集中抽取出归档日志。

2、介质失败后的恢复

2.1、恢复受损的复用控制文件

只要存在幸存的复用控制文件的副本,恢复丢失的控制文件就十分简单:只需要将其替换为幸存的控制文件副本。

控制文件受损,实例会立即终止。第一反应仍然是尝试启动崩溃的实例。启动在NOMOUNT模式中失败,同时会给出错误消息。

我们有3个选择:
第一选择,编辑参数文件,从而删除对受损或丢失的控制文件的引用。,能够解决问题,但数据库会在缺少一个复用控制文件副本的情况下运行,可能违背了指定的安全性原则。
第二选择,使用幸存的控制文件副本来替换受损的文件。
第三选择,修改CONTROL_FILES初始化参数,将对受损文件的引用替换为对某个新文件的引用,并将这个新文件复制为幸存的控制文件副本。

恢复受损的控制文件时必须数据库停机,这个操作无法在联机状态下完成。

做个例子试着恢复受损的控制文件

SQL> select * from v$controlfile;
 
STATUS  NAME                           IS_ BLOCK_SIZE FILE_SIZE_BLKS
------- ------------------------------ --- ---------- --------------
        /u02/oradata/ora/control01.ctl NO       16384            430
        /u02/oradata/ora/control02.ctl NO       16384            430
        /u02/oradata/ora/control03.ctl NO       16384            430
 
SQL> shutdown
Database closed.
Database dismounted.
ORACLE instance shut down.
 
SQL> exit

进入root,把这3个控制文件,剪切到别的地方。

$ su - root
口令:
# mv /u02/oradata/ora/control01.ctl /control01.ctl;
# mv /u02/oradata/ora/control02.ctl /control02.ctl; 
# mv /u02/oradata/ora/control03.ctl /control03.ctl; 
# su - oracle

再尝试启动Oracle,失败!之后,我们进入恢复操作。

$ sqlplus / as sysdba
 
SQL*Plus: Release 10.2.0.1.0 - Production on Tue Oct 14 23:44:41 2008
 
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
 
Connected to an idle instance.
 
SQL> startup
ORACLE instance started.
 
Total System Global Area  264241152 bytes
Fixed Size                  1218868 bytes
Variable Size              79693516 bytes
Database Buffers          180355072 bytes
Redo Buffers                2973696 bytes
ORA-00205: error in identifying control file,check alert log for more info
 
SQL> shutdown
ORA-01507: database not mounted
 
ORACLE instance shut down.
SQL> startup nomount
ORACLE instance started.
 
Total System Global Area  264241152 bytes
Fixed Size                  1218868 bytes
Variable Size              79693516 bytes
Database Buffers          180355072 bytes
Redo Buffers                2973696 bytes
 
SQL> alter system set
  2  control_files = '/u02/oradata/ora/control01.ctl'
  3  scope = spfile;
 
System altered.
 
SQL> shutdown
ORA-01507: database not mounted
 
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
 
Total System Global Area  264241152 bytes
Fixed Size                  1218868 bytes
Variable Size              79693516 bytes
Database Buffers          180355072 bytes
Redo Buffers                2973696 bytes
Database mounted.
Database opened.
 
SQL> select * from v$controlfile;
 
STATUS  NAME                           IS_ BLOCK_SIZE FILE_SIZE_BLKS
------- ------------------------------ --- ---------- --------------
        /u02/oradata/ora/control01.ctl NO       16384            430

2.2、恢复受损的复用联机重做日志文件

如果希望在数据库打开时恢复受损的复用联机重做日志文件,那么需要使用ALTER DATABASE CLEAR LOGFILE命令删除已有的日志文件,并且创建新的文件。上述操作只在这些日志文件不活动时进行。如果试图清空当前的日志文件组,或前一个日志文件组仍然是活动的,就会接收到出错消息。此外,如果数据库位于archivelog模式,日志文件组必须已归档。

尝试恢复受损的复用联机日志文件

SQL> conn / as sysdba
Connected.
 
SQL> select group, status, member from v$logfile order by group#;
 
    GROUPSTATUS  MEMBER
---------- ------- ----------------------------------------
         1         /u01/db/oracle/oradata/ora/redo01.log
         1         /u01/db/oracle/oradata/ora/redo01b.log
         2 STALE   /u01/db/oracle/oradata/ora/redo02b.log
         2 STALE   /u01/db/oracle/oradata/ora/redo02.log
         3 STALE   /u01/db/oracle/oradata/ora/redo03b.log
         3 STALE   /u01/db/oracle/oradata/ora/redo03.log
 
6 rows selected.
 
##########################################
# 以上查询,STATUS列不为NULL,可以执行下面命令多次,让日志文件组完成一次循环
##########################################
 
SQL> alter system switch logfile;
 
System altered.
 
SQL> alter system switch logfile;
 
System altered.
 
SQL> select group, status, member from v$logfile order by group#;
 
    GROUPSTATUS  MEMBER
---------- ------- ----------------------------------------
         1         /u01/db/oracle/oradata/ora/redo01.log
         1         /u01/db/oracle/oradata/ora/redo01b.log
         2         /u01/db/oracle/oradata/ora/redo02b.log
         2         /u01/db/oracle/oradata/ora/redo02.log
         3         /u01/db/oracle/oradata/ora/redo03b.log
         3         /u01/db/oracle/oradata/ora/redo03.log
 
6 rows selected.
 
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> host rm /u01/db/oracle/oradata/ora/redo01.log;
 
SQL> startup
ORACLE instance started.
 
Total System Global Area  264241152 bytes
Fixed Size                  1218868 bytes
Variable Size              79693516 bytes
Database Buffers          180355072 bytes
Redo Buffers                2973696 bytes
Database mounted.
Database opened.
SQL> alter system switch logfile;
 
System altered.
 
SQL> alter system switch logfile;
 
System altered.
 
SQL> alter system switch logfile;
 
System altered.
 
SQL> select group, status, member from v$logfile order by group#;
 
    GROUPSTATUS  MEMBER
---------- ------- ----------------------------------------
         1 INVALID /u01/db/oracle/oradata/ora/redo01.log
         1         /u01/db/oracle/oradata/ora/redo01b.log
         2         /u01/db/oracle/oradata/ora/redo02b.log
         2         /u01/db/oracle/oradata/ora/redo02.log
         3         /u01/db/oracle/oradata/ora/redo03b.log
         3         /u01/db/oracle/oradata/ora/redo03.log
 
6 rows selected.

可以看到,丢失的文件的此时被标记为INVALID。我们通过EM来让它可以使用。

em20

em21

选择Redo Log Group点击GO后,会把Redo Log显示出来。

em22

在Actions下拉列表选中Clear Logfile选项,日志单选按钮选中无效的1,点击GO。

SQL> select group, status, member from v$logfile order by group#;
 
    GROUPSTATUS  MEMBER
---------- ------- ----------------------------------------
         1         /u01/db/oracle/oradata/ora/redo01.log
         1         /u01/db/oracle/oradata/ora/redo01b.log
         2         /u01/db/oracle/oradata/ora/redo02b.log
         2         /u01/db/oracle/oradata/ora/redo02.log
         3         /u01/db/oracle/oradata/ora/redo03b.log
         3         /u01/db/oracle/oradata/ora/redo03.log
 
6 rows selected.

3、恢复受损的数据文件

如果介质失败导致一个或多个数据文件受到损坏,就需要使用还原与恢复:必须先还原数据文件的一个备份,再应用归档日志同步数据文件与数据库的其余部分。根据数据库是否位于archivelog模式中、受损文件是运行Oracle所需的重要文件还是“只”包含用户数据的非重要文件,恢复数据文件时存在多种可用的选项。

3.1、noarchivelog模式中数据文件的恢复

因为不存在恢复所需的归档日志文件,所以在noarchivelog模式中无法执行恢复操作。因此,只能完成还原操作。如果没有通过应用归档重做日志文件来同步一个被还原的数据文件与数据库的其余部分,数据库就不能被打开。因此,noarchivelog模式中的唯一选项是还原整个数据库(包括所有数据文件以及控制文件)。

因为RMAN不会备份联机重做日志文件,所以在执行完整的还原操作之后,数据库仍然会丢失这些文件。因为这个,还原之后的启动操作会失败,数据库将停止在加载模式中。因为位于加载模式,所以可以通过执行ALTER DATABASE CLEAR LOGFILE GROUP 命令重建所有日志文件组。之后,数据库会被打开。

3.2、archivelog模式中非重要文件的恢复

Oracle中组成SYSTEM表空间以及当前活动的撤销表空间(由UNDO_TABLESPACE参数决定)的数据文件被视为“重要文件”。任何重要的数据文件受损都会导致实例立即终止。

如果备份是使用RMAN生成的,那么受损数据文件的还原与恢复操作是完全自动的。只有在最近一次备份之后生成的所有归档日志文件都可用的情况下,才可以成功地完成数据文件的还原与完全恢复操作。

3.3、恢复受损的重要数据文件

重要的数据文件应当位于具有硬件冗余的磁盘系统中,从而在出现介质失败时保证这些文件能够幸存以及数据库保持打开状态。

重要数据文件与非重要数据文件的还原和恢复完全相同,不过重要数据文件应当在加载模式中完成还原和恢复。

重要数据文件受损并不意味着丢失数据,而是意味着会损失时间。

(恢复受损重要数据文件,书上版本和安装版本不一样,搞半天出不来,下次再做。)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值