echo\控制文件备份完毕!'''fromdual;\echo\
echo\正在备份数据文件...'''fromdual;\echo\echo\数据文件备份完毕!'''fromdual;\echo\正在备份联机日志...'''fromdual;\echo\
echo\echo\联机日志备份完毕!'''fromdual;\echo\
echo\脱机冷备完毕!'''fromdual;\echo\echo\##生成冷备份执行脚本
sqlplus-s'/assysdba'<$tempsql>$backupsh rm-f$tempsql chmod+x$backupsh cp$backupsh.
echo\正在生成冷备对应的恢复脚本[$rcvrsh]...\##准备工作
echo\echo\echo\echo\echo\echo\
echo\echo\
echo\恢复脚本生成时间:\年%m月%d日-%H:%M:%S`\fromdual;\
echo\恢复文件所在路径:$backupdir'fromdual;\echo\echo\
echo\开始进行文件的复制恢复...'''fromdual;\echo\恢复文件所在的路径:$backupdir'''fromdual;\##这里不直接关闭数据库,提示用户手工关闭为好如果需要直接关闭,请修改 echo\echo\echo\echo\
echo\数据库已启动,请先关闭ORACLE数据库'''fromdual; \
echo\echo\
21
echo\
echo\
echo\正在恢复控制文件...'''fromdual;\
echo\length(name)-instr(name,'/',-1))||''||namefromv\\$controlfile;\echo\控制文件恢复完毕!'''fromdual;\echo\
echo\正在恢复数据文件...'''fromdual;\
echo\length(name)-instr(name,'/',-1))||''||namefromv\\$datafile;\echo\数据文件恢复完毕!'''fromdual;\echo\正在恢复联机日志...'''fromdual;\echo\
echo\length(member)-instr(member,'/',-1))||''||memberfromv\\$logfile;\echo\联机日志恢复完毕!'''fromdual;\echo\
echo\脱机冷备恢复完毕!'''fromdual;\echo\echo\##生成冷备恢复的执行脚本
sqlplus-s'/assysdba'<$tempsql>$rcvrsh rm-f$tempsql chmod+x$rcvrsh cp$rcvrsh.
echo\生成脱机冷备备份与恢复脚本完毕!\echo\请检查脚本文件:[$backupsh]\echo\echo\
#如果需要生成后立即执行备份,可增加关闭数据库的操作,然后将以一几行的注 释#去掉即可 #./$backupsh
#echo\备份执行完毕,请检查!\#echo\
(3)重启Oracle数据库 $sqlplus/nolog
SQL>connect/assysdba SQL>startup
2.如果自从上次脱机冷备后,数据文件错误,联机日志没有被覆盖,可模拟不完全恢 复。
1.SQL>shutdown;
2.$cp....;//只恢复出错的数据文件 3.SQL>startupmount; 4.SQL>recoverdatabase;
22
5.SQL>alterdatabaseopen; 3.3ARCHIVELOG模式 3.3.1脱机冷备与恢复 同NONARCHIVELOG模式 3.3.2联机热备
联机热备是在数据库运行的情况下进行备份的方法。热备份要求数据库在Archivelog 方式下操作,并需要大量的档案空间。 热备份的优点:
1.可在表空间或数据文件级备份,备份时间短。 2.备份时数据库仍可使用,支持24*7不间断运行。 3.可达到秒级恢复(恢复到某一时间点上)。 4.可对几乎所有数据库实体作恢复。
5.恢复是快速的,在大多数情况下在数据库仍工作时恢复。 热备份的不足是:
1.不能出错,否则后果严重。
2.若热备份不成功,所得结果不可用于时间点的恢复。
3.因难于维护,所以要特别仔细小心,不允许“以失败而告终”。
注意:在热备过程中系统会生成更多的重做日志和回滚数据。所以必须在数据库较空闲时才进行备份。 备份内容:
(1)数据文件:一个表空间一个表空间地备份 sql>altertablespaceusersbeginbackup; sql>$copy'/xx/xx.dbf''/yy/yy.dbf'; sql>altertablespaceusersendbackup; sql>altersystemcheckpoint;
(只读表空间直接拷贝,不用beginbackup) (2)备份归档log文件
(1)临时停止归档进程log_archive_max_processes=0 (2)log下那些在archiveredolog目标目录中的文件 (3)重新启动archive进程 (4)备份归档的redolog文件 (3)备份联机的控制文件:
sql>alterdatabasebackupcontrolfileto'/xx/xx.ctl'; (4)备份初始化文件配置文件等: sql>$copy....;
热备脚本:hotback.sql Rem热备份脚本forLinux
Rem执行该脚本必须保证数据库处于归档模式 Remdb.dw.dm@gmail.com2007-03-17 Rem
Rem设置SQL*Plus环境参数 Rem
setfeedbackoff setpagesize0
23
setheadingoff setverifyoff setlinesize100 settrimspoolon
Rem设置备份相关的路径ForLinux Rem设置数据文件备份路径
definedatafile_dir='/u05/oracle/hotback/datafile' Rem设置归档日志文件备份路径
definearchlog_dir='/u05/oracle/hotback/archlog' Rem设置控制文件备份路径
definecontrolfile_dir='/u05/oracle/hotback/controlfile' Rem设置生成的备份脚本名
definehotback='/u05/oracle/hotback/open_hot_backup.sql' definespoolfile='/u05/oracle/hotback/spool.tmp' definecpy='cp'
prompt***Spoolingto&hotback
Rem产生备份数据文件、归档日志文件的命令 setserveroutputonsize1000000 spool&hotback
promptspool&spoolfile promptarchiveloglist;;
promptaltersystemswitchlogfile;; promptaltersystemarchivelogall;; DECLARE
CURSORcur_tablespaceIS SELECTtablespace_name FROMdba_tablespaces ORDERBYtablespace_name;
CURSORcur_datafile(tnVARCHAR)IS SELECTfile_name FROMdba_data_files
WHEREtablespace_name=tn ORDERBYfile_name; CURSORcur_arch_destIS SELECTvalue FROMv$parameter
WHEREname='log_archive_dest'; BEGIN
FORctINcur_tablespaceLOOP
IFct.tablespace_name!='TEMP'then
dbms_output.put_line('altertablespace'||ct.tablespace_name||'beginbackup;'); FORcdINcur_datafile(ct.tablespace_name)LOOP
dbms_output.put_line('host&cpy'||cd.file_name||'&datafile_dir'); ENDLOOP;
24
dbms_output.put_line('altertablespace'||ct.tablespace_name||'endbackup;'); endif; ENDLOOP;
FORdestINcur_arch_destLOOP
dbms_output.put_line('host&cpy'||dest.value||'/*&archlog_dir'); ENDLOOP; END; /
Rem产生备份控制文件的命令
promptaltersystemarchivelogcurrent;;
promptalterdatabasebackupcontrolfiletotrace;;
promptalterdatabasebackupcontrolfileto'&controlfile_dir/control.bak'REUSE;; promptarchiveloglist;;
promptprompt***HotBackupFinish***; promptspooloff spooloff;
hostrm-f&spoolfile Rem执行生成的脚本文件 Rem@&hotback
Remhostdel&hotback 3.3.3联机热备的恢复 3.3.3.1完全恢复 一般步骤:
1.通过以下信息,找到故障数据文件 alert.log
backgroundtracefile
v$recover_filev$recovery_log
通过这两个视图可以了解详细的需要恢复的数据文件与需要使用到的归档日志。 2.将故障数据文件对应的表空间offline SQL>altertablespacexxxoffline; 3.restoreandrecover SQL>hostcp....;
SQL>[alterdatabase]recoverdatabase/tablespace/datafile'xx'; 4.将表空间online
SQL>altertablespacexxxonline; 3.3.3.2不完全恢复
不完全恢复的方法只能恢复到过去某个时间点/SCN的数据库状态。 一些限制: 1.必要条件
一个有效的online/offline备份(包含所有的数据文件) 自从备份到故障前的所有归档日志
有可能需要控件文件(所有控件文件丢失,数据库结构已改变) SQL>recoverdatabase...usingbackupcontrolfile; 2.只能恢复到所有备份数据文件的最大SCN以后,
25