Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2452154
  • 博文数量: 367
  • 博客积分: 10016
  • 博客等级: 上将
  • 技术积分: 3555
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-04 15:12
个人简介

MEI SHENME

文章分类

全部博文(367)

文章存档

2009年(2)

2008年(1)

2007年(2)

2006年(362)

我的朋友

分类: Oracle

2006-09-05 15:09:36

当我们使用一个数据库时,总希望数据库的内容是可靠的、正确的,但由于计算机系统的故障(硬件故障、软件故障、网络故障、进程故障和系统故障)影响数据库系统的操作,影响数据库中数据的正确性,甚至破坏数据库,使数据库中全部或部分数据丢失。因此当发生上述故障后,希望能重构这个完整的数据库,该处理称为数据库恢复。恢复过程大致可以分为复原(Restore)与恢复(Recover)过程。

 

数据库恢复可以分为以下两类:

 

1.1实例故障的一致性恢复


当实例意外地(如掉电、后台进程故障等)或预料地(发出SHUTDOUM ABORT语句)中止时出现实例故障,此时需要实例恢复。实例恢复将数据库恢复到故障之前的事务一致状态。如果在在线后备发现实例故障,则需介质恢复。在其它情况Oracle在下次数据库起动时(对新实例装配和打开),自动地执行实例恢复。如果需要,从装配状态变为打开状态,自动地激发实例恢复,由下列处理:


??(1 为了解恢复数据文件中没有记录的数据,进行向前滚。该数据记录在在线日志,

包括对回滚段的内容恢复。

??(2 回滚未提交的事务,按步1重新生成回滚段所指定的操作。

??(3 释放在故障时正在处理事务所持有的资源。

??(4 解决在故障时正经历一阶段提交的任何悬而未决的分布事务。


1.2
介质故障或文件错误的不一致恢复


介质故障是当一个文件、一个文件的部分或磁盘不能读或不能写时出现的故障。文件错误一般指意外的错误导致文件被删除或意外事故导致文件的不一致。这种状态下的数据库都是不一致的,需要DBA手工来进行数据库的恢复,这种恢复有两种形式,决定于数据库运行的归档方式和备份方式。

 

1 完全介质恢复可恢复全部丢失的修改。一般情况下需要有数据库的备份且数据库运行在归档状态下并且有可用归档日志时才可能。对于不同类型的错误,有不同类型的完全恢复可使用,其决定于毁坏文件和数据库的可用性。

 

2 不完全介质恢复是在完全介质恢复不可能或不要求时进行的介质恢复。重构受损的数据库,使其恢复介质故障前或用户出错之前的一个事务一致性状态。不完全介质恢复有不同类型的使用,决定于需要不完全介质恢复的情况,有下列类型:基于撤消、基于时间和基于修改的不完全恢复。


??基于撤消(CANCEL)恢复:在某种情况,不完全介质恢复必须被控制,DBA可撤消在指定点的操作。基于撤消的恢复地在一个或多个日志组(在线的或归档的)已被介质故障所破坏,不能用于恢复过程时使用,所以介质恢复必须控制,以致在使用最近的、未损的日志组于数据文件后中止恢复操作。

 

??基于时间(TIME)和基于修改(SCN)的恢复:如果DBA希望恢复到过去的某个指定点,是一种理想的不完全介质恢复,一般发生在恢复到某个特定操作之前,恢复到如意外删除某个数据表之前。

 

第二章. 数据库恢复案例测试环境


2.1
数据库环境

以下的所有案例都是通过测试经过,环境为:

  OSWindows 2000 Server

  DBOracle 816

  DBNAMETEST


数据文件:

SQL> select file#,status,enabled,name from v$datafile;

 

    FILE# STATUS  ENABLED      NAME

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

         1 SYSTEM  READ WRITE D:\Oracle\ORADATA\TEST\SYSTEM01.DBF

         2 ONLINE  READ WRITE D:\Oracle\ORADATA\TEST\RBS01.DBF

         3 ONLINE  READ WRITE D:\Oracle\ORADATA\TEST\USERS01.DBF

         4 ONLINE  READ WRITE D:\Oracle\ORADATA\TEST\TEMP01.DBF

         5 ONLINE  READ WRITE D:\Oracle\ORADATA\TEST\TOOLS01.DBF

         6 ONLINE  READ WRITE D:\Oracle\ORADATA\TEST\INDX01.DBF


控制文件:

SQL> select * from v$controlfile;

 

STATUS  NAME

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

        D:\Oracle\ORADATA\TEST\CONTROL01.CTL

        D:\Oracle\ORADATA\TEST\CONTROL02.CTL

        D:\Oracle\ORADATA\TEST\CONTROL03.CTL


联机日志:

SQL> select * from v$logfile;

 

    GROUP# STATUS      MEMBER

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

      1     STALE      D:\Oracle\ORADATA\TEST\REDO01.LOG

      2               D:\Oracle\ORADATA\TEST\REDO02.LOG

      3     STALE      D:\Oracle\ORADATA\TEST\REDO03.LOG

 

2.2 数据库备份脚本

冷备份脚本:

rem     script:coldbak.sql

rem     creater:chenjiping

rem     date:5.8.2003

rem     desc:offline full backup database

 

--connect database

connect internal/password;

--shutdown database

shutdown immediate;

--Copy Data file

!xcopy d:\Oracle\oradata\test\*.dbf d:\database/H/R;

--Copy Control file

!xcopy d:\Oracle\oradata\test\*.ctl d:\database/H/R;

--Copy Log file

!xcopy d:\Oracle\oradata\test\*.log d:\database/H/R;

--startup database

startup;

 

说明:

1、以上脚本在数据库关闭状态下备份数据库所有的数据文件,联机日志,控制文件(在一个目

录下),如果成功备份,所有文件是一致的;

2、没有备份参数文件,参数文件可以另外备份,没有必要每次都备份,只需要在改变设置后备份一次;

3、如果以上命令没有成功依次执行,那么备份将是无效的,如连接数据库不成功,那么肯定关闭数据库也不成功,那么备份则无效;

4、冷备份建议下人工干预下执行。

 

数据库OS热全备份脚本

rem     script:hotbak.sql

rem     creater:chenjiping

rem     date:5.8.2003

rem     desc:backup all database datafile in archive

 

--connect database

connect internal/password;

 

--archive

alter system archive log current;

--start

 

alter tablespace system begin backup;

!xcopy d:\Oracle\oradata\test\system01.dbf d:\databak/H/R;

alter tablespace system end backup;

 

alter tablespace rbs begin backup;

!xcopy d:\Oracle\oradata\test\rbs01.dbf d:\databak/H/R;

alter tablespace rbs end backup;

 

alter tablespace users begin backup;

!xcopy d:\Oracle\oradata\test\users01.dbf d:\databak/H/R;

alter tablespace users end backup;

 

alter tablespace tools begin backup;

!xcopy d:\Oracle\oradata\test\tools01.dbf d:\databak/H/R;

alter tablespace tools end backup;

 

alter tablespace indx begin backup;

!xcopy d:\Oracle\oradata\test\indx01.dbf d:\databak/H/R;

alter tablespace indx end backup;

--end

 

--bak control file

--binary

alter database backup controlfile to 'd:\databak\controlbinbak.000';

--ascii

alter database backup controlfile to trace;

 

alter system archive log current;


说明:

1、热备份必须在数据库归档方式下才可以运行;

2、以上脚本可以在数据库运行状态下备份数据库所有的数据文件(除了临时数据文件),没有必要备份联机日志;

3、归档日志至少需要一次完整备份之后的所有日志;

4、如果以上命令没有成功依次执行,那么备份也是无效的,如连接数据库不成功,那么备份则无效。

 

RMAN备份只讲叙有恢复目录的情况,如果没有恢复目录,情形大致相似。以下是RMAN的热备份全备份的脚本:

#   script:bakup.rcv

#   creater:chenjiping

#   date:5.8.2003

#   desc:backup all database datafile in archive with rman

 

# connect database

connect rcvcat rman/rman@back;

connect target internal/virpure;

 

# start backup database

run{

allocate channel c1 type disk;

backup full tag 'dbfull' format 'd:\backup\full%u_%s_%p' database

include current controlfile;

sql 'alter system archive log current';

release channel c1;

}

# end

 

说明:

1 数据库必须运行在归档模式下;

2 RMAN将自动备份数据文件,运行可靠;

3 归档日志另外备份处理,但至少需要保存一次备份来的日志;

4 没有必要用RMAN做冷备份,效果不好。

 

以上举例说明了数据库的恢复案例的测试环境与部分备份测试脚本,其它的备份脚本可以根据以上脚本演变而来或在案例中加以说明。

数据库的自动实例将不加以说明,这里只举例说明媒体错误或人为错误造成的恢复可能。

以上包括以下案例都是在WINDOWS+Oracle816上测试验证的,在不同的操作系统与不同的数据库版本中略有差别。

 

第三章. 了解与恢复相关的信息

 

1 理解报警日志文件

报警日志文件一般记载了数据库的启动/关闭信息,归档信息,备份信息,恢复信息,常见错误信息,部分数据库修改记录等。一般令名规则为Alrt.logAlrt.log,如我的测试数据库的报警日志文件的名称为testalrt.log

 

报警日志文件的路径是根据初始化参数background_dump_dest来决定的,如在我的机器上,该参数值为 D:\Oracle\admin\test\bdump,那么,你就可以在该路径下找到该文件。


2 后台进程跟踪文件

后台进程跟踪文件的路径与报警日志文件的路径一致,在某些情况下,你可以通过后台跟踪文件的信息了解更多的需要恢复的信息。如在数据库需要恢复的时候,报警日志文件中常有这样的语句:


Errors in file D:\Oracle\admin\test\bdump\testDBW0.TRC:

ORA-01157: cannot identify/lock data file 1 - see DBWR trace file

通过提示的DBWR跟踪文件,可以查询到更详细的信息。


3
v$recover_filev$recovery_log

这是两个动态性能视图,可以在mount下查看,通过这两个视图,你可以了解详细的需要恢复的数据文件与需要使用到的归档日志。


第四章. 数据库恢复案例


4.1
非归档模式下的备份与恢复


备份方案:采用OS冷备份

 

1.  连接数据库并创建测试表

SQL> connect internal/password as sysdba;

Connected.

SQL> create table test(a int);

Table created

SQL> insert into test values(1);

1 row inserted

SQL> commit;

Commit complete

 

2.  备份数据库

SQL> @coldbak.sql 或在DOS svrmgrl @coldbak.sql

 

3.  再插入记录

SQL> insert into test values(2);

1 row inserted

SQL> commit;

Commit complete

SQL> select * from test;

                         A

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

                         1

                         2

4.  关闭数据库

SQL> shutdown immediate;

Database closed.

Database dismounted.

Oracle instance shut down.

 

5.  毁坏一个或多个数据文件,如删除user01.dbf

C:\>del D:\Oracle\ORADATA\TEST\USERS01.DBF

模拟媒体毁坏。

 

6.  重新启动数据库,会发现如下错误

SQL> startup

Oracle instance started.

 

Total System Global Area  102020364 bytes

Fixed Size                    70924 bytes

Variable Size              85487616 bytes

Database Buffers           16384000 bytes

Redo Buffers                  77824 bytes

Database mounted.

ORA-01157: cannot identify/lock data file 3 - see DBWR trace file

ORA-01110: data file 3: 'D:\Oracle\ORADATA\TEST\USERS01.DBF'

 

在报警文件中,会有更详细的信息

Errors in file D:\Oracle\admin\test\bdump\testDBW0.TRC:

ORA-01157: cannot identify/lock data file 3 - see DBWR trace file

ORA-01110: data file 3: 'D:\Oracle\ORADATA\TEST\USERS01.DBF'

ORA-27041: unable to open file

OSD-04002: unable to open file

O/S-Error: (OS 2) 系统找不到指定的文件。

 

7.  拷贝备份复原到原来位置(restore过程)

C:\>xcopy d:\database\*.* d:\Oracle\oradata\test/H/R/S

 

8.  打开数据库,检查数据

SQL> alter database open;

Database altered.

SQL> select * from test;

                         A

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

                         1

 

这里可以发现,数据库恢复成功,但在备份之后与崩溃之前的数据丢失了。


说明:

1、非归档模式下的恢复方案可选性很小,一般情况下只能有一种恢复方式,就是数据库的冷备
份的完全恢复,仅仅需要拷贝原来的备份就可以(restore),不需要recover

2、这种情况下的恢复,可以完全恢复到备份的点上,但是可能是丢失数据的,在备份之后与崩溃之前的数据将全部丢失;

3、不管毁坏了多少数据文件或是联机日志或是控制文件,都可以通过这个办法恢复,因为这个恢复过程是Restore所有的冷备份文件,而这个备份点上的所有文件是一致的,与最新的数据库没有关系,就好比把数据库又放到了一个以前的""上;

4、对于非归档模式下,最好的办法就是采用OS的冷备份,建议不要用RMAN来作冷备份,效果不好,因为RMAN不备份联机日志,restore不能根本解决问题;

5、如果没有备份联机日志,如RMAN的备份,就需要利用不完全恢复(until cancel)的方法来重新创建联机日志文件。


4.2归档模式下丢失或损坏一个数据文件


4.2.1 OS备份方案

在归档方式下损坏或丢失一个数据文件,如果存在相应的备份与该备份以来的归档日志,恢复还是比较简单的,可以作到尽量少的Down机时间,并能作到数据库的完全恢复。


1 连接数据库,创建测试表并插入记录

SQL> connect internal/password as sysdba;

Connected.

SQL> create table test(a int) tablespace users;

Table created

SQL> insert into test values(1);

1 row inserted

SQL> commit;

Commit complete

 

2 备份数据库

SQL> @hotbak.sql 或在DOS svrmgrl @hotbak.sql

 

3 继续在测试表中插入记录

SQL> insert into test values(2);

1 row inserted

SQL> commit;

Commit complete

SQL> select * from test;

                         A

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

                         1

                         2

SQL> alter system switch logfile;

System altered.

SQL> alter system switch logfile;

System altered.

 

4 关闭数据库,模拟丢失数据文件

SQL> shutdown immediate;

Database closed.

Database dismounted.

Oracle instance shut down

C:\>del D:\Oracle\ORADATA\TEST\USERS01.DBF

模拟媒体毁坏。

 

5 启动数据库错误,脱机该数据文件:

SQL> startup

Oracle instance started.

 

Total System Global Area  102020364 bytes

Fixed Size                    70924 bytes

Variable Size              85487616 bytes

Database Buffers           16384000 bytes

Redo Buffers                  77824 bytes

Database mounted.

ORA-01157: cannot identify/lock data file 3 - see DBWR trace file

ORA-01110: data file 3: 'D:\Oracle\ORADATA\TEST\USERS01.DBF'


还可以查看报警文件(见上一个恢复案例)或动态视图v$recover_file

SQL> select * from v$recover_file;

 

     FILE# ONLINE  ERROR                    CHANGE#    TIME

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

         3   ONLINE                        1013500    2003-05-07

 

脱机数据文件

SQL> alter database datafile 3 offline drop;

Database altered.

 

6 打开数据库,拷贝备份回来(restore),恢复(recover)该数据文件,并联机:


SQL> alter database open;

Database altered.


拷贝备份从备份处

copy d:\databak\ users01.dbf d:\Oracle\oradata\test;


恢复该数据文件

SQL> recover datafile 3;


ORA-00279: change 1053698 generated at 05/07/2003 17:51:26 needed for

thread 1

ORA-00289: suggestion :
D:\Oracle\ORADATA\TEST\ARCHIVE\TESTT001S00304.ARC

ORA-00280: change 1053698 for thread 1 is in sequence #304

 

Specify log: {=suggested | filename | AUTO | CANCEL}

AUTO

ORA-00279: change 1053701 generated at 05/07/2003 17:51:39 needed for

thread 1

ORA-00289: suggestion : D:\Oracle\ORADATA\TEST\ARCHIVE\TESTT001S00305.ARC

ORA-00280: change 1053701 for thread 1 is in sequence #305

ORA-00278: log file 'D:\Oracle\ORADATA\TEST\ARCHIVE\TESTT001S00304.ARC' no longer needed for this recovery Log applied.

Media recovery complete.


恢复成功,联机该数据文件

SQL> alter database datafile 3 online;

Database altered.

 

7 检查数据库的数据(完全恢复)

SQL> select * from test;

                         A

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

                         1

                         2

说明:

1、采用热备份,需要运行在归档模式下,可以实现数据库的完全恢复,也就是说,从备份后到数据库崩溃时的数据都不会丢失;

2、可以采用全备份数据库的方式备份,对于特殊情况,也可以只备份特定的数据文件,如只备份用户表空间(一般情况下对于某些写特别频繁的数据文件,可以单独加大备份频率);

3、如果在恢复过程中,发现损坏的是多个数据文件,即可以采用一个一个数据文件的恢复方法(第5步中需要对数据文件一一脱机,第6步中需要对数据文件分别恢复),也可以采用整个数据库的恢复方法;

4、如果是系统表空间的损坏,不能采用此方法。

 

4.2.2 RMAN备份方案


RMAN也可以进行联机备份,而且备份与恢复方法将比OS备份更简单可靠。

1、连接数据库,创建测试表并插入记录

SQL> connect internal/password as sysdba;

Connected.

 

SQL> create table test(a int) tablespace users;

Table created

SQL> insert into test values(1);

1 row inserted

SQL> commit;

Commit complete

 

2 备份数据库表空间users

C:\>rman

Recovery Manager: Release 8.1.6.0.0 - Production

RMAN> connect rcvcat rman/rman@back

RMAN-06008: connected to recovery catalog database

RMAN> connect target internal/virpure

RMAN-06005: connected to target database: TEST (DBID=1788174720)

 

RMAN> run{

2> allocate channel c1 type disk;

3> backup tag 'tsuser' format 'd:\backup\tsuser_%u_%s_%p'

4> tablespace users;

5> release channel c1;

6> }

 

RMAN-03022: compiling command: allocate

RMAN-03023: executing command: allocate

RMAN-08030: allocated channel: c1

RMAN-08500: channel c1: sid=16 devtype=DISK

 

RMAN-03022: compiling command: backup

RMAN-03025: performing implicit partial resync of recovery catalog

RMAN-03023: executing command: partial resync

RMAN-08003: starting partial resync of recovery catalog

RMAN-08005: partial resync complete

RMAN-03023: executing command: backup

RMAN-08008: channel c1: starting full datafile backupset

RMAN-08502: set_count=5 set_stamp=494177612 creation_time=16-MAY-03

RMAN-08010: channel c1: specifying datafile(s) in backupset

RMAN-08522: input datafile fno=00003 name=D:\Oracle\ORADATA\TEST\USER01.DBF

RMAN-08013: channel c1: piece 1 created

RMAN-08503: piece handle=D:\BACKUP\TSUSER_05EN93AC_5_1 comment=NONE

RMAN-08525: backup set complete, elapsed time: 00:00:01

RMAN-03023: executing command: partial resync

RMAN-08003: starting partial resync of recovery catalog

RMAN-08005: partial resync complete

RMAN-03022: compiling command: release

RMAN-03023: executing command: release

RMAN-08031: released channel: c1

RMAN>

 

3 继续在测试表中插入记录

SQL> insert into test values(2);

1 row inserted

SQL> commit;

Commit complete

SQL> select * from test;

                         A

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

                         1

                         2

SQL> alter system switch logfile;

System altered.

SQL>r

1* alter system switch logfile;

System altered.

 

4 关闭数据库,模拟丢失数据文件

SQL> shutdown immediate;

Database closed.

Database dismounted.

Oracle instance shut down

 

C:\>del D:\Oracle\ORADATA\TEST\USER01.DBF

 

5 启动数据库,检查错误

SQL> startup

Oracle instance started.

Total System Global Area  102020364 bytes

Fixed Size                    70924 bytes

Variable Size              85487616 bytes

Database Buffers           16384000 bytes

Redo Buffers                  77824 bytes

Database mounted.

ORA-01157: cannot identify/lock data file 3 - see DBWR trace file

ORA-01110: data file 3: 'D:\Oracle\ORADATA\TEST\USER01.DBF'

 

6 先打开数据库

SQL> alter database datafile 3 offline drop;

Database altered.

SQL> alter database open;

Database altered.

 

7 恢复该表空间

恢复脚本可以是恢复单个数据文件

run{

allocate channel c1 type disk;

restore datafile 3;

recover datafile 3;

sql 'alter database datafile 3 online';

release channel c1;

}

也可以是,恢复表空间

run{

allocate channel c1 type disk;

restore tablespace users;

recover tablespace users;

sql 'alter database datafile 3 online';

release channel c1;

}

过程如下:

C:\>rman

Recovery Manager: Release 8.1.6.0.0 - Production

RMAN> connect rcvcat rman/rman@back

RMAN-06008: connected to recovery catalog database

RMAN> connect target internal/virpure

RMAN-06005: connected to target database: TEST (DBID=1788174720)

 

RMAN> run{

2> allocate channel c1 type disk;

3> restore datafile 3;

4> recover datafile 3;

5> sql 'alter database datafile 3 online';

6> release channel c1;

7> }

 

//输出内容冗长,省略--编者

RMAN>

 

8 检查数据是否完整

SQL> alter database open;

Database altered.

 

SQL> select * from test;

                         A

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

                         1

                         2

说明:

1RMAN也可以实现单个表空间或数据文件的恢复,恢复过程可以在mount下或open方式下,如果在open方式下恢复,可以减少down机时间;

2、如果损坏的是一个数据文件,建议offline并在open方式下恢复;

3、这里可以看到,RMAN进行数据文件与表空间恢复的时候,代码都比较简单,而且能保证备份与恢复的可靠性,所以建议采用RMAN的备份与恢复.

 

4.3丢失多个数据文件,实现整个数据库的恢复.

 

4.3.1 OS备份方案

OS备份归档模式下损坏(丢失)多个数据文件,进行整个数据库的恢复

1 连接数据库,创建测试表并插入记录

SQL> connect internal/password as sysdba;

Connected.

 

SQL> create table test(a int);

Table created

SQL> insert into test values(1);

1 row inserted

SQL> commit;

Commit complete

 

2 备份数据库,备份除临时数据文件后的所数据文件

SQL> @hotbak.sql 或在DOS svrmgrl @hotbak.sql

 

3 继续在测试表中插入记录

SQL> insert into test values(2);

1 row inserted

SQL> commit;

Commit complete

SQL> select * from test;

                         A

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

                         1

                         2

SQL> alter system switch logfile;

System altered.

SQL> alter system switch logfile;

System altered.

 

4 关闭数据库,模拟丢失数据文件

SQL> shutdown immediate;

Database closed.

Database dismounted.

Oracle instance shut down

 

C:\>del D:\Oracle\ORADATA\TEST\SYSTEM01.DBF

C:\>del D:\Oracle\ORADATA\TEST\INDX01.DBF

C:\>del D:\Oracle\ORADATA\TEST\TOOLS01.DBF

C:\>del D:\Oracle\ORADATA\TEST\RBS01.DBF

模拟媒体毁坏(这里删除多个数据文件)

 

5 启动数据库,检查错误

SQL> STARTUP

Oracle instance started.

Total System Global Area  102020364 bytes

Fixed Size                    70924 bytes

Variable Size              85487616 bytes

Database Buffers           16384000 bytes

Redo Buffers                  77824 bytes

Database mounted.

ORA-01157: cannot identify/lock data file 1 - see DBWR trace file

ORA-01110: data file 1: 'D:\Oracle\ORADATA\TEST\SYSTEM01.DBF'

 

详细信息可以查看报警文件

ORA-1157 signalled during: ALTER DATABASE OPEN...

Thu May 08 09:39:36 2003

Errors in file D:\Oracle\admin\test\bdump\testDBW0.TRC:

ORA-01157: cannot identify/lock data file 1 - see DBWR trace file

ORA-01110: data file 1: 'D:\Oracle\ORADATA\TEST\SYSTEM01.DBF'

ORA-27041: unable to open file

OSD-04002: unable to open file

O/S-Error: (OS 2) 系统找不到指定的文件。

 

Thu May 08 09:39:36 2003

Errors in file D:\Oracle\admin\test\bdump\testDBW0.TRC:

ORA-01157: cannot identify/lock data file 2 - see DBWR trace file

ORA-01110: data file 2: 'D:\Oracle\ORADATA\TEST\RBS01.DBF'

ORA-27041: unable to open file

OSD-04002: unable to open file

O/S-Error: (OS 2) 系统找不到指定的文件。

 

Thu May 08 09:39:36 2003

Errors in file D:\Oracle\admin\test\bdump\testDBW0.TRC:

ORA-01157: cannot identify/lock data file 5 - see DBWR trace file

ORA-01110: data file 5: 'D:\Oracle\ORADATA\TEST\TOOLS01.DBF'

ORA-27041: unable to open file

OSD-04002: unable to open file

O/S-Error: (OS 2) 系统找不到指定的文件。

 

Thu May 08 09:39:36 2003

Errors in file D:\Oracle\admin\test\bdump\testDBW0.TRC:

ORA-01157: cannot identify/lock data file 6 - see DBWR trace file

ORA-01110: data file 6: 'D:\Oracle\ORADATA\TEST\INDX01.DBF'

ORA-27041: unable to open file

OSD-04002: unable to open file

O/S-Error: (OS 2) 系统找不到指定的文件。

 

通过查询v$recover_file可以看到

SQL> select * from v$recover_file;

 

     FILE# ONLINE  ERROR                 CHANGE# TIME

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

         1 ONLINE  FILE NOT FOUND              0

         2 ONLINE  FILE NOT FOUND              0

         5 ONLINE  FILE NOT FOUND              0

         6 ONLINE  FILE NOT FOUND              0

有四个数据文件需要恢复

 

6 拷贝备份回到原地点(restore),开始恢复数据库(recover)

restore过程:

C:\>copy D:\DATABAK\SYSTEM01.DBF D:\Oracle\ORADATA\TEST\

C:\>copy D:\DATABAK\TEST\INDX01.DBF D:\Oracle\ORADATA\TEST\

C:\>copy D:\DATABAK\TEST\TOOLS01.DBF D:\Oracle\ORADATA\TEST\

C:\>copy D:\DATABAK\TEST\RBS01.DBF.DBF D:\Oracle\ORADATA\TEST\

 

Recover过程:

SQL> recover database;

 

ORA-00279: change 1073849 generated at 05/08/2003 08:58:35 needed for thread 1

ORA-00289: suggestion : D:\Oracle\ORADATA\TEST\ARCHIVE\TESTT001S00311.ARC

ORA-00280: change 1073849 for thread 1 is in sequence #311

 

Specify log: {=suggested | filename | AUTO | CANCEL}

auto

ORA-00279: change 1073856 generated at 05/08/2003 09:03:27 needed for thread 1

ORA-00289: suggestion : D:\Oracle\ORADATA\TEST\ARCHIVE\TESTT001S00312.ARC

ORA-00280: change 1073856 for thread 1 is in sequence #312

ORA-00278: log file 'D:\Oracle\ORADATA\TEST\ARCHIVE\TESTT001S00311.ARC' no

longer needed for this recovery

 

ORA-00279: change 1073858 generated at 05/08/2003 09:11:43 needed for thread 1

ORA-00289: suggestion : D:\Oracle\ORADATA\TEST\ARCHIVE\TESTT001S00313.ARC

ORA-00280: change 1073858 for thread 1 is in sequence #313

ORA-00278: log file 'D:\Oracle\ORADATA\TEST\ARCHIVE\TESTT001S00312.ARC' no

longer needed for this recovery

 

ORA-00279: change 1073870 generated at 05/08/2003 09:11:46 needed for thread 1

ORA-00289: suggestion : D:\Oracle\ORADATA\TEST\ARCHIVE\TESTT001S00314.ARC

ORA-00280: change 1073870 for thread 1 is in sequence #314

ORA-00278: log file 'D:\Oracle\ORADATA\TEST\ARCHIVE\TESTT001S00313.ARC' no

longer needed for this recovery

 

Log applied.

Media recovery complete.

 

7 打开数据库,检查数据库的数据(完全恢复)

SQL> alter database open;

Database altered.

SQL> select * from test;

                         A

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

                         1

                         2

 

说明:

1、只要有备份与归档存在,就可以实现数据库的完全恢复(不丢失数据);

2、适合于丢失大量数据文件,或包含系统数据文件在内的数据库的恢复;

3、恢复过程在mount下进行,如果恢复成功,再打开数据库,down机时间可能比较长一些。

 

4.3.2 RMAN备份方案

RMAN备份归档模式下损坏(丢失)多个数据文件,进行整个数据库的恢复

1、连接数据库,创建测试表并插入记录

 

SQL> connect internal/password as sysdba;

Connected.

SQL> create table test(a int);

Table created

SQL> insert into test values(1);

1 row inserted

SQL> commit;

Commit complete

 

2、备份数据库

DOS C:>\ rman cmdfile=bakup.rcv msglog=backup.log;

 

以下是backup.log内容。

Recovery Manager: Release 8.1.6.0.0 - Production

RMAN> #     script:bakup.rcv

2> #     creater:chenjiping

3> #     date:5.8.2003

4> #     desc:backup all database datafile in archive with rman

5>

6> #connect database

7> connect rcvcat rman/rman@back;

8> connect target internal/virpure;

9>

10> #start backup database

11> run{

12> allocate channel c1 type disk;

13> backup full tag 'dbfull' format 'd:\backup\full%u_%s_%p' database

14> include current controlfile;

15> sql 'alter system archive log current';

16> release channel c1;

17> }

18> #end

19>

 

RMAN-06008: connected to recovery catalog database

RMAN-06005: connected to target database: TEST (DBID=1788174720)

RMAN-03022: compiling command: allocate

RMAN-03023: executing command: allocate

RMAN-08030: allocated channel: c1

RMAN-08500: channel c1: sid=15 devtype=DISK

RMAN-03022: compiling command: backup

RMAN-03023: executing command: backup

RMAN-08008: channel c1: starting full datafile backupset

RMAN-08502: set_count=4 set_stamp=494074368 creation_time=15-MAY-03

RMAN-08010: channel c1: specifying datafile(s) in backupset

RMAN-08522: input datafile fno=00002 name=D:\Oracle\ORADATA\TEST\RBS01.DBF

RMAN-08522: input datafile fno=00001 name=D:\Oracle\ORADATA\TEST\SYSTEM01.DBF

RMAN-08011: including current controlfile in backupset

RMAN-08522: input datafile fno=00005 name=D:\Oracle\ORADATA\TEST\TOOLS01.DBF

RMAN-08522: input datafile fno=00004 name=D:\Oracle\ORADATA\TEST\TEMP01.DBF

RMAN-08522: input datafile fno=00006 name=D:\Oracle\ORADATA\TEST\INDX01.DBF

RMAN-08522: input datafile fno=00003 name=D:\Oracle\ORADATA\TEST\USER01.DBF

RMAN-08013: channel c1: piece 1 created

RMAN-08503: piece handle=D:\BACKUP\FULL04EN5UG0_4_1 comment=NONE

RMAN-08525: backup set complete, elapsed time: 00:01:16

RMAN-03023: executing command: partial resync

RMAN-08003: starting partial resync of recovery catalog

RMAN-08005: partial resync complete

RMAN-03022: compiling command: sql

RMAN-06162: sql statement: alter system archive log current

RMAN-03023: executing command: sql

RMAN-03022: compiling command: release

RMAN-03023: executing command: release

RMAN-08031: released channel: c1

Recovery Manager complete.

到这里表示备份成功。

 

3 继续在测试表中插入记录

SQL> insert into test values(2);

1 row inserted

SQL> commit;

Commit complete

SQL> select * from test;

                         A

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

                         1

                         2

SQL>alter system switch logfile;

System altered.

SQL> alter system switch logfile;

System altered.

 

4 关闭数据库,模拟丢失数据文件

SQL> shutdown immediate;

Database closed.

Database dismounted.

Oracle instance shut down

C:\>del D:\Oracle\ORADATA\TEST\SYSTEM01.DBF

C:\>del D:\Oracle\ORADATA\TEST\INDX01.DBF

C:\>del D:\Oracle\ORADATA\TEST\TOOLS01.DBF

C:\>del D:\Oracle\ORADATA\TEST\RBS01.DBF

 

5、启动数据库,检查错误

SQL> STARTUP

Oracle instance started.

Total System Global Area  102020364 bytes

Fixed Size                    70924 bytes

Variable Size              85487616 bytes

Database Buffers           16384000 bytes

Redo Buffers                  77824 bytes

Database mounted.

ORA-01157: cannot identify/lock data file 1 - see DBWR trace file

ORA-01110: data file 1: 'D:\Oracle\ORADATA\TEST\SYSTEM01.DBF'

 

查询v$recover_file

SQL> select * from v$recover_file;

 

     FILE# ONLINE  ERROR                 CHANGE# TIME

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

         1 ONLINE  FILE NOT FOUND              0

         2 ONLINE  FILE NOT FOUND              0

         5 ONLINE  FILE NOT FOUND              0

         6 ONLINE  FILE NOT FOUND              0


可以知道有四个数据文件需要恢复.

 

 

 

Oracle备份与恢复

2005-01-03    freet15    我的IT时段    点击: 4836

 

Oracle备份与恢复

 

  学习过程中的总结,有兴趣不妨看看,如果有不对的地方,高手不要留情!!

  Oracle的备份与恢复有三种标准的模式,大致分为两大类,备份恢复(物理上的)以及导入导出(逻辑上的),而备份恢复又可以根据数据库的工作模式分为非归档模式(Nonarchivelog-style)和归档模式(Archivelog-style),通常,我们把非归档模式称为冷备份,而相应的把归档模式称为热备份,他们的关系如下所示



三种方式各有优点,我们做个比较(这个是用Fireworks画的,有点糙)



$A:  
现在先来介绍一下逻辑备份方式的方法,利用Export可将数据从数据库中提取出来,利用Import则可将提取出来的数据送回到Oracle数据库中去。理论基础:Oracle提供的ExportImport具有三种不同的操作方式(就是备份的数据输出()类型)

  1,表方式(T)    可以将指定的表导出备份;

  2,全库方式(Full)    将数据库中的所有对象导出;

  3,用户方式(U)     可以将指定的用户相应的所有数据对象导出;

  *在导入导出备份方式中,提供了很强大的一种方法,就是增量导出/导入,但是它必须作为System来完成增量的导入导出,而且只能是对整个数据库进行实施。增量导出又可以分为三种类别:

  1,完全增量导出(Complete Export)     这种方式将把整个数据库文件导出备份;exp system/manager inctype=complete file=20041125.dmp(为了方便检索和事后的查询,通常我们将备份文件以日期或者其他有明确含义的字符命名)

  2,增量型增量导出(Incremental Export)     这种方式将只会备份上一次备份后改变的结果;exp system/manager inctype=incremental file=20041125.dmp

  3,累积型增量导出(Cumulate Export)      这种方式的话,是导出自上次完全增量导出后数据库变化的信息。exp system/manager inctype=cumulative file=20041125.dmp

  通常情况下,DBA们所要做的,就是按照企业指定或者是自己习惯的标准(如果是自己指定的标准,建议写好计划说明),一般,我们采用普遍认可的下面的方式进行每天的增量备份:

  Mon 完全备份(A
  Tue 增量导出(B
  Wed:增量导出(C
  Thu 增量导出(D
  Fri   累计导出(E
  Sat 增量导出(F
  Sun 增量导出(G

  这样,我们可以保证每周数据的完整性,以及恢复时的快捷和最大限度的数据损失。恢复的时候,假设事故发生在周末,DBA可按这样的步骤来恢复数据库:

  第一步:用命令CREATE DATABASE重新生成数据库结构;
  第二步:创建一个足够大的附加回滚。
  第三步:完全增量导入A 
               imp system/manager inctype=RESTORE FULL=y FILE=A
  第四步:累计增量导入E 
               imp system/manager inctype=RESTORE FULL=Y FILE=E
  第五步:最近增量导入F 
               imp system/manager inctype=RESTORE FULL=Y FILE=F

  通常情况下,DBA所要做的导入导出备份就算完成,只要科学的按照规律作出备份,就可以将数据的损失降低到最小,提供更可靠的服务。另外,DBA最好对每次的备份做一个比较详细的说明文档,使得数据库的恢复更加可靠。

$B 物理备份之冷备份(条件-NonArchiveLog)

  当数据库可以暂时处于关闭状态时,我们需要将它在这一稳定时刻的数据相关文件转移到安全的区域,当数据库遭到破坏,再从安全区域将备份的数据库相关文件拷贝回原来的位置,这样,就完成了一次快捷安全等数据转移。由于是在数据库不提供服务的关闭状态,所以称为冷备份。冷备份具有很多优良特性,比如上面图中我们提到的,快速,方便,以及高效。一次完整的冷备份步骤应该是:

  1,首先关闭数据库(shutdown normal

  2,拷贝相关文件到安全区域(利用操作系统命令拷贝数据库的所有的数据文件、日志文件、控制文件、参数文件、口令文件等(包括路径))

  3,重新启动数据库(startup

  以上的步骤我们可以用一个脚本来完成操作:

      su – oracle < sqlplus /nolog
      connect / as sysdba
      shutdown immediate;
      !cp
文件   备份位置(所有的日志、数据、控制及参数文件);
      startup;
      exit;

  这样,我们就完成了一次冷备份,请确定你对这些相应的目录(包括写入的目标文件夹)有相应的权限。

  恢复的时候,相对比较简单了,我们停掉数据库,将文件拷贝回相应位置,重启数据库就可以了,当然也可以用脚本来完成。

$C 物理备份之热备份:(条件-ArchiveLog)

  当我们需要做一个精度比较高的备份,而且我们的数据库不可能停掉(少许访问量)时,这个情况下,我们就需要归档方式下的备份,就是下面讨论的热备份。热备份可以非常精确的备份表空间级和用户级的数据,由于它是根据归档日志的时间轴来备份恢复的,理论上可以恢复到前一个操作,甚至就是前一秒的操作。具体步骤如下:

  1,通过视图v$database,查看数据库是否在Archive模式下:

        SQL> select log_mode from v$database;

  如果不是Archive模式

  则设定数据库运行于归档模式下:SQL>shutdown immediate

        SQL>startup mount
        SQL> alter database archivelog;
        SQL> alter database open;

  如果Automaticarchival显示为“Enabled”,则数据库归档方式为自动归档。否则需要手工归档,或者将归档方式修改为自动归档,如:
  正常shutdown数据库,在参数文件中init.ora中加入如下参数

        SQL>shutdown immediate

  修改init.ora

        LOG_ARCHIVE_START=TRUE
        LOG_ARCHIVE_DEST1=ORACLE_HOME/admin/o816/arch(
归档日值存放位置可以自己定义)
        SQL>startup

  然后,重新启动数据库,此时Oracle数据库将以自动归档的方式工作在Archive模式下。其中参数LOG_ARCHIVE_DEST1是指定的归档日志文件的路径,建议与Oracle数据库文件存在不同的硬盘,一方面减少磁盘I/O竞争,另外一方面也可以避免数据库文件所在硬盘毁坏之后的文件丢失。归档路径也可以直接指定为磁带等其它物理存储设备,但可能要考虑读写速度、可写条件和性能等因素。      

  注意:当数据库处在ARCHIVE模式下时,一定要保证指定的归档路径可写,否则数据库就会挂起,直到能够归档所有归档信息后才可以使用。另外,为创建一个有效的备份,当数据库在创建时,必须履行一个全数据库的冷备份,就是说数据库需要运行在归档方式,然后正常关闭数据库,备份所有的数据库组成文件。这一备份是整个备份的基础,因为该备份提供了一个所有数据库文件的拷贝。(体现了冷备份与热备份的合作关系,以及强大的能力)

  2,备份表空间文件:

        a,首先,修改表空间文件为备份模式  ALTER TABLESPACE tablespace_name BEGIN BACKUP;

        b,然后,拷贝表空间文件到安全区域 !CP tablespace_name D_PATH;

        c,最后,将表空间的备份模式关闭    ALTER TABLESPACE tablespace_name END BACKUP;

  3,对归档日志文件的备份:

        停止归档进程-->备份归档日志文件-->启动归档进程

        如果日志文档比较多,我们将它们写入一个文件成为一个恢复的参考:$   files `ls <归档文件路径>/arch*.dbf`;export files

  4,备份控制文件:

        SQL> alter database backup controlfile to 'controlfile_back_name
(一般用2004-11-20的方式)' reuse;

  当然,我们也可以将上面的东东写为一个脚本,在需要的时候执行就可以了:

  脚本范例:

        su – oracle < sqlplus /nolog 
        connect / as sysdba
        ALTER TABLESPACE tablespace_name BEGIN BACKUP

        !CP tablespace_name D_PATH

        ALTER TABLESPACE tablespace_name END BACKUP
   
        alter database backup controlfile to 'controlfile_back_name
(一般用2004-11-20的方式)' reuse;

        !files `ls <归档文件路径>/arch*.dbf`;export files

  热备份的恢复,对于归档方式数据库的恢复要求不但有有效的日志备份还要求有一个在归档方式下作的有效的全库备份。归档备份在理论上可以无数据丢失,但是对于硬件以及操作人员的要求都比较高。在我们使用归档方式备份的时候,全库物理备份也是非常重要的。归档方式下数据库的恢复要求从全备份到失败点所有的日志都要完好无缺。

       
恢复步骤:LOG_ARCHIVE_DEST_1
                     shutdown
数据库。
                     
将全备份的数据文件放到原来系统的目录中。
                     
将全备份到失败点的所有归档日志放到参数LOG_ARCHIVE_DEST_1所指定的位置。
                     
利用sqlplus登陆到空实例。(connect / as sysdba
                     
然后  startup mount
                            set autorecovery on
                            recover database;
                            alter database open;

  这样,我们的热恢复就算完工了,写了好久,终于写好,大家有什么补充就写上来,不要客气,这是这两天学习的一些心得,希望大家多多交流,谢谢

 

阅读(5827) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~