ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 数据库的不完全恢复

数据库的不完全恢复

原创 Linux操作系统 作者:treesofthehill 时间:2012-05-11 17:22:41 0 删除 编辑

1           完全恢复

如果数据文件的一个备份与所有必需的归档日志、联机重做日志以及控制文件的副本都可用,那么在任意数量的任何数据文件受损的情况下,数据库都可以幸存,并且不会丢失任何数据。

数据文件(不包括system表空间和当前活动的撤销表空间)完全恢复步骤:

(1)       使受损的数据文件脱机

(2)       还原受损的数据文件

(3)       恢复受损的数据文件

(4)       使已恢复的数据文件联机

RMAN>run {

sql "alter tablespace example offline immediate"; --使受损的数据文件脱机

restore tablespace example;                  --还原受损的数据文件

recover tablespace example delete archivelog; --恢复受损的数据文件

         sql "alter tablespace example online";} --使已恢复的数据文件联机不完全恢复的场合

2           不完全恢复的方法

不完全恢复意味着会丢失数据。

需要不完全恢复的原因:

。无法进行完全恢复

。有意丢失某些数据

如果丢失了某个归档日志或丢失了当前联机重做日志的所有副本,那么就需要进行不完全恢复。

不完全恢复的方法:

sqlplus恢复

RMAN恢复

不完全恢复的步骤:

(1)       加载数据库。

(2)       还原所有数据文件,同时可以选择还原控制文件。

(3)       将数据库恢复至某个时间点、序列或系统改变号。

(4)       使用resetlogs关键字打开数据库。

不完全恢复与完全恢复的不同点:

(1)       只要损失文件不是关键文件就可以进行不完全恢复,不完全恢复只能在加载模式中进行。

(2)       所有不完全恢复操作都会首先还原所有的数据文件。

(3)       应用来自归档日志的重做,将还原的文件恢复至指定的时间点。

(4)       使用resetlogs关键字打开数据库,会创建新的数据库的一个新场景。

数据库的场景(incarnation):指的是数据库的一个版本,该版本具有从日志切换序列号1开始的新重做线程。

执行不完全恢复时,必须作为SYSDBA用户进行连接。

不完全恢复的选项:

(1)       恢复至某个时间点(until time):通过应用重做将数据文件向后回滚至某个特定的时间点,时间精度为妙。一般用于修正用户错误。

(2)       恢复至某个系统改变号(rman:until scn;sqlplus:until change):用于已知出差时准确的系统改变号。

(3)       恢复至某个日志序列号(rman:until sequence;sqlplus:until cancel):用于丢失某个某个归档日志文件或联机重做文件组。

不完全恢复的最优方法:

。恢复前,完整地关闭数据库。

。在不完全恢复完后,应当进行一次全部备份操作。

。在不完全恢复完后,查看不完全备份是否真正成功。通过startup restrict命令来验证。

。在不完全恢复完后,将前一个场景的归档日志全部删除。

3           使用sqlplus进行不完全恢复

3.1          until time恢复

步骤:

Shutdown immediate;

Startup mount;

Recover database until time ‘2012-01-01:18:18:18’;

Alter database open resetlogs;

Until time 恢复的格式是固定的,也就是必须为“yyyy-mm-dd:hh24:mi:ss”。

3.2          until cancel恢复

查询视图v$log确定以丢失的当前日志文件组的日志序列号

执行until cancel恢复将数据库恢复至该日志序列号

Recover database until cancel

3.3          until change恢复

执行until change恢复将数据库恢复至某个系统改变号

Recovery database until change 101101;

Until change 恢复会停止在指定scn(101101)前的scn(101100)

4           使用RMAN的不完全恢复

4.1          until time恢复

RMAN>run {

               allocate channel d1 type disk;

               allocate channel t1 type sbt_tape;

               shutdown immediate;

               startup mount;

               sql "alter session set nls_date_format=''dd-mon-yyyy hh24:mi:ss''";

               set until time '1-jan-2012 18:18:18';

               restore database

               recover database;

               alter database open resetlogs;}

4.2          until sequence 恢复

RMAN>run {

               shutdown immediate;

               startup mount;

               set until sequence 10303 thread 1;

               restore database;

               recover database;

               alter database open resetlogs;}

4.3          until scn 恢复

RMAN>run {

               shutdown immediate;

               startup mount;

               set until scn 38831;

               restore database;

               recover database;

               alter database open resetlogs;}

例子:

1 准备

system@ORCL>select log_mode from v$database;

LOG_MODE

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

ARCHIVELOG

 

system@ORCL>select archiver from v$instance;

ARCHIVE

-------

STARTED

 

system@ORCL>set time on

14:51:30 system@ORCL>create table test_rec as select * from all_users;

 

表已创建。

1        RMAN备份

C:\>rman target /

 

恢复管理器: Release 10.2.0.4.0 - Production on 星期四 5 10 14:53:57 2012

 

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

 

连接到目标数据库: ORCL (DBID=1308114557)

 

RMAN> backup database;

启动 backup 10-5 -12

使用目标数据库控制文件替代恢复目录

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: sid=138 devtype=DISK

通道 ORA_DISK_1: 启动全部数据文件备份集

通道 ORA_DISK_1: 正在指定备份集中的数据文件

输入数据文件 fno=00002

name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DATAFILE\O1_MF

_UNDOTBS1_7RBDDGN0_.DBF

输入数据文件 fno=00001

name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DATAFILE\O1_MF

_SYSTEM_7RBDD3PY_.DBF

输入数据文件 fno=00003

name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DATAFILE\O1_MF

_SYSAUX_7RBDDK4D_.DBF

输入数据文件 fno=00004

name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DATAFILE\O1_MF

_USERS_7RBDDPSW_.DBF

输入数据文件 fno=00005

name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DATAFILE\OCP10

GDATA01.DBF

输入数据文件 fno=00006

name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DATAFILE\UNDO0

2.DBF

输入数据文件 fno=00007

name=E:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\UNDO_NG01.DBF

 

输入数据文件 fno=00008

name=E:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\UNDO_G01.DBF

通道 ORA_DISK_1: 正在启动段 1 10-5 -12

通道 ORA_DISK_1: 已完成段 1 10-5 -12

段句柄

=E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\BACKUPSET\2012_05_10\O1_MF_NNNDF_TAG20120510T145710_7TPSP7TC_.BKP 标记

=TAG20120510T145710 注释=NONE

通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:46

完成 backup 10-5 -12

 

启动 Control File and SPFILE Autobackup 10-5 -12

handle=E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\AUTOBACKUP\2012_05_1

0\O1_MF_S_782924276_7TPSQOQG_.BKP comment=NONE

完成 Control File and SPFILE Autobackup 10-5 -12

2        删除新建的表

14:52:18 system@ORCL>

14:59:08 system@ORCL>

14:59:15 system@ORCL>drop table test_rec;

 

表已删除。

 

14:59:33 system@ORCL>select count(*) from test_rec;

select count(*) from test_rec

                     *

1 行出现错误:

ORA-00942: 表或视图不存在

3        RMAN恢复

RMAN>run {

              shutdown immediate;

              startup mount;

              sql "alter session set nls_date_format=''yyyy-mm-dd hh24:mi:ss''";

              set until time '2012-05-10 14:59:15';

              restore database;

              recover database;

              alter database open resetlogs;}

使用目标数据库控制文件替代恢复目录

数据库已关闭

数据库已卸装

Oracle 实例已关闭

 

已连接到目标数据库 (未启动)

Oracle 实例已启动

数据库已装载

 

系统全局区域总计     532676608 字节

 

Fixed Size                     1297700 字节

Variable Size                301990620 字节

Database Buffers             222298112 字节

Redo Buffers                   7090176 字节

 

sql 语句: alter session set nls_date_format=''yyyy-mm-dd hh24:mi:ss''

 

正在执行命令: SET until clause

 

启动 restore 10-5 -12

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: sid=156 devtype=DISK

 

通道 ORA_DISK_1: 正在开始恢复数据文件备份集

通道 ORA_DISK_1: 正在指定从备份集还原的数据文件

正将数据文件00001还原到

E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DATAFILE\O1_MF_SYST

EM_7RBDD3PY_.DBF

正将数据文件00002还原到

E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DATAFILE\O1_MF_UNDO

TBS1_7RBDDGN0_.DBF

正将数据文件00003还原到

E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DATAFILE\O1_MF_SYSA

UX_7RBDDK4D_.DBF

正将数据文件00004还原到

E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DATAFILE\O1_MF_USER

S_7RBDDPSW_.DBF

正将数据文件00005还原到

E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DATAFILE\OCP10GDATA

01.DBF

正将数据文件00006还原到

E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DATAFILE\UNDO02.DBF

正将数据文件00007还原到

E:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\UNDO_NG01.DBF

正将数据文件00008还原到

E:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\UNDO_G01.DBF

通道 ORA_DISK_1: 正在读取备份片段

E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\O

RCL\BACKUPSET\2012_05_10\O1_MF_NNNDF_TAG20120510T145710_7TPSP7TC_.BKP

通道 ORA_DISK_1: 已还原备份片段 1

段句柄 =

E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\BACKUPSET\2012_05_10\O1_MF_NNNDF_TAG20120510T145710_7TPSP7TC_.BKP 标记 =

TAG20120510T145710

通道 ORA_DISK_1: 还原完成, 用时: 00:02:07

完成 restore 10-5 -12

 

启动 recover 10-5 -12

使用通道 ORA_DISK_1

 

正在开始介质的恢复

介质恢复完成, 用时: 00:00:03

 

完成 recover 10-5 -12

 

数据库已打开

4        检查是否恢复成功

15:22:43 system@ORCL>select count(*) from test_rec;

  COUNT(*)

----------

        25

15:22:48 system@ORCL>select group#,sequence#, status from v$log;

    GROUP#  SEQUENCE# STATUS

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

         1          1 CURRENT

         2          0 UNUSED

         3          0 UNUSED

5        备份一个新的备份

RMAN> backup database;

 

5           使用EM的不完全恢复

拥有sysdba的用户才能进行不完全恢复。

6           控制文件的恢复

控制文件的恢复采用用于不完全恢复的方法,实际上不会丢失数据。

需要还原控制文件的一种特殊情况是:表空间被删除。

6.1          创建新的控制文件

sys@ORCL>alter database backup controlfile to trace;

数据库已更改。

USER_DUMP_DEST parameter 指定的目录中生成一个跟踪文件。这个跟踪文件中含有create controlfile命令的语句,通过这条语句就可以生成控制文件。

6.2          使用sqlplus还原控制文件

关闭数据库,直接使用操作系统命令进行copy

数据库在线时使用以下命令

sys@ORCL>alter database backup controlfile to 'd:\control_bak.ctl';

数据库已更改。

在数据库加载时,使用以下命令进行恢复

sys@ORCL>recover database until cancel using backup controlfile;

6.3          使用RMAN还原控制文件

RMAN备份控制文件的方法

RMAN>backup as copy current controlfile;

RMAN>backup as backupset current controlfile;

RMAN>backup tablespace system including current controlfile;

RMAN>configure controlfile autobackup on;

RMAN还原控制文件

RMAN>restore controlfile from autobackup;

Or

RMAN>set dbid 1234567890

RMAN>run{

               startup nomount;

               restore controlfile from autobackup;

               alter database mount;

               recover database;

               alter database open resetlogs;}     

例子:

1 PMAN备份

RMAN> configure controlfile autobackup on;

RMAN> backup database;

 

启动 backup 10-5 -12

使用通道 ORA_DISK_1

通道 ORA_DISK_1: 启动全部数据文件备份集

通道 ORA_DISK_1: 正在指定备份集中的数据文件

输入数据文件 fno=00002

name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DATAFILE\O1_MF

_UNDOTBS1_7RBDDGN0_.DBF

输入数据文件 fno=00001

name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DATAFILE\O1_MF

_SYSTEM_7RBDD3PY_.DBF

输入数据文件 fno=00003

name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DATAFILE\O1_MF

_SYSAUX_7RBDDK4D_.DBF

输入数据文件 fno=00004

name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DATAFILE\O1_MF

_USERS_7RBDDPSW_.DBF

输入数据文件 fno=00005

name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DATAFILE\OCP10

GDATA01.DBF

输入数据文件 fno=00006

name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DATAFILE\UNDO0

2.DBF

输入数据文件 fno=00007

name=E:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\UNDO_NG01.DBF

 

输入数据文件 fno=00008

name=E:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\UNDO_G01.DBF

通道 ORA_DISK_1: 正在启动段 1 10-5 -12

通道 ORA_DISK_1: 已完成段 1 10-5 -12

段句柄

=E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\BACKUPSET\2012_05_10\O1_MF_NNNDF_TAG20120510T152551_7TPVD0SW_.BKP 标记

=TAG20120510T152551 注释=NONE

通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:46

完成 backup 10-5 -12

 

启动 Control File and SPFILE Autobackup 10-5 -12

handle=E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\AUTOBACKUP\2012_05_10\O1_MF_S_782925997_7TPVFFYR_.BKP comment=NONE

完成 Control File and SPFILE Autobackup 10-5 -12

1         模拟全部控制文件丢失

sys@ORCL>select name from v$controlfile;

NAME

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

E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROLFILE\O1_MF_7RBDCXXS_.CTL

 

E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\CONTROLFILE\

O1_MF_7RBDCY2G_.CTL

 

E:\ORACLE\CONTROLFILE\CONTROL03_.CTL

 

sys@ORCL>select dbid from v$database;

      DBID

----------

1308114557

 

sys@ORCL>shutdown abort;

ORACLE 例程已经关闭。

idle>startup;

ORACLE 例程已经启动。

Total System Global Area  532676608 bytes

Fixed Size                  1297700 bytes

Variable Size             301990620 bytes

Database Buffers          222298112 bytes

Redo Buffers                7090176 bytes

ORA-00205: ?????????, ??????, ???????

2         RMAN恢复控制文件

RMAN> set dbid 1308114557

Set dbid命令要在run{}运行块外部运行。

正在执行命令: SET DBID

 

RMAN> run{

2>         shutdown abort;

3>              startup nomount;

4>              restore controlfile from autobackup;

5>              alter database mount;

6>              recover database;

7>              alter database open resetlogs;}

 

Oracle 实例已关闭

 

已连接到目标数据库 (未启动)

Oracle 实例已启动

 

系统全局区域总计     532676608 字节

 

Fixed Size                     1297700 字节

Variable Size                301990620 字节

Database Buffers             222298112 字节

Redo Buffers                   7090176 字节

 

启动 restore 10-5 -12

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: sid=157 devtype=DISK

 

恢复区目标: E:\oracle\product\10.2.0\flash_recovery_area

用于搜索的数据库名 (或数据库的唯一名称): ORCL

通道 ORA_DISK_1: 在恢复区域中找到自动备份

通道 ORA_DISK_1: 已找到的自动备份: E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\

ORCL\AUTOBACKUP\2012_05_10\O1_MF_S_782927356_7TPWQXCQ_.BKP

通道 ORA_DISK_1: 从自动备份复原控制文件已完成

输出文件名=E:\ORACLE\PRODUCT\

10.2.0\ORADATA\ORCL\CONTROLFILE\O1_MF_7RBDCXXS_.CTL

 

输出文件名=E:\ORACLE\PRODUCT\

10.2.0\FLASH_RECOVERY_AREA\ORCL\CONTROLFILE\O1_MF_7RBDCY2G_.CTL

输出文件名=E:\ORACLE\CONTROLFILE\CONTROL03_.CTL

完成 restore 10-5 -12

 

数据库已装载

释放的通道: ORA_DISK_1

 

启动 recover 10-5 -12

启动 implicit crosscheck backup 10-5 -12

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: sid=157 devtype=DISK

已交叉检验的 22 对象

完成 implicit crosscheck backup 10-5 -12

 

启动 implicit crosscheck copy 10-5 -12

使用通道 ORA_DISK_1

已交叉检验的 1 对象

完成 implicit crosscheck copy 10-5 -12

 

搜索恢复区中的所有文件

正在编制文件目录...

目录编制完毕

 

已列入目录的文件的列表

=======================

文件名: E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\AUTOBACKUP\

2012_05_10\O1_MF_S_782927356_7TPWQXCQ_.BKP

 

使用通道 ORA_DISK_1

 

正在开始介质的恢复

 

存档日志线程 1 序列 1 已作为文件

E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ONLINELOG\O1_MF_1_7RBDCYRW_.LOG 存在于磁盘上

存档日志文件名

=E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ONLINELOG\O1_M

F_1_7RBDCYRW_.LOG 线程 =1 序列 =1

介质恢复完成, 用时: 00:00:03

完成 recover 10-5 -12

 

数据库已打开

3         确认控制文件是否恢复

sys@ORCL>select name from v$controlfile;

NAME

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

E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROLFILE\O1_MF_7RBD

CXXS_.CTL

 

E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\CONTROLFIL

E\O1_MF_7RBDCY2G_.CTL

 

E:\ORACLE\CONTROLFILE\CONTROL03_.CTL

 

sys@ORCL>select dbid from v$database;

      DBID

----------

1308114557

 

7           使用RESETLOGS操作的恢复

为归档日志生成名称时,应当使oracle能够区分不同场景产生的日志。

Sql>alter system set log_archive_format=’arch_%d_%t_%r_%s.log’

sys@ORCL>show parameter log_archive_format

NAME                   TYPE        VALUE

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

log_archive_format       string      arch_%d_%t_%r_%s.log

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9537053/viewspace-723376/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-06-11

  • 博文量
    97
  • 访问量
    179830