Oracle备份与恢复机制

主 题:Oracle备份与恢复机制
项目名称:公司内部
撰写单位:Bsoft
作 者:屈毅
版 本 号:0.1

日 期:2020-03-10

审核

功能 姓名 部门 签名 日期

文档历史

版本 修改原因 修改人 基于版本 日期
0.1 创建 屈毅 2020-03-10

参考文档

编号 文档名(链接)
1


摘要:本文详细介绍了Oralce的几种数据备份与恢复机制


主题词:Oracle技术 备份 恢复 机制


一、引言

数据安全是数据库系统重要的一方面,怎样使数据库系统的数据遭到破坏或丢失时也能正确恢复而不至造成瘫痪?这里就要用到数据库的备份与恢复机制。
Oracle的备份与恢复机制有哪些?Oracle是怎样进行数据备份与恢复操作的?
此外,Oracle系统遭到破坏而无法正常打开时(如控制文件丢失、联机日志损坏等)又该如何恢复?
这些,本文均做出了较为详细的介绍。

二、Oracle备份方式

备份一个Oracle数据库有三种标准方式: Export(导出)、脱机备份(offline backup)和联机(ARCHIVELOG)备份(online backup),其中,Export为逻辑备份,其它两种方式为物理备份。

2.1 逻辑备份

逻辑备份包括读一个数据库记录集和将记录集写入一个文件中。这些记录的读出与其物理位置无关。在Oracle中,Export实用程序就是用来完成这样的数据库备份的。若要恢复使用由一个导出生成的文件,可使用Oracle的Import实用程序。
注:通过逻辑备份可以备份整个数据库, 或仅备份部分重要数据。因为是逻辑上的备份,故只能用于逻
辑的恢复数据, 一旦数据库被物理损坏, 导致不能启动,逻辑备份的数据不能帮助恢复数据库。

2.1.1 导出

Export用来读取数据库(其中包括数据字典)和把输出写入一个叫作导出转储文件(export dump file)的二进制文件中。可以导出整个数据库、指定用户或指定表。在导出期间,可以选择是否导出与表相关的数据字典信息,如权限、索引和与其相关的约束条件。
Export所写的文件包括完全重建全部被选对象所需的命令。
可以对所有表执行全数据库导出(叫作Complete export)或者仅对上次导出后修改过的表执行全数据库导出。增量导出有两种不同类型: Incremental (增量)型和Cumulative (累积)型。Incremental导出将导出上次导出后修改过的全部表,而Cumulative导出将导出上次完全导出后修改过的表。
还可使用Export来压缩数据段碎片的盘区(通过一次导出导入):

2.1.2 导入

一旦数据已经导出,就可以通过Oracle的Import实用程序将其导入。Import实用程序读取由Export创建的二进制导出转储文件并执行在那里发现的命令。例如,这些命令可能包括一个create table命令,随后是一个将数据装入表内的insert命令。
已导出的数据不必导入到同一个数据库中,也不必导入到与生成导出转储文件相同的模式中。
可以导入全部或部分已导出的数据。如果导入一个全导出的整个导出转储文件,则所有数据库对象(其中包括表空间、数据文件和用户)都会在导入时创建。不过,为了在数据库中指定对象的物理分配,通常预先创建表空间和用户。
如果只打算从导出转储文件中导入部分数据,那么表空间、数据文件和将拥有并存储那些数据的用户必须在导入前设置好。

2.2 物理备份

物理备份是拷贝构成数据库的文件而不管其逻辑内容如何。由于使用操作系统的文件备份命令,所以这些备份也被称作文件系统备份(file system backup)。
Oracle支持两种不同类型的物理文件备份:脱机( offline) 备份和联机(online) 备份(也叫作“hot”(热)或“ARCHIVELOG”备份)。

2.2.1 脱机备份

当数据库已经正常关闭(不包括由失败引起的关闭)时使用脱机备份。当数据库处于 “offline”时,要备份下列文件:
Ø 所有数据文件
Ø 所有控制文件
Ø 所有联机重做日志
Ø init.ora文件(可选择)
当数据库关闭时,对所有这些文件进行备份可以提供一个数据库关闭时的完整镜像。以后可以从备份中获取整个文件集并恢复数据库。

2.2.2 联机备份

可以为正在ARCHIVELOG方式下运行的数据库使用联机备份。在这种方式下,联机重做日志被归档,在数据库内创建一个所有事务的完整记录。
Oracle以循环方式写入联机重做日志文件:在填满第一个日志文件后,开始写第二个文件,直到填满;然后开始写第三个文件…当最后一个联机重做日志文件填满后, LGWR (Log Writer)后台进程开始重写第一个重做日志文件。
当以ARCHIVELOG方式运行Oracle时,ARCH(Archiver)后台进程在写入前将每个重做日志文件做一个拷贝。
假若是运行在ARCHIVELOG方式下,数据库打开时就可以执行一个文件系统备份。联机备份包括将每一个表空间设为备份状态,接着备份其数据文件,然后再将表空间恢复为正常状态。
数据库可从一个联机备份中完全恢复,并且可以通过归档的重做日志,前滚到任一时刻。在数据库中任一提交的事务都将被恢复,任何未提交的事务都将被回滚。
要备份以下文件:
Ø 所有数据文件。
Ø 所有归档的重做日志文件。
Ø 一个控制文件,通过alter database命令进行。
联机备份有以下优点:
第一,提供了完全的时间点(point-in-time)恢复。
第二,在文件系统备份时允许数据库保持打开状态。
因此,即使在用户要求数据库不能关闭时也能备份文件系统。保持数据库打开状态也就可以避免数据库的System Global Area(SGA)被重新设置。避免内存重新设置可减少数据库对物理I/O数量的要求,从而改善数据库的性能。

2.3 不同备份方案的比较

备份方案 综述 优点 缺点
** 冷备份是Oracle最简单的一种备份;执行冷备份前必须关闭数据库;然后使用操作系统实用工具或者第三方工具备份所有相关的数据库文件。 能简单快速地备份。能简单快速地恢复。执行简单。 必须关闭数据库。
不能进行点恢复
热备份 热备份是当数据库正在运行时进行数据备份的过程。执行热备份的前提是:数据库运行在可归档日志模式。适用于24X7不间断运行的关键应用系统。 备份时数据库可以是打开的。热备份可以用来进行点恢复。初始化参数文件、归档日志在数据库正常运行时是关闭的,可用操作系统命令拷贝。 执行过程复杂。由于数据库不间断运行,测试比较困难。不能用操作系统实用工具拷贝打开的文件。必须使用Oracle提供的ocopy工具来拷贝打开的文件。热备份可能造成CPU、I/O过载,应在数据库不太忙时进行
Export导出数据库对象 冷备份和热备份都备份物理数据库文件,因而被称为物理备份。而export备份的是数据库对象,因此被称为逻辑备份 能执行对象或者行恢复。备份和恢复速度更快。能够跨操作系统平台迁移数据库。数据库可一直运行 export并不是冷备份和热备份的替代工具。冷、热备份可保护介质失效。export备份可保护用户或应用错误。

三、逻辑备份与恢复

3.1 逻辑备份

ORACLE数据库的逻辑备份分为三种模式:表备份、用户备份和完全备份。
表模式
备份某个用户模式下指定的对象(表)。业务数据库通常采用这种备份方式。
【示例】
exp icdmain/icd rows=y indexes=n compress=n buffer=65536
feedback=100000 volsize=0
file=exp_icdmain_csd_yyyymmdd.dmp
log=exp_icdmain_csd_yyyymmdd.log
tables=icdmain.commoninformation,icdmain.serviceinfo,icdmain.dealinfo
用户模式
备份某个用户模式下的所有对象。业务数据库通常采用这种备份方式。
【示例】
exp icdmain/icd owner=icdmain rows=y indexes=n compress=n buffer=65536
feedback=100000 volsize=0
file=exp_icdmain_yyyymmdd.dmp
log=exp_icdmain_yyyymmdd.log
完全模式
备份完整的数据库。业务数据库不采用这种备份方式。
【示例】
exp icdmain/icd rows=y indexes=n compress=n buffer=65536
feedback=100000 volsize=0 full=y
file=exp_fulldb_yyyymmdd.dmp
log=exp_fulldb_yyyymmdd.log
在逻辑备份方式中,提供了很强大的一种方法,就是增量导出/导入,但是它必须作为System(用户必须有EXP_FULL_DATABASE的系统角色)来完成增量的导入导出,而且只能是对整个数据库进行实施。增量导出又可以分为三种类别:完全增量导出、增量型增量导出和累积型增量导出
完全增量导出(Complete Export)
这种方式将把整个数据库文件导出备份;
如:exp system/manager inctype=complete file=20041125.dmp
增量型增量导出(Incremental Export)
这种方式将只会备份上一次备份后改变的结果;
如:exp system/manager inctype=incremental file=20041125.dmp
累积型增量导出(Cumulate Export)
这种方式的是导出自上次完全增量导出后数据库变化的信息。
如:exp system/manager inctype=cumulative file=20041125.dmp
在逻辑备份方式中,有许多不同的导出选项,有:

关键字 描述
userid 执行导出的帐户的用户名/口令,如果这是e x p命令后的第一个参数,则关键字userid就不必指定
buffer 用于获取数据行的缓冲区尺寸,缺省值随系统而定,通常设为一个高值( > 64000)
file 导出转储文件的名字
filesize 一个导出转储文件的最大尺寸。如果file条目中列出了多个文件,将根据filesize设置值导出这些文件
compress 一个Y / N标志,用于指定导出是否应把碎片段压缩成单个盘区。这个标志影响将存储到导出文件中的storage子句
grants 一个Y / N标志,用于指定数据库对象的权限是否导出
indxes 一个Y / N标志,用于指示表上的索引是否导出
rows 一个Y / N标志,用于指示行是否导出。如果设置为N,在导出文件中将只创建数据库对象的DDL
constraints 一个Y / N标志,用于指示表上的约束条件是否导出。
full 若设为Y,执行Full数据库导出
owner 导出数据库帐户的清单;可以执行这些账户的User导出
tables 导出表的清单,可以执行这些表的Table导出
recordlength 导出转储文件记录的长度,以字节为单位。除非是在不同的操作系统间转换导出文件,否则就使用缺省值
inctype 要执行的导出类型(允许值为COMPLETE (缺省) 、CUMULATIVE和
INCREMENTAL )
direct 一个Y / N标志,用于指示是否执行Direct导出。Direct导出在导出期间绕过缓冲区,从而大大提高导出处理的效率
record 用于Incremental导出,这个Y / N标志指示一个记录是否存储在记录导出的数据字典表中
parfile 传递给Export的一个参数文件名。这个文件可以包含这里列出的全部参数条目
Statistics 这个参数指示导出对象的analyze命令是否应写到导出转储文件上。其有效值是COMPUTE、ESTIMATE ( 缺省)和N
consistent 一个Y / N标志,用于指示是否应保留全部导出对象的读一致版本在Export处理期间,当相关的表被用户修改时需要这个标志
log 一个要写导出日志的文件名
Feedback 表导出时显示进度的行数。缺省值是0,所以在一个表全部导出前没有反馈显示
point_in_time_recover 一个Y / N标志,用于向Oracle指示,是否正在导出用于表空间时间点恢复的元数据。这是个高级恢复技术
recover_tablespaces 在表空间时间点恢复期间,其元数据应被导出的表空间
query 导出时用于每个表的where子句
transport_tablespace 如果正在使用Oracle 8i的可移动表空间选项,就设置成Y。和关键字tablespace一起使用
tablespaces 移动一个表空间时应导出其元数据的表空间

3.2 逻辑恢复

数据库的逻辑恢复分为表恢复、用户恢复、完全恢复三种模式。
表模式
此方式将根据按照表模式备份的数据进行恢复。
1、恢复备份数据的全部内容
【示例】
imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n
commit=y buffer=65536 feedback=100000 ignore=n volsize=0
file=exp_icdmain_csd_yyyymmdd.dmp
log=imp_icdmain_csd_yyyymmdd.log
2、恢复备份数据中的指定表
【示例】
imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n
commit=y buffer=65536 feedback=100000 ignore=n volsize=0
file=exp_icdmain_cs d_yyyymmdd.dmp
log=imp_icdmain_csd_yyyymmdd.log
tables=commoninformation,serviceinfo
用户模式
此方式将根据按照用户模式备份的数据进行恢复。
1、恢复备份数据的全部内容
【示例】
imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n
commit=y buffer=65536 feedback=100000 ignore=n volsize=0
file=exp_icdmain_yy yymmdd.dmp
log=imp_icdmain_yyyymmdd.log
2、恢复备份数据中的指定表
【示例】
imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n
commit=y buffer=65536 feedback=100000 ignore=n volsize=0
file=exp_icdmain_yy
yymmdd.dmp
log=imp_icdmain_yyyymmdd.log
tables=commoninformation,serviceinfo
完全模式
如果备份方式为完全模式,采用下列恢复方法:
【示例】
imp system/manager rows=y indexes=n commit=y buffer=65536
feedback=100000 ignore=y volsize=0 full=y
file=exp_icdmain_yyyymmdd.dmp
log=imp_icdmain_yyyymmdd.log
参数说明
1、 ignore参数 Oracle在恢复数据的过程中,当恢复某个表时,该表已经存在, 就要根据ignore参数的设置来决定如何操作。 若ignore=y,Oracle不执行CREATE TABLE语句,直接将数据插入到表中,如果插入的记录违背了约束条件,比如主键约束,则出错的记录不会插入,但合法的记录会添加到表中。 若ignore=n,Oracle不执行CREATE TABLE语句,同时也不会 将数据插入到表中,而是忽略该表的错误,继续恢复下一个表。
2、 indexes参数 在恢复数据的过程中,若indexes=n,则表上的索引不会被恢复 ,但是主键对应的唯一索引将无条件恢复,这是为了保证数据的完整性。

3.3 应用实例

3.3.1备份时

我们采用普遍认可的下面的方式进行每天的增量备份(实际可根据企业或DBA自己的习惯进行):
周一: 完全备份(A)
周二: 增量导出(B)
周三: 增量导出(C)
周四: 增量导出(D)
周五: 累计导出(E)
周六: 增量导出(F)
周日: 增量导出(G)
这样,我们可以保证每周数据的完整性,以及恢复时的快捷和最大限度的数据损失。

3.3.2 恢复时

恢复的时候,假设事故发生在周末,可按以下的步骤来恢复数据库:
第一步:用命令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
第六步:删除创建的附加回滚。

四、脱机备份与恢复

4.1 脱机备份

在备份开始前数据库必须彻底关闭。关闭操作必须用带有normal、immediate、transaction选项的shutdown来执行。
要备份的内容:
数据库使用的每个文件都被备份下来,这些文件包括:
Ø 所有数据文件 (可通过V$DATAFILE查看)
Ø 所有控制文件 (可通过V$CONTROLFILE查看)
Ø 所有REDO LOG文件(处于归档模式时)
Ø INIT.ORA文件(可选)
备份步骤:
正常关闭要备份的实例(instance);
备份整个数据库(相关文件)到一个目录
启动数据库
备份实例:
参见本文第七部分——物理备份/恢复实例研究

4.2 恢复

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

五、联机备份与恢复

5.1 联机备份

当Oracle数据库处于打开状态,并以ARCHIVELOG模式操作时可采用联机备份。
要备份的内容:
Ø 所有数据文件
Ø 控制文件
Ø 所有归档的REDO LOG文件
Ø INIT.ORA文件
联机备份具体步骤:
1) 使数据库处于ARCHIVELOG模式(备份前设置数据库归档模式)
SQL>shutdown immediate;
SQL >startup mount exclusive;
SQL >alter database archivelog; //启动日志归档
SQL >archive log start//启动日志自动归档
SQL >alter database open; //在mount下打开数据库
2) 设置初始化文件init.ora (备份前相关归档参数设置)
log_archive_start = true #设置数据库自动归档
log_archive_dest_1=”D:\oracle\oradata\dbserver\archive” #设置归档日志文件的目录,该
#目录必须事先已建立,并有大量可利用的空间
log_archive_format = “%oracle_sid%%T%S.ARC” #设置归档日志文件名的格式。
#%s表示顺序号,%t表示线程号。
3) 将要备份的表空间设为热备份模式(以下为具体备份步骤)
SQL > ALTER TABLESPACE tablespace_name BEGIN BACKUP;
4) 使用操作系统命令备份改表空间的datafile
host copy 源目标目的目标
5) 取消该表空间的热备份模式
SQL > ALTER TABLESPACE tablespace_name END BACKUP;
注意:temp临时表空间不可以热备份
6) 如还有其他要备份的表空间,重复3-5
7) 强制日志切换
SQL > ALTER SYSTEM SWITCH LOGFILE ;
8) 使用os命令备份所有归档日志文件
SQL >host ocopy 源目标 目的目标
9) 备份control file
SQL >>ALTER DATABASE BACKUP CONTROLFILE TO ‘file’ reuse;
10) 备份初始化参数文件
拷贝init.ora文件到备份目录(参数文件在数据库启动后处于关闭状态)

5.2 联机恢复

热备份的恢复,对于归档方式数据库的恢复要求不但有有效的日志备份还要求有一个在归档方式下作的有效的全库备份。归档备份在理论上可以无数据丢失,但是对于硬件以及操作人员的要求都比较高。在我们使用归档方式备份的时候,全库物理备份也是非常重要的。归档方式下数据库的恢复要求从全备份到失败点所有的日志都要完好无缺。
联机恢复具体步骤:
1) shutdown数据库
2) 将全备份的数据文件放到原来系统的目录中。
3) 将全备份到失败点的所有归档日志放到参数LOG_ARCHIVE_DEST_1所指定的位置。
4) 利用sqlplus登陆到空实例。(connect / as sysdba)
5) 然后
startup mount
set autorecovery on
recover database;
—若恢复到某一时间点recover database until time ‘2005-02-28:14:43:01’;
—若恢复到某一scn号 recover database until scn 31014;
alter database open;

六、其它恢复案例

6.1 损坏联机日志的恢复

6.1.1 损坏非当前联机日志

联机日志分为当前联机日志和非当前联机日志,非当前联机日志的损坏是比较简单的,一般通过clear命令就可以解决问题。
A. 启动数据库,遇到ORA-00312 或 ORA-00313错误,如
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: ‘D:\Oracle\ORADATA\TEST\REDO01.LOG’
从这里我们知道日志组1的数据文件损坏了
B. 查看V$log视图
select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARCHIVED STATUS
————— ————— ———— ————————
1 1 YES INACTIVE
2 2 YES INACTIVE
3 3 NO CURRENT
可以知道,该组是非当前状态,而且已经归档。
C. 用CLEAR命令重建该日志文件
SQL>alter database clear logfile group 1;
如果是该日志组还没有归档,则需要用
SQL>alter database clear unarchived logfile group 1;
D. 打开数据库,重新备份数据库
SQL>alter database open;
说明:
1. 如果损坏的是非当前的联机日志文件,一般只需要clear就可以重建该日志文件,但是如果该数据库处于归档状态但该日志还没有归档,就需要强行clear;
2. 建议clear,特别是强行clear后作一次数据库的全备份;
3. 此方法适用于归档与非归档数据库。

6.1.2 损坏当前联机日志

归档模式下当前日志的损坏有两种情况:
1. 数据库正常关闭,日志文件中没有未决的事务需要实例恢复,当前日志组的损 坏就可以直接用alter database clear unarchived logfile group n来重建。
2. 日志组中有活动的事务,数据库需要媒体恢复,日志组需要用来同步,有两种补救办法:
A. 最好的办法就是通过不完全恢复,可以保证数据库的一致性,但是这种办法要求在归档方式下,并且有可用的备份
B. 通过强制性恢复,但是可能导致数据库不一致。
通过备份来恢复
1) 打开数据库,会遇到一个类似的错误
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: ‘D:\Oracle\ORADATA\TEST\REDO01.LOG’
ORA-27041: unable to open file
OSD-04002: unable to open file
2) 查看V$log,发现是当前日志
SQL> select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARCHIVED STATUS
————- ————— ———— ————————
1 1 NO CURRENT
2 2 YES INACTIVE
3 3 YES INACTIVE
3) 发现clear不成功
SQL> alter database clear unarchived logfile group 1;
alter database clear unarchived logfile group 1
ERROR at line 1:
ORA-01624: log 1 needed for crash recovery of thread 1
ORA-00312: online log 1 thread 1: ‘D:\Oracle\ORADATA\TEST\REDO01.LOG’
4) 拷贝有效的数据库的全备份,并不完全恢复数据库:
可以采用获取最近的SCN的办法用until scn恢复或用until cnacel恢复
recover database until cancel
先选择auto,尽量恢复可以利用的归档日志,然后重新
recover database until cancel
这次输入cancel,完成不完全恢复,也就是说恢复两次。
如:
SQL> recover database until cancel;
Auto
……
SQL> recover database until cancel;
Cancel;
5) 利用alter database open resetlogs打开数据库.
说明:
1. 这种办法恢复的数据库是一致的不完全恢复,会丢失当前联机日志中的事务数据;
2. 这种方法适合于归档数据库并且有可用的数据库全备份;
3. 恢复成功之后,记得再做一次数据库的全备份;
4. 建议联机日志文件一定要实现镜相在不同的磁盘上,避免这种情况的发生,因为任何数据的丢失对于生产来说都是不容许的。
如果没有备份,进行强制性恢复
1) 前三步同上
2) 把数据库down掉 SQL>shutdown immediate
3) 在init.ora中加入如下参数 _allow_resetlogs_corruption=TRUE
4) 重新启动数据库,利用until cancel恢复
SQL>recover database until cancel;
Cancel
如果出错,不再理会,发出
SQL>alter database open resetlogs;
5) 数据库被打开后,马上执行一个full export
6) shutdown数据库,去掉_all_resetlogs_corrupt参数
7) 重建库
8) import并完成恢复
9) 建议执行一下ANALYZE TABLE …VALIDATE STRUCTURE CASCADE;
说明:
1. 该恢复方法是没有办法之后的恢复方法,一般情况下建议不要采用,因为该方法可能导致数据库的不一致;
2. 该方法也丢失数据,但是丢失的数据没有上一种方法的数据多,主要是未写入数据文件的已提交或未提交数据;
3. 建议成功后严格执行以上的5到9步,完成数据库的检查与分析;
4. 全部完成后做一次数据库的全备份;
*5.
建议联机日志文件一定要实现镜相在不同的磁盘上,避免这种情况的发生,因为任何数据的丢失对于生产来说都是不容许的。

6.2 损坏控制文件的恢复

6.2.1 损坏单个控制文件的恢复

  1. 损坏单个控制文件是比较容易恢复的,因为一般的数据库系统,控制文件都不是一个,而且所有的控制文件都互为镜相,只要拷贝一个好的控制文件替换坏的控制文件就可以了。<br />1 控制文件损坏,最典型的就是启动数据库出错,不能mount数据库<br />SQL>startup<br />ORA-00205: error in identifying controlfile, check alert log for more info<br />2 停止数据库:SQL>shutdown immediate<br />3 拷贝一个好的控制文件替换坏的控制文件或修改init.ora中的控制文件参数,取消这个坏的控制文件。<br />4 重新启动数据:SQL>startup<br />**说明:**<br />1 损失单个控制文件是比较简单的,因为数据库中所有的控制文件都是镜相的,只需要简单的拷贝一个好的就可以了;<br />2 建议镜相控制文件在不同的磁盘上;<br />3 建议多做控制文件的备份,长期保留一份由alter database backup controlfile to trace产生的控制文件的文本备份。

6.2.2 损坏全部控制文件的恢复

损坏全部控制文件,或者人为的删除了所有的控制文件,通过控制文件的复制已经不能解决问题,这个时候需要重新建立控制文件。
注意:alter database backup controlfile to trace可以产生一个控制文件的文本备份。
以下是重新创建控制文件的详细步骤:
1、 启动数据库,出现错误(且报警日志文件中有不能打开控制文件的错),并不能启动到mount下
SQL>startup
ORA-00205: error in identifying controlfile, check alert log for more info
2、 关闭数据库SQL>shutdown immediate;
3、 在internal或sys下运行如下创建控制文件的脚本,注意完整列出联机日志或数据文件的路径,或修改由alter database backup control file to trace(将创建到$oraclebase\admin\TEST\udump\udump文件夹下)备份控制文件时产生的脚本(一般在下),去掉多余的注释即可。
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE “TEST” NORESETLOGS NOARCHIVELOG
MAXLOGFILES 32
MAXLOGMEMBERS 2
MAXDATAFILES 254
MAXINSTANCES 1
MAXLOGHISTORY 226
LOGFILE
GROUP 1 ‘D:\Oracle\ORADATA\TEST\REDO01.LOG’ SIZE 1M,
GROUP 2 ‘D:\Oracle\ORADATA\TEST\REDO02.LOG’ SIZE 1M,
GROUP 3 ‘D:\Oracle\ORADATA\TEST\REDO03.LOG’ SIZE 1M
DATAFILE
‘D:\Oracle\ORADATA\TEST\SYSTEM01.DBF’,
‘D:\Oracle\ORADATA\TEST\RBS01.DBF’,
‘D:\Oracle\ORADATA\TEST\USERS01.DBF’,
‘D:\Oracle\ORADATA\TEST\TEMP01.DBF’,
‘D:\Oracle\ORADATA\TEST\TOOLS01.DBF’,
‘D:\Oracle\ORADATA\TEST\INDX01.DBF’
CHARACTER SET ZHS16GBK;
— 如果需要恢复或最后一次关闭不是用normal或immediate
RECOVER DATABASE
—如果最后一次关闭不是用normal或immediate
—不归档模式
— RECOVER DATABASE UNTIL CANCELUSING BACKUP CONTROLFILE
—归档模式
— RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL
ALTER DATABASE OPEN;
—如果 recover database until cancel
—ALTER DATABASE OPEN RESETLOGS;
说明:
1、 重建控制文件用于恢复全部数据文件的损坏,需要注意其书写的正确性,保证包含了所有的数据文件与联机日志;
2、 经常有这样一种情况,因为一个磁盘损坏,我们不能再恢复(store)数据文件到这个磁盘,因此在store到另外一个盘的时候,我们就必须重新创建控制文件,用于识别这个新的数据文件,这里也可以用这种方法用于恢复。

6.3 损坏回滚数据文件的恢复

回滚段表空间中的一个数据文件丢失或者损坏导致数据库无法识别它,在启动数据库的或关闭数据库的时候(normal或者immediate)也会出现这样或那样的错误。
回滚段表空间出错及恢复比较复杂,此处不做介绍。有兴趣可参考其它相关文档。

6.4 损坏临时数据文件的恢复方法

临时数据文件的恢复是比较简单的,因为临时文件中不涉及到其它的有用的数据,所以可以删除后重建。
1、 关闭数据库:
SQL>shutdown immediate
2、 删除临时数据文件,模拟媒体失败;
3、 启动数据库,检测到文件错误;
4、 脱机该数据文件:
SQL>alter database datafile ‘文件名全名’ offline drop;
5、 打开数据库
SQL>alter database open
6、删除该临时表空间
SQL>drop tablespace temp(或其它临时表空间名称);
7、重新创建该表空间,并重新分配给用户。
说明:
1、 临时数据文件是非重要文件,不保存永久数据,可以随时删除重建,不影响数据库的数据安全;
2、 如果重新建立以后,别忘了重新分配给用户。

七、物理备份/恢复实例研究

下面通过一完整实例来研究Oracle数据库物理备份与恢复机制。实例完全经过测试,可仿照练习。

7.1 数据库环境

环境为:
OS:Windows 2000 Server
DB:Oracle 817
DBNAME:TEST
数据文件:
SQL> select file#,status,enabled,name from v$datafile;
FILE# STATUS ENABLED NAME
————————————————————————————————
1 SYSTEM READ WRITE E:\Oracle\ORADATA\TEST\SYSTEM01.DBF
2 ONLINE READ WRITE E:\Oracle\ORADATA\TEST\RBS01.DBF
3 ONLINE READ WRITE E:\Oracle\ORADATA\TEST\USERS01.DBF
4 ONLINE READ WRITE E:\Oracle\ORADATA\TEST\TEMP01.DBF
5 ONLINE READ WRITE E:\Oracle\ORADATA\TEST\TOOLS01.DBF
6 ONLINE READ WRITE E:\Oracle\ORADATA\TEST\INDX01.DBF
控制文件:
SQL> select from v$controlfile;
STATUS NAME
——————————————————————————————————-
E:\Oracle\ORADATA\TEST\CONTROL01.CTL
E:\Oracle\ORADATA\TEST\CONTROL02.CTL
E:\Oracle\ORADATA\TEST\CONTROL03.CTL
联机日志:
SQL> select
from v$logfile;
GROUP# STATUS MEMBER
——————————————————————————————————-
1 D:\Oracle\ORADATA\TEST\REDO01.LOG
2 D:\Oracle\ORADATA\TEST\REDO02.LOG
3 D:\Oracle\ORADATA\TEST\REDO03.LOG

7.2 数据库备份脚本

7.2.1 冷备份脚本

rem script:e:\coldbak.sql
—连接数据库
connect internal/oracle;
—关闭数据库
shutdown immediate;
—备份(数据文件, 控制文件和日志文件)
$xcopy e:\Oracle\oradata\test*.dbf e:\database\H\R;
$xcopy e:\Oracle\oradata\test*.ctl e:\database\H\R;
$xcopy e:\Oracle\oradata\test*.log e:\database\H\R;
—打开数据库
startup;

7.2.2 OS热备份脚本

rem script:e:\hotbak.sql
—连接数据库
connect internal/oracle;
—归档
alter system archive log current;
—开始
alter tablespace system begin backup;
$xcopy e:\Oracle\oradata\test\system01.dbf e:\databak\H\R;
alter tablespace system end backup;
alter tablespace rbs begin backup;
$xcopy e:\Oracle\oradata\test\rbs01.dbf e:\databak\H\R;
alter tablespace rbs end backup;
alter tablespace users begin backup;
$xcopy e:\Oracle\oradata\test\users01.dbf e:\databak\H\R;
alter tablespace users end backup;
alter tablespace tools begin backup;
$xcopy e:\Oracle\oradata\test\tools01.dbf e:\databak/H/R;
alter tablespace tools end backup;
alter tablespace indx begin backup;
$xcopy e:\Oracle\oradata\test\indx01.dbf e:\databak\H\R;
alter tablespace indx end backup;
—结束
—备份控制文件
—binary
alter database backup controlfile to ‘e:\databak\controlbinbak.000’;
—ascii
alter database backup controlfile to trace;
alter system archive log current;

7.3 备份恢复案例

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

备份方案:采用OS冷备份
1、 连接数据库并创建测试表
SQL> connect internal/oracle as sysdba;
已连接。
SQL> create table test(a int);
表已创建
SQL> insert into test values(1);
已创建 1 行
SQL> commit;
提交完成
2、 备份数据库
SQL>@e:\coldbak.sql
3、 再插入记录
SQL> insert into test values(2);
已创建 1 行
SQL> commit;
提交完成
SQL> select from test;
A
—————————-
1
2
4、 关闭数据库
SQL>shutdown immediate;
5、 毁坏一个或多个数据文件,如删除user01.dbf
SQL>$del e:\Oracle\ORADATA\TEST\USERS01.DBF
6、 重新启动数据库,会发现如下错误
SQL>startup
ORACLE 例程已经启动。
Total System Global Area 55171100 bytes
Fixed Size 75804 bytes
Variable Size 19693568 bytes
Database Buffers 35323904 bytes
Redo Buffers 77824 bytes
数据库装载完毕。
ORA-01157: ????/?????? 3 - ??? DBWR ????
ORA-01110: ???? 3: ‘E:\ORACLE\ORADATA\TEST\USERS01.DBF’
在报警文件中,会有更详细的信息
Errors in file E:\oracle\admin\TEST\bdump\testDBW0.TRC:
ORA-01157: cannot identify/lock data file 3 - see DBWR trace file
ORA-01110: data file 3: ‘E:\ORACLE\ORADATA\TEST\USERS01.DBF’
ORA-27041: unable to open file
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
ORA-1157 signalled during: ALTER DATABASE OPEN…
7、 拷贝备份复原到原来位置(恢复过程)
SQL> shutdown immediate;
SQL>$xcopy e:\database\h\r\
. e:\Oracle\oradata\test\
8、 打开数据库,检查数据
SQL>startup;
SQL> select
from test;
A
———————————————————-
1
这里可以发现,数据库恢复成功,但在备份之后与崩溃之前的数据丢失了。
说明:
1、 非归档模式下的恢复方案可选性很小,一般情况下只能有一种恢复方式,就是数据库的冷备
份的完全恢复,仅仅需要拷贝原来的备份就可以(restore),不需要recover;
2、 这种情况下的恢复,可以完全恢复到备份的点上,但是可能是丢失数据的,在备份之后与崩溃之前的数据将全部丢失;
3、 不管毁坏了多少数据文件或是联机日志或是控制文件,都可以通过这个办法恢复,因为这个恢复过程是Restore所有的冷备份文件,而这个备份点上的所有文件是一致的,与最新的数据库没有关系,就好比把数据库又放到了一个以前的”点”上;
4、 对于非归档模式下,最好的办法就是采用OS的冷备份

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

1、 连接数据库并创建测试表
SQL> connect internal/oracle as sysdba;
已连接。
SQL> create table test(a int) tablespace users;
表已创建
SQL> insert into test values(1);
已创建 1 行
SQL> commit;
提交完成
2、 备份数据库
SQL>@e:\hotbak.sql;
3、 继续在测试表中插入记录
SQL> insert into test values(2);
已创建 1 行
SQL> commit;
提交完成
SQL> alter system switch logfile;
系统已更改
4、 关闭数据库,模拟丢失数据文件
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL>$del e:\Oracle\ORADATA\TEST\USERS01.DBF;
5、 启动数据库错误,脱机该数据文件
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 55171100 bytes
Fixed Size 75804 bytes
Variable Size 19693568 bytes
Database Buffers 35323904 bytes
Redo Buffers 77824 bytes
数据库装载完毕。
ORA-01157: ????/?????? 3 - ??? DBWR ????
ORA-01110: ???? 3: ‘E:\ORACLE\ORADATA\TEST\USERS01.DBF’;
还可以查看报警文件(见上一个恢复案例)或动态视图v$recover_file
SQL> select from v$recover_file;
FILE# ONLINE ERROR CHANGE# TIME
————— ———- ————————— ————— —————-
3 ONLINE FILE NOT FOUND 0
脱机数据文件
SQL> alter database datafile 3 offline drop;
数据库已更改
6、 打开数据库,拷贝备份回来(restore),恢复(recover)该数据文件,并联机
SQL> alter database open
数据库已更改
拷贝备份从备份处
SQL>$copy E:\databak\H\R\users01.dbf e:\Oracle\oradata\test;
恢复该数据文件
SQL> recover datafile 3;
完成介质恢复。
恢复成功,联机该数据文件
SQL> alter database datafile 3 online;
数据库已更改
7、 检查数据库的数据(完全恢复)
SQL> select
from test;
A
—————
1
2
说明:
1、 采用热备份,需要运行在归档模式下,可以实现数据库的完全恢复,也就是说,从备份后到数据库崩溃时的数据都不会丢失;
2、 可以采用全备份数据库的方式备份,对于特殊情况,也可以只备份特定的数据文件,如只备份用户表空间(一般情况下对于某些写特别频繁的数据文件,可以单独加大备份频率);
3、 如果在恢复过程中,发现损坏的是多个数据文件,即可以采用一个一个数据文件的恢复方法(第5步中需要对数据文件一一脱机,第6步中需要对数据文件分别恢复),也可以采用整个数据库的恢复方法;
4、 如果是系统表空间的损坏,不能采用此方法。

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

1、 连接数据库并创建测试表
SQL> connect internal/oracle as sysdba;
已连接。
SQL> create table test(a int) tablespace users;
表已创建
SQL> insert into test values(1);
已创建 1 行
SQL> commit;
提交完成
2、 备份数据库
SQL>@e:\hotbak.sql;
3、 继续在测试表中插入记录
SQL> insert into test values(2);
已创建 1 行
SQL> commit;
提交完成
SQL> alter system switch logfile;
系统已更改
4、 关闭数据库,模拟丢失数据文件
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL>$del e:\Oracle\ORADATA\TEST\USERS01.DBF;
SQL>$del e:\Oracle\ORADATA\TEST\INDX01.DBF;
SQL>$del e:\Oracle\ORADATA\TEST\TOOLS01.DBF;
SQL>$del e:\Oracle\ORADATA\TEST\RBS01.DBF;
5、 启动数据库错误,脱机该数据文件
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 55171100 bytes
Fixed Size 75804 bytes
Variable Size 19693568 bytes
Database Buffers 35323904 bytes
Redo Buffers 77824 bytes
数据库装载完毕。
ORA-01157: ????/?????? 3 - ??? DBWR ????
ORA-01110: ???? 3: ‘E:\ORACLE\ORADATA\TEST\RBS01.DBF’;
还可以查看报警文件(见上一个恢复案例)或动态视图v$recover_file
SQL> select from v$recover_file;
FILE# ONLINE ERROR CHANGE# TIME
————— ———- ————————— ————— —————-
2 ONLINE FILE NOT FOUND 0
3 ONLINE FILE NOT FOUND 0
5 ONLINE FILE NOT FOUND 0
6 ONLINE FILE NOT FOUND 0
6、 拷贝备份回到原地点(restore),开始恢复数据库(recover)
SQL>$copy E:\databak\H\R\users01.dbf e:\Oracle\oradata\test;
SQL>$copy E:\databak\H\R\INDX01.dbf e:\Oracle\oradata\test;
SQL>$copy E:\databak\H\R\TOOLS01.DBF; e:\Oracle\oradata\test;
SQL>$copy E:\databak\H\R\rbs01.dbf e:\Oracle\oradata\test;
Recover过程
SQL>recover database;
完成介质恢复
7、 打开数据库,检查数据库的数据(完全恢复)
SQL> alter database open;
数据库已更改
SQL> select
from test;
A
—————
1
2
说明:
1、 只要有备份与归档存在,就可以实现数据库的完全恢复(不丢失数据);
2、 适合于丢失大量数据文件,或包含系统数据文件在内的数据库的恢复;
3、 恢复过程在mount下进行,如果恢复成功,再打开数据库,down机时间可能比较长一些。

7.3.4 不完全恢复案例(基于时间的恢复)

1、 连接数据库并创建测试表
SQL> connect internal/oracle as sysdba;
已连接。
SQL> create table test(a int) tablespace users;
表已创建
SQL> insert into test values(1);
已创建 1 行
SQL> commit;
提交完成
2、 备份数据库
SQL>@e:\hotbak.sql;
3、 删除测试表,假定删除前的时间为T1,在删除之前,便于测试,继续插入数据并应用到归档。
SQL> insert into test values(2);
已创建 1 行
SQL> commit;
提交完成
SQL> alter system switch logfile;
系统已更改
SQL> alter system switch logfile;
系统已更改
SQL> select to_char(sysdate,’yyyy-mm-dd hh24:mi:ss’) from dual;
TO_CHAR(SYSDATE,’YY
—————————-
2005-03-15 10:28:08
SQL> drop table test;
表已丢弃.
4、 准备恢复到时间点T1,找回删除的表,先关闭数据库:
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
5、 拷贝刚才备份的所有数据文件回来
SQL>$copy E:\databak\H\R*.dbf e:\Oracle\oradata\test;
6、 启动到mount下
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 55171100 bytes
Fixed Size 75804 bytes
Variable Size 19693568 bytes
Database Buffers 35323904 bytes
Redo Buffers 77824 bytes
数据库装载完毕。
7、 开始不完全恢复到T1时间
SQL> recover database until time ‘2005-03-15 10:28:08’;
8、 打开数据库,检查数据库的数据
SQL> alter database open resetlogs;
数据库已更改
SQL> select from test;
A
—————
1
2
*说明:

1、 不完全恢复最好备份所有的数据,冷备份亦可,因为恢复过程是从备份点往后恢复的,如果因为其中一个数据文件的时间戳(SCN)大于要恢复的时间点,那么恢复都是不可能成功的;
2、 不完全恢复有三种方式,过程都一样,仅仅是recover命令有所不一样,这里用基于时间的恢复作为示例;
3、 不完全恢复之后,都必须用resetlogs的方式打开数据库,建议马上再做一次全备份,因为resetlogs之后再用以前的备份恢复是很难了;
4、 以上是在删除之前获得时间,但是实际应用中,很难知道删除之前的实际时间,但可以采用大致时间即可,或可以采用分析日志文件(logmnr),取得精确的需要恢复的时间;
5、 一般都是在测试机后备用机器上采用这种不完全恢复,恢复之后导出/导入被误删的表回生产系统.

附录一、通用冷备份脚本

请将以下脚本存为coldbak.cmd文件,双击执行该脚本,就可自动进行相应冷备份,可放在Windows的计划任务中定时执行(其中红字部分请根据实际环境修改)。
rem Oracle数据库冷备份脚本文件名coldbak.cmd
rem 用于Windows NT/2000 平台!
rem 该脚本执行后,在c:\temp目录中产生db_restrict.sql、db_shut.sql、db_start.sql、
rem cold.sql、cold.cmd等5个脚本文件,冷备份的核心命令在cold.cmd中。
rem 设置SID
set oracle_sid=test
rem 设置初始化参数文件
set my_pfile=e:\oracle\ora81\database\initTEST.ora
set my_ifile=e:\Oracle\admin\test\pfile\initTEST.ora
rem 设置归档日志目录
set my_archive_dir=E:\oracle\oradata\test\archive
rem 设置internal帐户的密码
set my_password=oracle
rem 建立临时目录
mkdir c:\temp
set my_temp=c:\temp
rem 建立备份目录,该目录必须有足够大的空间用于存放数据库的备份文件
mkdir e:\backup
mkdir e:\backup\pfile
mkdir e:\backup\ifile
set my_bakdir=e:\backup
rem ==== (1) create script file db_restrict.sql=====
echo connect internal/%my_password%; >%my_temp%\db_restrict.sql
echo shutdown immediate; >> %my_temp%\db_restrict.sql
echo startup restrict pfile=%my_pfile%; >>%my_temp%\db_restrict.sql
echo exit >> %my_temp%\db_restrict.sql
rem ==== (2) create script file db_shut.sql =====
echo connect internal/%my_password%; >%my_temp%\db_shut.sql
echo shutdown immediate; >>%my_temp%\db_shut.sql
echo exit >>%my_temp%\db_shut.sql
rem ==== (3) create script file db_start.sql =====
echo connect internal/%my_password%; >%my_temp%\db_start.sql
echo startup pfile=%my_pfile%; >>%my_temp%\db_start.sql
echo exit >>%my_temp%\db_start.sql
svrmgrl @%my_temp%\db_restrict.sql
rem ==== (4) create script file cold.sql =====
echo set heading off; >%my_temp%\cold.sql
echo set feedback off; >>%my_temp%\cold.sql
echo spool %my_temp%\cold.cmd; >>%my_temp%\cold.sql
echo 在这里设计冷备份的命令,备份控制文件、数据文件和日志文件
echo select ‘copy ‘ ^|^| name ^|^| ‘ %my_bakdir%’ from v$controlfile; >>%my_temp%\cold.sql
echo select ‘copy ‘ ^|^| member ^|^| ‘ %my_bakdir%’ from v$logfile; >>%my_temp%\cold.sql
echo select ‘copy ‘ ^|^| file_name ^|^| ‘ %my_bakdir%’ from dba_data_files; >>%my_temp%\cold.sql
echo spool off; >>%my_temp%\cold.sql
echo exit >>%my_temp%\cold.sql
rem ===== (5) run cold.sql to genrate cold.cmd ========
sqlplus internal/%my_password% @%my_temp%\cold.sql
echo 在这里设计冷备份的命令,备份参数文件、归档日志文件
echo. >> %my_temp%\cold.cmd
echo copy %my_pfile% %my_bakdir%\pfile >> %my_temp%\cold.cmd
echo copy %my_ifile% %my_bakdir%\ifile >> %my_temp%\cold.cmd
echo. >> %my_temp%\cold.cmd
echo copy %my_archive_dir%*.* %my_bakdir% >> %my_temp%\cold.cmd
rem ===== shut down database ========
svrmgrl @%my_temp%\db_shut.sql
rem ====== run cold.cmd to perform the cold backup 开始执行冷备份 ======
call %my_temp%\cold.cmd
rem ====== start up the database =======
svrmgrl @%my_temp%\db_start.sql
echo ===== 冷备份完成 ======

附录二、通用热备份脚本

请将以下脚本存为hotbak.cmd文件,双击执行该脚本,就可自动进行相应热备份,可放在Windows的计划任务中定时执行(其中红字部分请根据实际环境修改)。
rem Oracle数据库热备份脚本文件名hotbak.cmd
rem 用于Windows NT/2000 平台!!!
rem 该脚本执行后,在c:\temp目录中产生minlog.sql、minlog.cmd、
rem tblspc01.sql、tblspc02.sql、control01.sql、control02.sql、
rem maxlog.sql、maxlog.cmd、archive.sql、archive.cmd等10个脚本文件。
rem 设置SID
set oraclesid=test
rem 设置初始化参数文件
set my_pfile=e:\oracle\ora81\database\initTEST.ora
set my_ifile=e:\Oracle\admin\test\pfile\initTEST.ora
rem 设置归档日志目录
set my_archive_dir=e:\oracle\oradata\test\archive
rem 设置internal帐户的密码
set my_password=oracle
rem 建立临时目录
mkdir c:\temp
set my_temp=c:\temp
rem 建立备份目录,该目录必须有足够大的空间用于存放数据库的备份文件
mkdir e:\backup
mkdir e:\backup\pfile
mkdir e:\backup\ifile
set my_bakdir=e:\backup
rem ===== (1) 开始备份参数文件 =======
echo Backing up the init.ora file
copy %my_pfile% %my_bakdir%\pfile
copy %my_ifile% %my_bakdir%\ifile
rem ===== (2) 创建minlog.sql脚本获取最小的online redo日志顺序号 =====
echo set heading off; >%my_temp%\minlog.sql
echo set feedback off; >>%my_temp%\minlog.sql
echo spool %my_temp%\minlog.cmd; >>%my_temp%\minlog.sql
echo select ‘set minlog_value=’ ^|^| min(sequence#) from v$log where upper(status)=upper(‘INACTIVE’); >>%my_temp%\minlog.sql
echo spool off; >>%my_temp%\minlog.sql
echo select ‘exit;’ from dual; >>%my_temp%\minlog.sql
echo exit; >>%my_temp%\minlog.sql
rem ===== (3) run minlog.sql to genrate minlog.cmd ========
sqlplus internal/%my_password% @%my_temp%\minlog.sql
rem ===== (4) run minlog.cmd to set minlog_value ========
call %my_temp%\minlog.cmd
rem === (5) 创建tblspc01.sql脚本用于生成备份数据文件的脚本文件tblspc02.sql ===
echo set heading off; >%my_temp%\tblspc01.sql
echo set feedback off; >>%my_temp%\tblspc01.sql
echo spool %my_temp%\tblspc02.sql; >>%my_temp%\tblspc01.sql
echo select ‘connect internal/%my_password%;’ from dual; >>%my_temp%\tblspc01.sql
rem=〖同时备份所有表空间文件的脚本〗,和〖一次备份一个表空间文件的脚本〗只能使用其一
rem=echo select ‘alter tablespace ‘ ^|^| tablespace_name ^|^| ‘ begin backup;’ from dba_tablespaces; >>%my_temp%\tblspc01.sql
rem=echo select ‘host start/wait ocopy ‘ ^|^| file_name ^|^| ‘ %my_bakdir%;’ from dba_data_files; >>%my_temp%\tblspc01.sql
rem=echo select ‘alter tablespace ‘ ^|^| tablespace_name ^|^| ‘ end backup;’ from dba_tablespaces; >>%my_temp%\tblspc01.sql
rem=〖同时备份所有表空间文件的脚本结束〗
rem=〖一次备份一个表空间文件的脚本〗和〖同时备份所有表空间文件的脚本〗只能使用其一
echo select ‘ALTER TABLESPACE ‘ ^|^| TABLESPACE_NAME ^|^| ‘ BEGIN BACKUP; ‘^|^| CHR(10) >>%my_temp%\tblspc01.sql
echo ^|^|’host start/wait ocopy ‘ ^|^| FILE_NAME ^|^|’ ‘^|^|’%my_bakdir%;’ ^|^| CHR(10) >>%my_temp%\tblspc01.sql
echo ^|^|’ALTER TABLESPACE ‘ ^|^| TABLESPACE_NAME ^|^| ‘ END BACKUP;’ >>%my_temp%\tblspc01.sql
echo from dba_data_files; >>%my_temp%\tblspc01.sql
rem=〖一次备份一个表空间文件的脚本结束〗
echo spool off; >>%my_temp%\tblspc01.sql
echo select ‘exit;’ from dual; >>%my_temp%\tblspc01.sql
echo exit; >>%my_temp%\tblspc01.sql
rem ===== (6) run tblspc01.sql to genrate tblspc02.sql ========
sqlplus internal/%my_password% @%my_temp%\tblspc01.sql
rem ===== (7) on svrmgrl run tblspc02.sql to backup the datafiles ========
svrmgrl @%my_temp%\tblspc02.sql
rem ===== (8) 创建maxlog.sql脚本获取最大的online redo日志顺序号 =====
echo set heading off; >%my_temp%\maxlog.sql
echo set feedback off; >>%my_temp%\maxlog.sql
echo spool %my_temp%\maxlog.cmd; >>%my_temp%\maxlog.sql
echo select ‘set maxlog_value=’ ^|^| max(sequence#) from v$log where upper(status)=upper(‘CURRENT’); >>%my_temp%\maxlog.sql
echo spool off; >>%my_temp%\maxlog.sql
echo select ‘alter system switch logfile;’ from dual; >> %my_temp%\maxlog.sql
echo select ‘exit;’ from dual; >>%my_temp%\maxlog.sql
echo exit; >>%my_temp%\maxlog.sql
rem ===== (9) run maxlog.sql to genrate maxlog.cmd ========
sqlplus internal/%my_password% @%my_temp%\maxlog.sql
rem ===== (10) run maxlog.cmd to set maxlog_value ========
call %my_temp%\maxlog.cmd
rem == (11) 创建control01.sql脚本用于生成备份控制文件的脚本文件control02.sql ===
echo set heading off; >%my_temp%\control01.sql
echo set feedback off; >>%my_temp%\control01.sql
echo spool %my_temp%\control02.sql; >>%my_temp%\control01.sql
echo select ‘connect internal/%my_password%;’ from dual; >>%my_temp%\control01.sql
echo select ‘alter database backup controlfile to trace;’ from dual; >>%my_temp%\control01.sql
echo spool off; >>%my_temp%\control01.sql
echo select ‘exit;’ from dual; >>%my_temp%\control01.sql
echo exit; >>%my_temp%\control01.sql
rem ===== (12) run control01.sql to genrate control02.sql ========
sqlplus internal/%my_password% @%my_temp%\control01.sql
rem ===== (13) on svrmgrl run control02.sql to backup the datafiles ========
svrmgrl @%my_temp%\control02.sql
rem ===== (14) 创建archive.sql脚本用于生成备份归档日志文件的脚本文件archive.cmd =====
echo set heading off; >%my_temp%\archive.sql
echo set feedback off; >>%my_temp%\archive.sql
echo spool %my_temp%\archive.cmd; >>%my_temp%\archive.sql
rem 仅备份与本次热备份相关的日志文件
echo select ‘copy ‘ ^|^| name ^|^| ‘ %my_bakdir%’ from V
$ARCHIVED_LOG where sequence# between %minlog_value% and %maxlog_value%+1; >>%my_temp%\archive.sql
echo spool off; >>%my_temp%\archive.sql
echo select ‘exit;’ from dual; >>%my_temp%\archive.sql
echo exit; >>%my_temp%\archive.sql
rem ===== (15) run archive.sql to genrate archive.cmd ========
sqlplus internal/%my_password% @%my_temp%\archive.sql
rem ===== (16) run archive.cmd to backup the archive log files ========
call %my_temp%\archive.cmd
rem ===== 结束======
echo =====热备份完成!!! ======