Oracle 9i备份和恢复

第一章 备份和恢复的基本概念

1.        数据丢失的分类
数据丢失可分为逻辑丢失和物理丢失。
逻辑丢失:用户错误操作和应用程序错误造成数据丢失。
物理丢失:数据库物理结构破坏。

2. 备份和恢复的分类
逻辑备份和逻辑恢复。
物理备份和物理恢复。

物理恢复的原则:所有的文件必须在时间点上一致。

崩溃恢复(Crash Recovery)与实例恢复(Instance Recovery):
包括缓存恢复(Cache Recovery)和事务恢复(Transaction Recovery)。
   缓存恢复:利用联机重做日志文件进行恢复。
   事务恢复:回退(rollback)未提交的事务。
系统自动做的。

介质恢复(Media Recovery):利用归档重做日志文件和联机重做日志文件进行恢复。

修复(restore)(找出文件)和恢复(recover)(使与其他文件同步)。

3. 逻辑备份和物理备份
逻辑备份和物理备份的内容。

物理备份可分为冷备份和热备份。
如何要进行热备份,数据库必须要处于归档模式。
如何要进行冷备份,数据库可以是归档模式,也可以是非归档模式。
冷备份只能将数据库恢复到备份时的状态。
热备份可以将数据库恢复到故障时的状态,或者将数据库恢复到一个指定的时间点(称为基于时间点的恢复)。

物理备份的方式:整库、表空间、数据文件、控制文件、归档重做日志文件
、SPfile或Pfile、密码文件、网络文件(listener.ora和
tnsnames.ora)。联机重做日志文件不备份!


一致性备份(Consistent Backup):shutdown immediate/normal时备份。
不需要重做日志来进行恢复。
非一致性备份(Inconsistent Backup):open时或shutdown abort时备份。
需要重做日志来进行恢复。
(如果联机重做日志文件丢失,需要有所有数据文件的备份。)

逻辑备份和物理备份的适用策略:
逻辑备份只能防止逻辑丢失。
物理备份既能防止逻辑丢失,又能防止物理丢失。


第二章 逻辑备份和逻辑恢复
一、逻辑备份
逻辑备份使用EXP程序完成。
逻辑备份可分为:指定表的逻辑备份、指定用户的逻辑备份和整库逻辑备份。

C:\>EXP -HELP
一个文件里只能存放一次备份。

各个参数的含义与默认值。
USERID
FULL
BUFFER
OWNER
FILE (默认备份的文件名expdat.dmp)
TABLES
COMPRESS
RECORDLENGTH
GRANTS
ROWS
PARFILE
CONSTRAINTS
CONSISTENT 交叉表的一致性,当备份时,用户可以录入数据这样就有可能影响数据外键的一致性。
LOG
STATISTICS 可取COMPUTE、ESTIMATE、NONE。
DIRECT
TRIGGER
FEEDBACK   值为0时禁用。

逻辑备份的三个例子:
指定表的逻辑备份
c:\>exp USERID=system/oracle@erp tables=scott.emp, scott.dept, hr.employees
file=c:\logback\ed.dmp

指定用户的逻辑备份  备份指定用户的所有数据(表,索引等等)
c:\>exp USERID=system/oracle@erp wner=scott file=c:\logback\scott.dmp

整库逻辑备份
c:\>exp USERID=system/oracle@erp full=y file=c:\logback\full.dmp

注意:不能同时指定owner和tables!


用AT命令进行自动备份:
C:\>AT 15:10 exp userid=system/oracle@erp tables=scott.emp  file=c:\logback\at.dmp

也可用任务计划进行自动备份。

可以设置一个自动备份,做为任务计划,自动执行。

用当前日期生成一个备份文件:
建一个C:\BACKUP.BAT脚本
@echo off
for /f "tokens=1 delims= " %%u in ('date /t') do exp userid=system/oracle@erp tables=scott.emp  file=c:\logback\%%u.dmp log=c:\logback\%%u.log

注:在脚本中不能换行。

tokens为标记的个数。
delims为标记之间的分隔符。

二、逻辑恢复
逻辑恢复使用IMP程序完成。

C:\>IMP  -HELP

参数的含义与默认值。
FROMUSER
TOUSER
TABLES

逻辑恢复的四个例子:
1.        表不存在(假设删除scott用户下的EMP和DEPT表)
c:\>imp userid=system/oracle@erp fromuser=scott tables=emp,dept file=c:\logback\ed.dmp

2.        表存在,数据丢失
c:\>imp userid=system/oracle@erp fromuser=scott tables=emp,dept file=c:\logback\ed.dmp ignore=y

当逻辑恢复的内容已存在,会出现错误,ignore=y将忽略继续,ignore默认为n。

逻辑恢复顺序:对象类型,表的结构,表的数据,表的索引,表的约束,视图,函数和过程,触发器。逻辑恢复前将约束关闭。

3.        用户不存在(假设删除scott用户)
先要创建scott用户。
c:\>imp userid=system/oracle@erp fromuser=scott file=c:\logback\scott.dmp

4.整库丢失
先创建一个同名数据库(注意数据库不同名不能恢复!)。
C:\>imp userid=system/oracle@erp full=y file=c:\logback\full.dmp

因为有很多内容已存在,所以在整库恢复过程中会出现许多错误提示,这是是正常的。

三、用图形界面进行逻辑备份和逻辑恢复
演示用图形界面进行逻辑备份和逻辑恢复(启动管理服务)
检查首选身份设置是否正确。
    逻辑备份:工具数据库工具数据管理导出
逻辑恢复:工具数据库工具数据管理导入

字符集不同的数据库之间进行逻辑备份和逻辑恢复,Oracle会自动进行字符集的
转换。


第三章 用OS方式进行物理备份

一、物理备份的基本概念
物理数据备份可分为冷备份(cold)和热备份(hot)。
即脱机备份(offline backup)和联机备份(online backup)。

二、用OS方式冷备份
①非归档模式下:
    只能进行冷备份(cold),不能进行热备份(hot)。

冷备份要备份所有文件的控制文件、数据文件,不包括联机重做日志文件。

恢复时也要恢复所有的控制文件、数据文件,不包括联机重做日志文件,即使只有一个文件破坏也需要全部恢复。

实例1:冷备份不包括联机重做日志文件情况下的恢复。
查看重做日志组,日志的序列号
1、sys/oracle@erp as sysdba 进入sql*plus;
2、SQL>shutdown immediate (保持所有数据文件在时间点上的一致性)
3、拷贝c:\oracle\oradata\erp下所有文件,不包括联机重做日志文件到新的备份目录。
假设进行如下操作:
4、SQL>startup
5、SQL>create table test(c1 number(5),c2 varcharc(10));
6、SQL>insert into text values(1,’a’);
7、SQL>commit;

此后假设有一个数据文件坏了
8、SQL>shutdown immediate;
9、删除一个数据文件
SQL>startup;
提示:无法标识/锁定数据文件所删除的数据文件
SQL>shutdown immediate;
将备份的所有文件拷贝回来
SQL>startup;
提示:日志文件比控制文件更新,因为联机重做日志文件为修改后的。
SQL>recover database until cancel; 完成介质恢复
SQL>alter database open resetlogs;
数据恢复完毕!
SQL>select * from test1;(没有数据)
但备份后所执行的操作没有恢复。

错误现象:
ORA-00322: 日志 1 (线程 1) 不是当前副本
ORA-00312: 联机日志 1 线程 1: 'D:\ORACLE\ORADATA\ORADB\REDO01.LOG'

SQL> recover database until cancel
不完全介质恢复。

用重置日志(resetlogs)的方式打开数据库:
SQL> alter database open resetlogs;

用重置日志(resetlogs)的方式开开数据库,Oracle会执行两个操作:
a. 重新创建所有的联机重做日志文件。
b.将日志的序列号归为1。生成一个新的数据库incarnation(状态)。

注意:冷备份后添加的数据会丢失!

实例2:冷备份包括联机重做日志文件情况下的恢复。(建议采用这种方式!)
1、sys/oracle@erp as sysdba 进入sql*plus;
2、SQL>shutdown immediate (保持所有数据文件在时间点上的一致性)
3、拷贝c:\oracle\oradata\erp下所有文件,包括联机重做日志文件到新的备份目录。
假设进行如下操作:
4、SQL>startup
5、SQL>create table test(c1 number(5),c2 varcharc(10));
6、SQL>insert into text values(1,’a’);
7、SQL>commit;

此后假设有一个数据文件坏了,然后将备份的所有文件包括联机重做日志文件拷贝回来。
8、SQL>shutdown immediate;
9、拷贝文件包括联机重做日志文件。

SQL>startup;
数据恢复完毕!但备份后所执行的操作没有恢复。

冷备份可用物理数据库的移植。

实例3:冷备份的情况下能否恢复单个数据文件?
一种情况:在联机重做日志文件没有覆盖的情况下
查看重做日志组,切换到新日志文件,假设当前联机重做日志文件为redo02.log

1、sys/oracle@erp as sysdba 进入sql*plus;
2、SQL>shutdown immediate (保持所有数据文件在时间点上的一致性)
3、拷贝c:\oracle\oradata\erp下一个数据文件到新的备份目录。

假设进行如下操作:
4、SQL>startup
5、SQL>create table test(c1 number(5),c2 varcharc(10));
6、SQL>insert into text values(1,’a’);
7、SQL>commit;
再次切换到新日志文件,假设当前联机重做日志文件为redo03.log
SQL>shutdown immediate
此删除一个数据文件。
SQL>startup(提示数据文件有问题。)
SQL>shutdown immediate
此时将丢失的文件拷贝回来。
SQL>startup
提示需要介质恢复拷贝回的文件。
SQL>recover datafile ‘c:\oracle\oradata\erp\user01.dbf’
SQL>alter database open;
SQL>select * form. test;
可以查询出记录。

注:若切换到新的联机重做日志文件(例redo03.log),执行了操作数据,再切换到新的联机重做日志文件(例redo01.log),也执行了操作数据,此时,若进行恢复,就可以恢复到redo01.log时所做的操作,只要在做备份时的联机重做日志文件(例redo02.log)没有被覆盖。

另一种情况:在联机重做日志文件被覆盖的情况下,
执行上面的操作,
SQL>Alter system switch logfile; 切换联机重做日志文件
SQL>Alter system switch logfile; 切换联机重做日志文件
将联机重做日志文件切换到备份时的联机重做日志文件,此时,就将备份时的联机重做日志文件覆盖。
SQL>Set linesize 2600
SQL>Select * from v$log;
SQL>Shutdown immediate
此删除一个数据文件。
SQL>startup
提示数据文件有问题。此时将丢失的文件拷贝回来。
SQL>shutdown immediate
SQL>startup
提示需要介质恢复拷贝回的文件。
SQL>recover datafile ‘c:\oracle\oradata\erp\user01.dbf’
介质恢复失败,因为此时备份时的日志文件已经更新。


在联机重做日志文件没有覆盖的情况下,可以恢复单个数据文件。并且不丢失数据。

在联机重做日志文件被覆盖的情况下,不能恢复单个数据文件。只能将所有文件拷贝回来,备份后所做的操作丢失。

实例4:冷备份的情况下,如果联机重做日志文件没有覆盖,能否不丢失数据?
1、        sys/oracle@erp as sysdba 进入sql*plus;
2、查看重做日志组,假设当前联机重做日志文件为redo02.log
3、SQL>shutdown immediate (保持所有数据文件在时间点上的一致性)
4、拷贝c:\oracle\oradata\erp下所有文件,不包括联机重做日志文件到新的备份目录。
SQL>startup
5、SQL>Alter system switch logfile; 切换联机重做日志文件
查看当前联机重做日志文件假设为redo03.log
假设进行如下操作:
6、SQL>startup
7、SQL>create table test(c1 number(5),c2 varcharc(10));
8、SQL>insert into text values(1,’a’);
9、SQL>commit;
10、SQL>Alter system switch logfile; 切换联机重做日志文件
查看当前联机重做日志文件假设为redo01.log
假设进行如下操作:
11、SQL>startup
12、SQL>create table test1(c1 number(5),c2 varcharc(10));
13、SQL>insert into text1 values(1,’a’);
14、SQL>commit;
当前联机重做日志文件为redo01.log
若此时数据文件出现问题。
10、SQL>shutdown immediate;
11、拷贝文件, 不包括联机重做日志文件。此时没有联机重做日志文件。
SQL>startup;
提示日志文件与数据文件不一致。
SQL>recover database until cancel using backup controlfile;
然后按顺序提供联机重做日志文件
c:\oracle\oradata\erp\REDO02.LOG (按顺序,要从备份起始的联机重做日志文件开始。)
c:\oracle\oradata\erp\REDO03.LOG
c:\oracle\oradata\erp\REDO01.LOG
SQL>alter database open resetlogs;
SQL>select * from test;
结果可以查出。
要求:联机重做日志文件没有覆盖


②        归档模式下,冷备份可以备份单个数据文件。
实例1:恢复时可以恢复单个数据文件。
1、sys/oracle@erp as sysdba 进入sql*plus;
2、SQL>shutdown immediate (保持所有数据文件在时间点上的一致性)
3、拷贝c:\oracle\oradata\erp下一个数据文件,到新的备份目录。

4、操作数据
5、SQL>Alter system switch logfile; 切换联机重做日志文件
6、操作数据
7、SQL>Alter system switch logfile; 切换联机重做日志文件
8、操作数据
9、SQL>Alter system switch logfile; 切换联机重做日志文件
  此时联机重做日志文件已经被覆盖

10、SQL>shutdown immediate
11、删除数据文件
12、SQL>startup
提示出错
13、SQL>shutdown immediate
14、拷贝回备份的数据文件
15、SQL>startup
提示出错
16、SQL>recover datafile ‘c:\oracle\oradata\erp\user01.dbf’;
因为有归档日志文件,直接回车。
17、SQL>alter database open;
最后操作的数据也存在。

实例2:在归档模式下用冷备份恢复整个数据库。
1、sys/oracle@erp as sysdba 进入sql*plus;
2、SQL>shutdown immediate (保持所有数据文件在时间点上的一致性)
3、拷贝c:\oracle\oradata\erp下所有数据文件,(注不包括联机重做日志文件)到新的备份目录。

4、操作数据
5、SQL>Alter system switch logfile; 切换联机重做日志文件
6、操作数据
7、SQL>Alter system switch logfile; 切换联机重做日志文件
8、操作数据
9、SQL>Alter system switch logfile; 切换联机重做日志文件
  此时联机重做日志文件已经被覆盖

10、SQL>shutdown immediate
11、删除数据文件
12、SQL>startup
提示出错
13、SQL>shutdown immediate
14、拷贝回备份的所有的数据文件,不包括联机重做日志文件
15、SQL>startup
提示出错
16、SQL>recover database until cancel using backup controlfile;
因为有归档日志文件,直接回车。
然后还提示需要文件,此时将联机重做日志文件一个一个的试,直至恢复成功。
17、SQL>alter database open resetlogs;
最后操作的数据也存在。
此时要将归档文件删除,因为新做的日志恢复,不删除的话,会出现文件名重复,出错。

恢复方法:
SQL> recover database until cancel using backup controlfile
注意应用归档日志文件和联机重做日志文件的方法:
       如果有所需要的归档日志文件,按回车键。
       如果没有所需要的归档日志文件,依次用每一个联机重做日志文件来试。

完全介质恢复。

SQL> alter database open resetlogs
注意:在归档模式下冷备份后添加的数据不会丢失!
在归档模式下备份整个数据库不能备份联机重做日志文件,因为备份联机重做日志文件会带来的危险:
1.造成不完全恢复。 2. 重复生成具有相同顺序号的联机重做日志文件。



三、用OS方式进行热备份(在数据库运行时进行的备份恢复),
数据库必须要运行在归档模式,自动归档!

1.        演示:非归档模式为什么不能进行热备份?
如果联机重做日志文件没有覆盖,可以。
如果联机重做日志文件志覆盖,不可以。

2. 数据库在归档模式下,控制文件的备份和恢复
首先进行控制文件的备份:
  SQL> alter database backup controlfile to ‘c:\control.bak’;
   将数据库关闭后删除所有的控制文件。
SQL>startup (提示错误ora-00205)
SQL>Shutdown immediate
将c:\control.bak复制三份到c:\oracle\oradata\erp下,依次改名为控制文件名
SQL>startup
SQL> recover database until cancel using backup controlfile;
注意应用归档日志文件和联机重做日志文件的方法:
       如果有所需要的归档日志文件,按回车键。
       如果没有所需要的归档日志文件,依次用每一个联机重做日志文件来试。
       直到完成介质恢复。
SQL> alter database open resetlogs;
用重置日志(resetlogs)的方式开开数据库,Oracle会执行两个操作:
a. 重新创建所有的联机重做日志文件。
b.将日志的序列号归为1。生成一个新的数据库incarnation。

3. 数据库在归档模式下,联机重做日志文件的恢复
联机重做日志文件没有备份,只能有命令来恢复。

如果丢失非当前重做日志组的联机重做日志文件:(当前是redo01.log,丢失redo02.log)
SQL>alter database clear logfile  'D:\ORACLE\ORADATA\ERP\REDO02.LOG';
(重新创建联机重做日志文件)
SQL>alter database open;

如果丢失当前重做日志组的联机重做日志文件:
SQL> shutdown immediate(不能shutdown abort,否则不能恢复)
SQL>startup
SQL> recover database until cancel; (重新建立所有联机重做日志文件)
SQL> alter database open resetlogs;

再删除现有应用归档日志文件,在C:\oracle\ora92\rdbms\arc*.001。

如果recover database untile cancel;则必须alter database open resetlogs;

演示:(无法恢复)
SQL> shutdown abort;
然后删除所有的联机重做日志文件。
SQL> recover database until cancel;
SQL> alter database open resetlogs;
    要点: abort方式关闭数据库时如果丢失联机重做日志文件,数据库不能恢复。只能用以前的备份恢复。

4. 数据库在归档模式下,数据文件的备份和恢复
能否只拷贝文件来备份数据库?
不能!要防止断裂数据块(Fractured Block)。

在备份数据文件之前首先要将数据文件所在的表空间设成备份模式:
SQL>alter tablespace users begin backup;
将文件复制出来。
然后结束表空间的备份模式:
SQL>alter tablespace users end backup;

对该表空间的操作记录在联机重做日志文件。

恢复数据文件时先将该文件还原,然后进行恢复:
SQL>recover datafile ‘c:\oracle\oradata\erp\users01.dbf’;
SQL>alter database open;

    验证备份的文件是否完整:
    C:\> dbv file=d:\users01.dbf  blocksize=8192
   

第四章 用恢复管理器(Recover Manager)进行热备份

一、恢复目录(recovery catalog)的概念
  没有恢复目录和有恢复目录的区别:
  没有恢复目录:备份信息存放在备份数据库的控制文件中。
    有恢复目录:备份信息存放在恢复目录中。

创建恢复目录的步骤:
每个数据库中已经有了RMAN用户,恢复目录也有了。
先要解除RMAN用户的锁定,然后然后用SQL*PLUS登录修改其密码。

二、使用RMAN进行热备份
1. 使用RMAN
没有恢复目录:
c:\>RMAN target=sys/oracl@erp nocatalog

有恢复目录:
c :\>RMAN target=sys/oracle@erp catalog=rman/rman@oemrep
   
    2. 如果要删除和创建恢复目录
    RMAN> drop catalog;
RMAN> create catalog tablespace tools;

3. 备份之前首先要注册数据库
RMAN> register database;

查看恢复管理器的配置:
RMAN>show all;

4.备份命令
备份整个数据库:
RMAN>run {
allocate channe cl type disk;
backup full filesperset 3
(database format ‘rm_%s%p.%d’);
release channel cl;
}

备份集(backup set)和备份段(backup piece)的含义。

格式的定义:
%p:piece备份段号。 %d:database 数据库名。                 %s:备份集号。
%c(copy号):总为1。 %u:自动生成的8个字符的唯一名称。    %t:时间。
默认格式为 %U=%u_%p_%c。

可用下面的简化命令备份整个数据库:
RMAN> backup database;
备份集的默认路径是C:\Oracle\Ora92\Database。
通道的分配和释放可以省略。

指定备份集的路径:
RMAN> backup database format ‘c:\rman\db_%U’;

备份一个表空间:
RMAN> backup
tablespace users format  ‘c:\rman\ts_%U’;

备份一个数据文件:
RMAN> backup datafile ‘c:\oracle\oradata\erp\users01.dbf’ format  ‘c:\rman\df_%U’;

备份控制文件:
RMAN>Backup current controlfile ‘c:\rman\ctl_%U’;

备份归档日志文件:
RMAN>backup filesperset 20 format  ‘c:\rman\al_%U’
archivelog all  delete input;
   
也可以采用复制的方式备份数据文件和控制文件。

复制数据文件:
RMAN>copy datafile 'c:\oracle\oradata\ERP\users01.dbf' to 'c:\rman\users01.dbf';

复制控制文件:
RMAN>copy current controlfile to  ’c:\rman\ctl.bak’;
   
5.        管理备份集的命令
    查看数据库的备份:
RMAN>list backup of database;

查看废弃的数据库备份:
RMAN> report obsolete;

删除废弃的数据库备份:
RMAN> delete obsolete;
注意不要直接删除备份集的文件。

删除一个备份集:
RMAN>change backuppiece 'C:\ORACLE\ORA92\DATABASE\08FKRJDB_1_1' delete;  
RMAN>change backupset 9 unavailable;

6. 管理备份脚本的命令
创建脚本:RMAN> create script. MyBackup {
                    Allocate channe cl type disk;
Backup full filesperset  3
(database format  ‘rm_%s%p.%d’);
                        release channel c1;
}

      执行脚本:RMAN> run { execute script. MyBackup; }
      修改脚本:RMAN> replace script. MyBackup {  ... }
      删除脚本:RMAN> delete script. MyBackup;
      查看脚本:RMAN> print script. MyBackup; (注意脚本名区分大小写。)
查询备份内容:视图RC_DATABAE、RC_STORED_SCRIPT、RC_STORED_SCRIPT_LINE。

第五章 用恢复管理器进行物理恢复

一、恢复命令

从数据集中复原一个数据文件:
RMAN> restore datafile 'C:\oracle\oradata\ERP\users01.dbf';

恢复一个数据文件:
RMAN> recover datafile 'C:\oracle\oradata\ERP\users01.dbf';

从数据集中复原一个表空间:
RMAN>restore tablespace users;

恢复一个表空间:
RMAN>recover tablespace users;

二、恢复实例
1. 丢失单个数据文件
(假设丢失数据文件C:\oracle\oradata\ERP\users01.dbf)
恢复步骤:
RMAN> restore datafile 'C:\oracle\oradata\ERP\users01.dbf';

RMAN> recover datafile 'C:\oracle\oradata\ERP\users01.dbf';

RMAN>sql ‘alter database open’;

2.        丢失多个数据文件
(假设丢失数据文件C:\oracle\oradata\ERP\users01.dbf 和
C:\oracle\oradata\ERP\tools01.dbf)
   
恢复步骤:
RMAN> restore datafile 'C:\oracle\oradata\ERP\users01.dbf';

RMAN> recover datafile 'C:\oracle\oradata\ERP\users01.dbf';

RMAN>sql ‘alter database open’;
  这一步会出错,继续恢复下一个数据文件。
RMAN> restore datafile 'C:\oracle\oradata\ERP\tools01.dbf';

RMAN> recover datafile 'C:\oracle\oradata\ERP\tools01.dbf';

RMAN>sql ‘alter database open’;

3. 在有恢复目录的情况下丢失所有文件。
首先做一个数据库的整库备份:
RMAN> backup database format ‘c:\rman\%U’;
  
  备份完后一定要切换一次日志文件:
SQL> alter system switch logfile; (演示如果没有这一步的结果。)
  
  然后将数据库关闭,删除所有文件。
  准备启动数据库:
  SQL>startup   
这一步会出错,然后进行恢复。

首先恢复控制文件:
RMAN> restore controlfile;

接着恢复所有的数据文件:
RMAN> restore database;
RMAN> shutdown immediate;
RMAN> startup;

下面的两步要用SQL * PLUS来完成
SQL> recover database until cancel using backup controlfile;
(演示recover database until cancel 的错误。)
SQL> alter database open resetlogs;

注意:恢复完后要添加临时文件。

注意:用resetlogs的方式打开数据库后要在恢复目录中重置目标数据库,否则不
能备份。
RMAN>reset database;

4. 基于时间点的恢复
首先做一个数据库的整库备份:
RMAN> backup database format ‘c:\rman\%U’;
      
      将数据库改成MOUNT状态:
      RMAN>shutdown immediate;
      RMAN>startup mount;

      设置时间格式的环境变量
退出RMAN
C:/>set nls_date_format = yyyy-mm-dd hh24:mi:ss
      
      重新登录RMAN
RMAN>run {
set until time  ‘2004-9-13 14:28:00’;
allocate channe cl type disk;
restore database;
recover database;
release channel cl;
}

SQL> alter database open resetlogs;

5.        在线恢复
将数据库关闭后删除数据文件C:\oracle\oradata\ERP\users01.dbf。
将数据文件C:\oracle\oradata\ERP\users01.dbf脱机后启动数据库:
SQL> ALTER DATABASE DATAFILE ‘C:\oracle\oradata\ERP\users01.dbf’ OFFLINE;


恢复步骤:
RMAN> restore datafile 'C:\oracle\oradata\ERP\users01.dbf';

RMAN> recover datafile 'C:\oracle\oradata\ERP\users01.dbf';

然后在SQL * PLUS 中将数据文件联机:
SQL> ALTER DATABASE DATAFILE ‘C:\oracle\oradata\ERP\users01.dbf’ ONLINE;


三、增量备份
1.增量备份可分为0-4级。0级为完全备份。
增量备份可分为:
差异式:最近一次<=n级增量备份以后变化了的数据。
累加式:最近一次
增量备份
RMAN> Backup incremental level 0 Differential
tag backup_db_level_0
filesperset 6
format  ‘c:\rman\db_%U’
database;

累加式增量备份的关键字为cumulative。
在增量备份与归档日志之间,RMAN优先采用增量备份。
采用增量备份进行恢复比采用归档日志进行恢复效率要高。

2. 跳过只读文件
RMAN>backup
full
#  skip offline
#  skip readonly
skip inaccessible
tag b_db_full
filesperset 6
format  ‘c:\rman\db_%U’
database;

四、用图形界面进行物理备份和物理恢复
节点的首选身份证明设成Administrator(密码不能为空)。
在"本地安全策略"中给Administrator分配"作为批处理作业登录"权限。

图形界面的备份和命令行的备份可以互用。
  
  图形界面可以恢复控制文件。
可以恢复丢失除所有文件的情况,要结合命令完成。
可以做基于时间点的恢复。
数据库打开时,可以在线恢复。

五、删除目标数据库的注册:

用rman/rman登录oemrep数据库。
SQL>select * from db;
SQL>execute dbms_rcvcat.unregisterdatabase(DB_KEY,DB_ID);
SQL>select * from db;

六、SQL *Loader的使用
   SQL *Loader的作用:将文本文件中的数据加载到Oracle 数据库中。
  
先创建数据文件c:\data.txt
   
10001,"Scott Tiger", 1000, 40
10002,"Frank Naude", 500, 20

然后创建控制文件c:\control.txt
load data
infile 'c:\data.txt'
append into table emp
fields terminated by "," optionally enclosed by '"'
( empno, empname, sal, deptno )

表空,用INSERT(缺省)。
表非空,用APPEND、REPLACE、TRUNCATE。

   然后执行SQL *Loader:
c:\>sqlldr system/oracle@erp control=c:\control.txt


练习一 用EXP和IMP进行逻辑备份和逻辑恢复

1. 首先用EXP进行一个数据库的整库逻辑备份
c:\>exp USERID=system/oracle@erp full=y file=c:\logback\full.dmp

2.        然后进行下面三种情况下的逻辑恢复:

a. 表不存在的情况:
删除scott用户下的EMP和DEPT表,然后用下面的命令恢复删除的表:
c:\>imp userid=system/oracle@erp fromuser=scott tables=emp,dept file=c:\logback\full.dmp
      恢复完后检查数据是否完整。

b. 表存在,数据丢失的情况:
删除scott用户下的EMP表的所有数据,但表不要删除,然后用下面的命令恢复删除表的数据:
c:\>imp userid=system/oracle@erp fromuser=scott tables=emp file=c:\logback\full.dmp ignore=y

c.        用户不存在的情况:
删除scott用户,然后用下面的命令恢复删除的用户:
c:\>imp userid=system/oracle@erp fromuser=scott file=c:\logback\full.dmp
  检查出现的错误。

创建scott用户,并将它添加到connect和resource角色。然后再用下面的命令恢复删除的用户:
c:\>imp userid=system/oracle@erp fromuser=scott file=c:\logback\full.dmp


练习二 在非归档模式下进行数据库的冷备份和恢复

1.        将数据库关闭,然后进行数据库的冷备份。
SQL>shutdown immediate

将数据库所有的控制文件、数据文件复制到c:\cold目录。

2.        启动数据库。
SQL>startup
然后将scott用户删除。

将数据库关闭,将冷备份的文件从c:\cold目录复制到数据库文件所在的目录。
启动数据库,将出现下面错误:

错误现象:
ORA-00322: 日志 1 (线程 1) 不是当前副本
ORA-00312: 联机日志 1 线程 1: 'D:\ORACLE\ORADATA\ORADB\REDO01.LOG'

进行不完全介质恢复。
SQL> recover database until cancel
不完全介质恢复。

用重置日志(resetlogs)的方式打开数据库:
SQL> alter database open resetlogs;

恢复完后检查scott用户及其方案下的数据是否存在。


练习三 在有恢复目录的情况下用RMAN进行数据库的热备份

1. 假设要备份的目标数据库是ERP,恢复目录存放在OEMREP数据库中。

每个数据库中已经有了RMAN用户,恢复目录也有了。
在OEMREP数据库中,先要解除RMAN用户的锁定,然后然后用SQL*PLUS登录修改其密码。

2. 使用RMAN进行热备份
使用RMAN
c :\>RMAN target=sys/oracle@erp catalog=rman/rman@onmrep
   
备份之前首先要注册数据库
RMAN> register database;

查看恢复管理器的配置:
RMAN>show all;

4.备份命令
备份整个数据库:
RMAN>run {
allocate channe cl type disk;
backup full filesperset 3
(database format ‘rm_%s%p.%d’);
release channel cl;
}

备份集(backup set)和备份段(backup piece)的含义。

格式的定义:
%p:piece备份段号。 %d:database 数据库名。                 %s:备份集号。
%c(copy号):总为1。 %u:自动生成的8个字符的唯一名称。    %t:时间。
默认格式为 %U=%u_%p_%c。

可用下面的简化命令备份整个数据库:
RMAN> backup database;
备份集的默认路径是C:\Oracle\Ora92\Database。
通道的分配和释放可以省略。

指定备份集的路径:
RMAN> backup database format ‘c:\rman\db_%U’;

备份一个表空间:
RMAN> backup
tablespace users format  ‘c:\rman\ts_%U’;

备份一个数据文件:
RMAN> backup datafile ‘c:\oracle\oradata\erp\users01.dbf’ format  ‘c:\rman\df_%U’;

备份控制文件:
RMAN>Backup current controlfile ‘c:\rman\ctl_%U’;

备份归档日志文件:
RMAN>backup filesperset 20 format  ‘c:\rman\al_%U’
archivelog all  delete input;
   
也可以采用复制的方式备份数据文件和控制文件。

复制数据文件:
RMAN>copy datafile 'c:\oracle\oradata\ERP\users01.dbf' to 'c:\rman\users01.dbf';

复制控制文件:
RMAN>copy current controlfile to  ’c:\rman\ctl.bak’;
   
6.        管理备份集的命令
    查看数据库的备份:
RMAN>list backup of database;

查看废弃的数据库备份:
RMAN> report obsolete;

删除废弃的数据库备份:
RMAN> delete obsolete;
注意不要直接删除备份集的文件。

删除一个备份集:
RMAN>change backuppiece 'C:\ORACLE\ORA92\DATABASE\08FKRJDB_1_1' delete;  
RMAN>change backupset 9 unavailable;


练习四 在有恢复目录的情况下用RMAN进行数据库的恢复

1. 首先做一个数据库的整库备份:
RMAN> backup database format ‘c:\rman\%U’;
  
丢失单个数据文件(假设丢失数据文件C:\oracle\oradata\ERP\users01.dbf)
  关闭数据库,删除数据文件C:\oracle\oradata\ERP\users01.dbf。
  丢失单个数据文件

恢复步骤:

RMAN>startup
RMAN> restore datafile 'C:\oracle\oradata\ERP\users01.dbf';

RMAN> recover datafile 'C:\oracle\oradata\ERP\users01.dbf';

RMAN>sql ‘alter database open’;

2. 在有恢复目录的情况下丢失所有文件。
首先做一个数据库的整库备份:
RMAN> backup database format ‘c:\rman\%U’;
  
  备份完后一定要切换一次日志文件:

SQL> alter system switch logfile; (演示如果没有这一步的结果。)
  
  然后将数据库关闭,删除所有文件。
  准备启动数据库:
  SQL>startup   
这一步会出错,然后进行恢复。

首先恢复控制文件:
RMAN> restore controlfile;

接着恢复所有的数据文件:
RMAN> restore database;
RMAN> shutdown immediate;
RMAN> startup;

下面的两步要用SQL * PLUS来完成
SQL> recover database until cancel using backup controlfile;
(演示recover database until cancel 的错误。)
SQL> alter database open resetlogs;

注意:恢复完后要添加临时文件。

注意:用resetlogs的方式打开数据库后要在恢复目录中重置目标数据库,否则不
能备份。
RMAN>reset database;

3. 基于时间点的恢复
首先做一个数据库的整库备份:
RMAN> backup database format ‘c:\rman\%U’;
      
      将数据库改成MOUNT状态:
      RMAN>shutdown immediate;
      RMAN>startup mount;

      设置时间格式的环境变量
退出RMAN
C:/>set nls_date_format = yyyy-mm-dd hh24:mi:ss
      
      重新登录RMAN
RMAN>run {
set until time  ‘2004-9-13 14:28:00’;
allocate channe cl type disk;
restore database;
recover database;
release channel cl;
}

SQL> alter database open resetlogs;

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

转载于:http://blog.itpub.net/16486600/viewspace-543076/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值