oracle 物理备份恢复

原创 2008年09月28日 09:25:00

ORACLE热备份恢复手册<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

1.   概要

1.1. 本文的目的

为了模拟测试oracle热备份的各种恢复情况,同时给以后工程人员一些实施借鉴,特地整理了本文档,在其中记录各种恢复的情况,以方便恢复时使用。

1.2. 系统概况

系统环境:hp unix11 oracle 9201

数据情况:一个系统文件、3个联机日志、一个回滚段表空、一个undo表空间、其他的数据文件,数据库当前使用undo

备份方式:热备份

备份文件:数据文件、归档日志、控制文件、初始化文件。

2.   恢复情况介绍

2.1. 模拟回滚表空间损坏丢失

当初设计时系统就同时并存了两种回滚段管理模式,目的就是当其中的一个出现问题的话,就可以立刻恢复。Undo8i时回滚段比,它的优势是自动管理回滚段,简化了管理工作。

下面介绍回滚表空间数据文件损坏时的恢复方式:

假设在undo表空间数据文件损坏时拥有所有的备份,系统存在回滚段表空间。

在数据库运行状态下删除undo表空间数据文件。

此时如果向数据库中写入数据,会出现如下错误:

SQL> exec sp_insert_del;
BEGIN sp_insert_del; END;

*
ERROR at line 1:
ORA-01116: error in opening database file 4
ORA-01110: data file 4: '/opt/oradata/openview/RBS2_1.dbf'
ORA-27041: unable to open file
HP-UX Error: 2: No such file or directory
Additional information: 3
ORA-06512: at "DBBACKUP.SP_INSERT_DEL", line 9
ORA-06512: at line 1

此时需要作的是修改数据库初始化参数,将他修改成为使用rollback_segment,同时将数据库加载,

SQL>startup <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />mountpfile='/opt/oracle/admin/openview/initopenview.ora'

然后删除回滚表空间的数据文件

SQL>alter database defile 4 offline off;

SQL>alter database open;

但是数据库启动后,察看如下信息,发现有大量属于回滚表空间的回滚段

SQL>select * from dba_rollback_segs;

此时如果想恢复原来的回滚表空间,需要修改初始化文件,在其中加入隐含参数_CORRUPTED_ROLLBACK_SEGMENTS,在其中加入回滚表空间的回滚段后,重新启动数据库,然后删除回滚表空间

SQL>drop tablespace undo2 INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS;

重新创建回滚表空间后,修改初始化参数后,然后重新启动数据库即可。

总结:当回滚表空间发生损坏时,需要将系统重新启动,这是必须的,对于24小时系统来说,这无疑是极为不利的一种情况,在这种情况下,需要的是双机热备的系统来保证系统24小时不间断运行。当出现系统崩溃的情况时,毫无疑问,需要备份机立即切换来保证系统运行,然后及时恢复生产系统。

2.2. 模拟非系统数据文件丢失

当非系统数据文件损坏时,有三种恢复方式,一种是拥有数据文件备份、归档日志备份以及其他的相关文件,此时可以做到的是完全的恢复;一种是有数据文件备份,但是归档日志不全;一种是没有数据文件备份,此时就需要将系统down下,然后恢复。

下面介绍第一种情况的恢复:

在数据库运行状态下删除数据文件,如果此时系统没有down机,那么采用以下方式恢复

SQL> alter database datafile '/opt/oradata/openview/ts_iptool_1.dbf' offline;

Database altered.

将备份文件拷贝回来,将数据文件online,提示需要恢复数据文件。

SQL> alter database datafile '/opt/oradata/openview/ts_iptool_1.dbf' online;
alter database datafile '/opt/oradata/openview/ts_iptool_1.dbf' online
*
ERROR at line 1:
ORA-01113: file 19 needs media recovery
ORA-01110: data file 19: '/opt/oradata/openview/ts_iptool_1.dbf'

执行媒体恢复,可以将数据文件online,由于有所有的归档日志和联机日志都存在,因此没有数据丢失。

SQL> recover datafile '/opt/oradata/openview/ts_iptool_1.dbf';
Media recovery complete.
SQL> alter database datafile '/opt/oradata/openview/ts_iptool_1.dbf' online;

Database altered.

总结:在数据库运行状态下,如果有数据文件损坏不能读取时,数据库不至于down下,此时如果发现的话,在拥有所有备份和归档日志、联机日志的情况下,可以及时恢复。

当数据库已经宕下时,需要在数据加载时恢复,将数据文件拷贝到正确的位置后,恢复步骤如下:

SQL> startup mount

SQL> recover database;

SQL>alter database open;

总结:在这种情况下,对于24小时系统来说是一个损失,为了保证系统的正确运行,需要双机备份来保证系统的高可用性。

仅仅拥有数据文件和部分归档日志的恢复:

如果数据库处于打开状态时,先将数据文件offline

SQL> alter database datafile '/opt/oradata/openview/ts_iptool_1.dbf' offline;

Database altered.

将备份文件拷贝回来,执行媒体恢复

SQL> recover datafile '/opt/oradata/openview/ts_iptool_1.dbf' until cancel;

选择auto,尽量多的实施归档日志。

然后再次执行以下语句,选择cancel,然后将数据文件online

SQL> recover datafile '/opt/oradata/openview/ts_iptool_1.dbf' until cancel;

Media recovery complete.
SQL> alter database datafile '/opt/oradata/openview/ts_iptool_1.dbf' online;

Database altered.

当数据库crash时,将

没有任何备份的恢复:备份文件拷贝回来,执行媒体恢复,

SQL> recover datafile '/opt/oradata/openview/ts_iptool_1.dbf' until cancel;

选择auto,尽量多的实施归档日志。

然后再次执行以下语句,选择cancel

SQL> recover datafile '/opt/oradata/openview/ts_iptool_1.dbf' until cancel;

Media recovery complete.
   
总结:将数据库打开后,最好作一个数据库全备份。

当系统没有备份时发生数据文件损坏的情况时,不可避免的会丢失数据,它的恢复比较简单,但是必须要将系统down下,将数据库启动到mount时,进行恢复。

SQL> startup mount

SQL> alter database datafile 6 offline drop;

SQL>alter database open;

此时在系统中还保留有丢失数据文件的字典信息,系统处于不一致状态。如果数据文件表空间的表remove到其他表空,可以将表空间删除重建,并将表再次move回来。

总结:这种情况下不可避免的会丢失数据,可能会丢失重要的数据文件,如果拥有备份,最多只能恢复到备份那一时刻的数据。

2.3. 模拟系统数据文件丢失

在数据库运行状态下删除系统数据文件,系统崩溃了,当拥有所有的备份时,系统是可以恢复的,恢复得步骤和2.2的第一种情况一样。

2.4. 模拟非当前联机日志文件丢失

如果丢失的联机日志不是当前的文件,那么他的恢复比较简单,只需要将日志清除即可。有两种情况,如果当联机日志已经归档,在数据库打开状态下删除不活动的联机日志时,可以用以下方式恢复。

SQL> alter database clear logfile group groupnumber;

或者在数据库加载时运行以上sql,系统会自动生成一个日志文件。

下面是一个恢复的例子:

SQL> select GROUP#, SEQUENCE#, ARCHIVED,STATUS  from v$log;

 

    GROUP#      SEQUENCE#        ARCHIVED STATUS

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

         4          209715200         YES INACTIVE

         5          209715200         YES INACTIVE

         6          209715200         NO  CURRENT

 SQL> !

$ mv log4.log log.log

$ exit

SQL> alter system switch logfile;

alter system switch logfile

*

ERROR at line 1:

ORA-03113: end-of-file on communication channel

当删除一个非当前的日志文件后系统切换到此文件时,不能读取次文件时,系统crash.将系统重新启动,发现系统不能打开。此时数据库处于mount状态

SQL> startup

ORACLE instance started.

 

Total System Global Area  267479512 bytes

Fixed Size                   735704 bytes

Variable Size             184549376 bytes

Database Buffers           81920000 bytes

Redo Buffers                 274432 bytes

Database mounted.

ORA-00313: open failed for members of log group 4 of thread 1

ORA-00312: online log 4 thread 1: '/opt/oradata/openview/log4.log'

修改数据库,清除归档的日志,然后将数据库打开。

SQL> alter database clear logfile group 4;

Database altered.

SQL> alter database open;

Database altered.

察看联机日志文件

SQL> !

$ ls *.log

log4.log  log5.log  log6.log

察看日志文件,发现日志组4 已经可以使用。

SQL> select GROUP#, SEQUENCE#, ARCHIVED,STATUS  from v$log;

    GROUP#     SEQUENCE#      ARCHIVED STATUS

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

         4         209715200       NO  CURRENT

         5         209715200       YES INACTIVE

         6         209715200       YES INACTIVE

假如在丢失已归档的联机日志时能够及时发现,那么就可以在数据库打开状态下清除日志,自动生成一个日志文件,保证数据库正常运行。

$ rm log6.log

$ exit

SQL> alter database clear logfile group 6;

Database altered.

$ ls log*.*

log4.log  log5.log  log6.log

总结:在恢复完成后,由于有一个日志文件没有归档,因此需要立即进行数据库全备份。

2.5. 模拟当前联机日志文件丢失

如果丢失的联机日志是当前的日志文件,如果数据库以及crash,那么需要在mount下进行恢复,恢复步骤也比较复杂。可以通过以下命令来恢复.

SQL>recover database until cancel;

恢复完成后还需要重新设置log来打开数据库.

如果数据库还处于打开状态,那么恢复比较简单,只要执行以下语句就可以恢复

SQL> alter database clear unarchived logfile group groupnumber;

以下举例说明在数据打开状态下,恢复需要执行的步骤。

SQL> !

$ ls log*.log

log4.log  log5.log  log6.log

$ mv log4.log log.log

$ exit

SQL> create table iptpa_test1 (n1 date) tablespace ts_iptool;

Table created.

SQL> insert into iptpa_test1 select sysdate from dual;

1 row created.

SQL> commit;

Commit complete.

SQL> alter system switch logfile;

从数据字典中可以看出日志4处于未归档状态,但是此时它已经被删除了。

SQL> select GROUP#, SEQUENCE#, ARCHIVED,STATUS  from v$log;

    GROUP#     SEQUENCE#      ARCHIVED STATUS

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

         4          209715200     NO  ACTIVE

         5          209715200     YES INACTIVE

         6          209715200      NO  CURRENT

重新切换日志,到日志4

SQL> alter system switch logfile;

System altered.

SQL> alter system switch logfile;

此时由于找不到日志组4 系统处于悬挂状态。因为此时数据库处于打开状态,可以执行以下命令进行日志清除并重建。

SQL> alter database clear unarchived logfile group 4;

Database altered.

$ ls log*.*

log4.log  log5.log  log6.log

$exit

    此时日志组4的序号是0,日志会在循环到大于系统当前最大的SEQUENCE#才会被使用。

SQL> select GROUP#, SEQUENCE#, ARCHIVED,STATUS  from v$log;

 

    GROUP#  SEQUENCE# ARC STATUS

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

         4          0 YES UNUSED

         5          7 NO  CURRENT

         6          6 YES INACTIVE

总结:我们知道数据库应该归档的日志没有归档后,需要做的第一件事就是做一个数据库的全备份。

当数据库以及crash,需要恢复的步骤如下:

$ mv log6.log log.bak

$ exit

 

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup

ORACLE instance started.

 

Total System Global Area  267479512 bytes

Fixed Size                   735704 bytes

Variable Size             184549376 bytes

Database Buffers           81920000 bytes

Redo Buffers                 274432 bytes

Database mounted.

ORA-00313: open failed for members of log group 6 of thread 1

ORA-00312: online log 6 thread 1: '/opt/oradata/openview/log6.log'

SQL> select GROUP#, SEQUENCE#, ARCHIVED,STATUS  from v$log;

 

    GROUP#  SEQUENCE# ARC STATUS

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

         4          8 YES INACTIVE

         5          7 YES INACTIVE

         6          9 NO  CURRENT

此时数据库处于mount状态,日志组6处于当前状态,执行清除未归档日志时会出现如下错误。

SQL> alter database clear unarchived logfile group 6;

alter database clear unarchived logfile group 6

*

ERROR at line 1:

ORA-00313: open failed for members of log group 6 of thread 1

ORA-00312: online log 6 thread 1: '/opt/oradata/openview/log6.log'

ORA-27037: unable to obtain file status

HP-UX Error: 2: No such file or directory

Additional information: 3

此时需要执行以下语句恢复数据库,在恢复时为了尽量多的使用归档日志恢复,先选择auto,最后才使用cancel选项。

SQL> recover database until cancel;

Media recovery complete.

SQL> alter database open resetlogs;

Database altered.

SQL> ho ls log*.log

log4.log  log5.log  log6.log

此时系统已经重新生成了日志,但是由于是以resetlogs方式打开的数据库,因此最好进行一下数据库的全备份。

总结:当丢失当前联机日志文件后,肯定会丢失数据,同时丢失归档日志,为了保证恢复的准确性,最好完成恢复后做一个数据库的全备份。

2.6. 模拟控制文件丢失

一般来说一个系统控制文件都有3个一样的互为备份的控制文件。如果仅仅是一个控制文件损坏或者丢失,可以将控制文件拷贝即可。但是由于现在的系统大多上都只有一个硬盘,因此当硬盘坏了的话,控制文件肯定就丢失了。现在就讨论如果控制文件全部丢失时如何恢复系统。

如果有备份的控制文件,注意,必须是使用以下语句生成的:

alter database BACKUP CONTROLFILE TO TRACE as 'crontrolfile.txt' reuse RESETLOGS ;

红色字体是可以备份的控制文件的路径和名称,最好写上绝对路径。

生成的控制文件,事实上是一组sql语句,功能是将数据库启动到nomount下,然后创建控制文件,然后将数据库加载,然后使用备份文件恢复,最后再将数据库以resetlogs方式打开,不过这个文件的注释是shell的注释,需要修改。以下是我做的一个例子。

1.        备份控制文件

  alter database BACKUP CONTROLFILE TO TRACE as '/opt/oradata/openview/cf.txt' reuse RESETLOGS ;

2.        删除控制文件

rm control01.ctl control02.ctl control03.ctl

3.        当数据库的控制文件全部丢失时,是必须用shutdown abort将数据库down下来

SQL> shutdown immeidate

SP2-0717: illegal SHUTDOWN option

SQL> shutdown immediate

 

ORA-00210: cannot open the specified controlfile

ORA-00202: controlfile: '/opt/oradata/openview/control01.ctl'

ORA-27041: unable to open file

HP-UX Error: 2: No such file or directory

Additional information: 3

SQL> shutdown abort

ORACLE instance shut down.

4.        使用sqlplus "/as sysdba"连接到数据库

5.        将数据库启动到nomount

SQL> startup nomount

ORACLE instance started.

Total System Global Area  267479512 bytes

Fixed Size                   735704 bytes

Variable Size             184549376 bytes

Database Buffers           81920000 bytes

Redo Buffers                 274432 bytes

6.        创建控制文件,完成后数据库已经处于mount状态

SQL> CREATE CONTROLFILE REUSE DATABASE "OPENVIEW" RESETLOGS  ARCHIVELOG

MAXLOGFILES 128

MAXLOGMEMBERS 5

MAXDATAFILES 500

MAXINSTANCES 1

MAXLOGHISTORY 226

LOGFILE

  GROUP 1 '/opt/oradata/openview/redo01.log'  SIZE 20M,

  GROUP 2 '/opt/oradata/openview/redo02.log'  SIZE 20M,

  GROUP 3 '/opt/oradata/openview/redo03.log'  SIZE 20M

DATAFILE

  '/opt/oradata/openview/system_1.dbf',

  '/opt/oradata/openview/temp_1.dbf',

  '/opt/oradata/openview/RBS1_1.dbf',

  '/opt/oradata/openview/tools_1.dbf',

  '/opt/oradata/openview/OV_DATA.dbf',

  '/opt/oradata/openview/OV_INDEX.dbf',

  '/opt/oradata/openview/OPC_1_1.dbf',

  '/opt/oradata/openview/OPC_2_1.dbf',

  '/opt/oradata/openview/OPC_3_1.dbf',

  '/opt/oradata/openview/OPC_4_1.dbf',

  '/opt/oradata/openview/OPC_5_1.dbf',

  '/opt/oradata/openview/OPC_6_1.dbf',

  '/opt/oradata/openview/OPC_7_1.dbf',

  '/opt/oradata/openview/OPC_8_1.dbf',

  '/opt/oradata/openview/OPC_9_1.dbf',

  '/opt/oradata/openview/OPC_10_1.dbf',

  '/opt/oradata/openview/OPC_INDEX1_1.dbf',

  '/opt/oradata/openview/OPC_INDEX2_1.dbf',

  '/opt/oradata/openview/OPC_INDEX3_1.dbf',

  '/opt/oradata/openview/TS_CM_1.dbf',

  '/opt/oradata/openview/TS_CM_IND_1.dbf',

  '/opt/oradata/openview/TS_PM_1.dbf',

  '/opt/oradata/openview/TS_PM_IND_1.dbf',

  '/opt/oradata/openview/TS_PMTMP_1.dbf',

  '/opt/oradata/openview/TS_TOOL_1.dbf',

  '/opt/oradata/openview/TS_SM_1.dbf',

  '/opt/oradata/openview/TS_FM_PT1_1.dbf',

  '/opt/oradata/openview/TS_FM_PT2_1.dbf',

  '/opt/oradata/openview/TS_FM_PT3_1.dbf',

  '/opt/oradata/openview/TS_FM_1.dbf',

  '/opt/oradata/openview/TS_FM_IND_1.dbf',

  '/opt/oradata/openview/boss_test_ts_1.dbf',

  '/opt/oradata/openview/boss_ipnms_ts_1.dbf',

  '/opt/oradata/openview/sddb_data.dbf',

  '/opt/oradata/openview/sddb_index.dbf',

  '/opt/oradata/openview/sddb_temp.dbf'

CHARACTER SET ZHS16CGB231280;

7.        执行数据库恢复

SQL> RECOVER DATABASE USING BACKUP CONTROLFILE;

ORA-00279: change 488461 generated at 12/23/2005 08:11:35 needed for thread 1

ORA-00289: suggestion : /opt/oracle/admin/openview/arch/T0001S0000000002.ARC

ORA-00280: change 488461 for thread 1 is in sequence #2

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

/opt/oracle/admin/openview/arch/T0001S0000000002.ARC

ORA-00308: cannot open archived log

'/opt/oracle/admin/openview/arch/T0001S0000000002.ARC'

ORA-27037: unable to obtain file status

HP-UX Error: 2: No such file or directory

Additional information: 3

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

cancel

Media recovery cancelled.

由于数据库是abort方式down的,因此T0001S0000000002.ARC没有正常归档,系统不存在这个日志文件。所以,选择cancel方式取消恢复。

8.        恢复完成后,需要以resetlogs方式打开数据库。

SQL> ALTER DATABASE OPEN RESETLOGS;

总结:由于控制文件丢失时,系统丢失所有的关键信息,归档日志号也需要重新计数,因此最好做一个全库备份。

Oracle手工物理备份和恢复

一、Oracle手工冷备份步骤:关闭数据库,备份所有的数据文件、日志文件、控制文件、PFILE、SPFILE。 二、基于冷备份的恢复方法如果机器故障,重装操作系统后的恢复方法总结如下(不重装系统的过程...
  • alvanchen
  • alvanchen
  • 2010年07月20日 13:30
  • 1036

oracle11g简单的物理全备份和恢复

1.查看所有数据文件 select * from dba_data_files; C:\ORACLE\ORADATA\ORCL\USERS01.DBF C:\ORACLE\ORADATA\ORCL\U...
  • wx5040257
  • wx5040257
  • 2017年09月03日 00:53
  • 148

win下mysql物理备份恢复 适用与mysql 恢复

查询mysql 安装目录下my.ini 文件 首先停止源数据库服务。然后拷贝data目录中对应数据库名称的目录(mydb),其中.frm文件为数据库表定义文件。 ...
  • weixin_37288522
  • weixin_37288522
  • 2017年05月03日 21:37
  • 766

Oracle 备份恢复 31个实验 1-6

备份恢复实验之一(第一个实验会稍微细一点,有些步骤类似的下一个实验就不再详细操作)      USERS表空间在线损坏(在线损坏就是数据库open后的损坏) 特别提示:为什么是USERS?...
  • empoli
  • empoli
  • 2012年10月07日 12:23
  • 705

阿里云RDS文档概述——备份恢复

备份恢复 创建备份 查看备份列表 从备份点创建临时实例 查看备份策略 修改备份策略   创建备份: 描述: 说明: 可用来创建一个备份,限制一天之内一个实例创建备份不超过10个。 实例状态要求: 必...
  • hyzhou33550336
  • hyzhou33550336
  • 2014年11月30日 10:46
  • 2172

Oracle备份恢复-手动完全恢复

dba基础课程:Oracle备份恢复-手动完全恢复 平台:redhat linux as5,oracle10g 备份和恢复对于数据库来说是非常重要的,如果没有有效的备份,那么数据的安全就是...
  • oraclestudyroad
  • oraclestudyroad
  • 2016年08月04日 09:34
  • 681

揭密备份恢复的原理!

揭密备份恢复的原理! http://www.itpub.net/thread-1065138-1-5.html
  • orion61
  • orion61
  • 2012年05月24日 20:28
  • 444

Oracle 备份 与 恢复 概述

玩Oracle也有2年的时间了, 零零散散的也整理一些资料。 东西一多了,就理不清楚。 所以结合张晓明的《大话Oracle RAC》的一些内容,和自己整理的一些笔记,对Oracle 的备份和恢复做了一...
  • tianlesoftware
  • tianlesoftware
  • 2010年04月15日 22:05
  • 13649

Oracle备份恢复-手动不完全恢复

dba基础课程:Oracle备份恢复-手动不完全恢复 平台:redhat linux as5,oracle10g 不完全恢复是指把数据库恢复到备份点和失败点之间某个时刻的状态,而且不完全恢...
  • oraclestudyroad
  • oraclestudyroad
  • 2016年08月04日 09:35
  • 429

《Oracle DBA 高可用、备份恢复与性能优化》目录

http://product.dangdang.com/23780007.html 目录 第1章  RAC真应用集群 1.1  单实例数据库并发控制原理 1.1.1  并发访问的数据不...
  • brucexia
  • brucexia
  • 2015年11月05日 17:37
  • 1349
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:oracle 物理备份恢复
举报原因:
原因补充:

(最多只允许输入30个字)