Oracle数据库异常恢复前备份保护现场建议

无论是在各种会议上,还是在朋友/网友私下请教Oracle数据库恢复的问题之时,我都强调,如果你没有十足的把握,请你对您的现场进行备份,确保别对现场进行二次损坏。你不能恢复数据库,但绝对不能再次破坏数据库,给二次恢复增加难度.这里对恢复前备份提供一些指导思想和简单脚本,希望对大家有帮助.

哪些文件需要备份

熟悉数据库恢复的朋友可能都情况,Oracle在异常恢复的过程中主要修改的是system表空间里面数据,其他数据文件,redo数据,控制文件(当然由于redo,undo导致其他数据文件内部的block也可能发生改变)。在备份时间,备份空间允许的情况下,是对这些文件全部备份为好

完整备份文件

set lines 150
set pages 10000
select name from v$datafile
union all
select name from v$controlfile
union all
select member from v$logfile;

有些情况下:比如如果全部备份时间过长,备份空间不足等情况下,我们该如何备份,尽量减少因为异常恢复导致对原环境的损坏.备份最核心的system表空间,数据文件头,redo file,control file等数据,由于这个不是简单的拷贝操作,因此在生成备份语句同时,也生成还原语句,切不可生成了备份语句后,无恢复语句,导致后面还原故障现场难度增大.

无法全备情况下linux/unix数据库恢复前备份

set lines 150
set pages 10000
select 'dd if='||name||' of=&&back_dir/'||ts#||'_'||file#||'.dbf bs=1048576 count=10'
from v$datafile where ts#<>0
union all
select 'dd if='||name||' of=&&back_dir/'||ts#||'_'||file#||'.dbf' from v$datafile where ts#=0
union all
select 'dd if='||name||' of=&&back_dir/control0'||rownum||'.ctl' from v$controlfile
union all
select 'dd if='||member||' of=&&back_dir/'||thread#||'_'||a.group#||'_'||sequence#||'_'||substr(member,
instr(member,'/',-1)+1)  FROM v$log a, v$logfile b WHERE a.group# = B.GROUP#;

无法全备情况下linux/unix使用备份还原

set lines 150
set pages 1000
select 'dd of='||name||' if=&&back_dir/'||ts#||'_'||file#||'.dbf bs=1048576 count=10 conv=notrunc'
from v$datafile where ts#<>0
union all
select 'dd if='||name||' if=&&back_dir/'||ts#||'_'||file#||'.dbf' from v$datafile where ts#=0
union all
select 'dd of='||name||' if=&&back_dir/control0'||rownum||'.ctl' from v$controlfile
union all
select 'dd of='||member||' if=&&back_dir/'||thread#||'_'||a.group#||'_'||sequence#||'_'||substr(member,
instr(member,'/',-1)+1)    FROM v$log a, v$logfile b WHERE a.group# = B.GROUP#;

由于win路径斜杠不一样(/和\的区别),因此在无法全备情况下win备份语句

set lines 150
set pages 10000
select 'dd if='||name||' of=&&back_dir\'||ts#||'_'||file#||'.dbf bs=1048576 count=10'
from v$datafile where ts#<>0
union all
select 'dd if='||name||' of=&&back_dir\'||ts#||'_'||file#||'.dbf' from v$datafile where ts#=0
union all
select 'dd if='||name||' of=&&back_dir\control0'||rownum||'.ctl' from v$controlfile
union all
select 'dd if='||member||' of=&&back_dir\'||thread#||'_'||a.group#||'_'||sequence#||'_'||substr(member,
instr(member,'\',-1)+1)   FROM v$log a, v$logfile b WHERE a.group# = B.GROUP#;

在无法全备情况下win还原语句

set lines 150
set pages 1000
select 'dd of='||name||' if=&&back_dir\'||ts#||'_'||file#||'.dbf bs=1048576 count=10 conv=notrunc'
from v$datafile where ts#<>0
union all
select 'dd if='||name||' if=&&back_dir\'||ts#||'_'||file#||'.dbf' from v$datafile where ts#=0
union all
select 'dd of='||name||' if=&&back_dir\control0'||rownum||'.ctl' from v$controlfile
union all
select 'dd of='||member||' if=&&back_dir\'||thread#||'_'||a.group#||'_'||sequence#||'_'||substr(member,
instr(member,'\',-1)+1)    FROM v$log a, v$logfile b WHERE a.group# = B.GROUP#;

asm磁盘的备份主要是备份磁盘头100M空间,使用dd命令直接备份

asm 备份
set lines 150
set pages 1000
select 'dd if='||path||' of=&asmbackup_dir/'||group_number||'_'||disk_number||'.asm bs=1048576
count=100' from v$asm_disk;

asm 恢复

set lines 150
set pages 1000
select 'dd of='||path||' if=&asmbackup_dir/'||group_number||'_'||disk_number||'.asm bs=1048576
count=100 conv=notrunc' from v$asm_disk;
asmlib需要注意把ORCL:替换为/dev/oracleasm/disks/对应目录.另外提供win环境下dd命令程序dd

备注:对于asm情况,如果asm磁盘组正常mount,而数据库无法open的异常情况恢复,备份情况请不要参考该文章,具体请见后续文章,敬请关注

时间: 2024-09-10 05:57:44

Oracle数据库异常恢复前备份保护现场建议的相关文章

Oracle数据库异常恢复前备份保护现场建议—ASM环境

在上一篇中写道了文件系统的库,在进行异常恢复前的备份方法(Oracle异常恢复前备份保护现场建议-FileSystem环境),对于asm库,因为asm 里面的数据文件无法直接dd文件头,因此备份方式也有所改变.对于asm是mount,但是数据库不能打开,使用rman或者asm的cp命令全部备份数据文件也来不及或者空间不足,这样的情况下,你可以考虑使用rman或者cp命令备份控制文件和system表空间文件,cp命令备份redo,dd命令备份文件头,来完成asm情况下数据库异常恢复前备份 控制文件

Oracle数据库数据丢失恢复的几种方法总结_oracle

根据oracle数据库的特点和提供的工具,主要方法有以下几种方法:      利用逻辑备份使用import工具丢失数据的表      利用物理备份来通过还原数据文件并进行不完全恢复      利用dbms_logmnr包从redo log文件中恢复      利用flashback特性恢复数据 前提 为了方便使用方法的介绍,上述恢复方法都将基于以下场景进行:系统管理员在前一天晚上11点用export对数据库做了全库逻辑备份,然后对所有数据文件进行了热备份.第二天上午10点,系统管理员在修改表TF

求ASP.NET中实现ORACLE数据库自动恢复的代码

问题描述 求ASP.NET中实现ORACLE数据库自动恢复的代码,自动备份的好处理,可是还原的时候有表空间和用户等,请问哪位有解决办法? 解决方案 解决方案二:up

如何利用scn增量备份实现Oracle数据库增量恢复

数据库版本 SQL> select * from v$version; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production PL/SQL Release 11.2.0.3.0 - Production CORE    11.2.0.3

oracle数据库的恢复教程详解

racle其实也差不多,只不过oracle本身设计的安全性和稳定性都十分好.所以相应的配置文件也要多些. 1.先将原oracle的安装目录和data目录都做个备份.然后安装oracle,安装路径要和原来的一样.安装时选择'只安装软件'即可,不用选择安装数据库.例如:安装在E:oracleproduct10.2.0目录,会发现在该目录只有一个db_1目录. 2.再将db_1NETWORKADMIN目录下的tnsnames.ora.sqlnet.ora.listener.ora文件拷到相应的目录中.

关于系统数据库的恢复和备份技术

备份|恢复|数据|数据库 关于系统数据库的恢复总结如下: 在SQL Server数据库中,系统信息存储在系统数据库中,主要的系统数据库包括: master-从整体上控制用户数据库和SQL Server操作,在创建了任何用户定义的对象后,都要备份它 model-为新数据库提供模版和原型 msdb-包含了有关作业.报警及操作员等信息如果包含系统数据库的介质变了,那么必须重建系统数据库,如果你仍然可以启动SQL Server服务,则可以通过RESTORE语句从系统数据库的备份中恢复数据库. 如果mas

Oracle数据库设置任务计划备份一周的备份记录

  Oracle 数据库备份: --保留最近一周的备份记录; ====正文: ====开始============== echo 设置备份文件存放文件夹... set "tbuf=E:Cwaybackup" echo 设置备份文件名(以星期几命名,即备份文件只保存最近一周)... set name=%date% set name=%name:~-3% set name=ORCL_backup_%name% echo 是否存在同名文件,若存在则删除同名文件... if exist %tb

Oracle数据库设置任务计划备份一周的备份记录_oracle

Oracle 数据库备份: --保留最近一周的备份记录:====正文: ====开始============== 复制代码 代码如下: echo 设置备份文件存放文件夹...  set "tbuf=E:\Cway\backup" echo 设置备份文件名(以星期几命名,即备份文件只保存最近一周)...  set name=%date%  set name=%name:~-3%  set name=ORCL_backup_%name%  echo 是否存在同名文件,若存在则删除同名文件.

oracle数据库报错ORA-01122 ORA-01210 故障恢复

有朋友数据文件头出现错误ORA-01122和ORA-01210等错误,数据库无法正常open.   因为平台是win,他们找我咨询win bbed,因为回老家电脑没有带,无法提供win的bbed.我通过dd部分文件头,然后在linux平台分析发现是该文件的文件头block大量坏块 bbed分析坏块情况 BBED> show all         FILE#           0         BLOCK#          1         OFFSET          0