数据需要找回怎么办?----我们如何选择正确的恢复/退回方式?

当我们提起oracle数据恢复时,脑子里会闪过这些东东:

 

甲: create table t_20120704 as select * from table 为我们提供了灵活的表数据备份; 

乙: exp 为我们提供了基于table或schema的逻辑备份;

丙: rman 为我们提供了可靠的介质备份;

丁: Flashback为我们在恢复旧数据时提供了更高效的途径;

毋: Flashback query在紧急时能救我们一命。

己: excel .....平面文件......任何可以保存数据的方法

   那么以上这么多可用方式,我们分别在什么场景中使用最合适呢?

 

         下面说说我个人的意见:

一. 当我们发现由于错误的SQL或者管理员失误导致数据出现错误时:

      我们或许会想到Flashback,但是在生产环境中,特别是数以百计的table或者schema,我们一次闪回会导致所有对象均被“回退”,可想而知反而是一场灾难

       那么我们应该:

A. 使用flashback query

   这应该是自9i以来出现的新特性,只不过在10g中,为了加强这一特性,oracle为undo segment 增加了retention属性,以保证我们有足够的undo可用。

总之这是首先办法。

      例如:

      select * from table as of timestamp to_timestamp('2012-07-04  21:54:00','yyyy-mm-dd hh24:mi:ss')  

      或者使用scn,但是相对scn我们可能比较容易得到timestamp

B.本地使用duplicate DB,并控制until

     这是我过去比较喜欢的方法之一,在本地数据库调优中,也可作为执行计划的测试环境,以下是我的脚本:

      1.sql : 

startup force nomount;
quit

      2.sql

run{
sql 'alter system switch logfile';
set until time "to_date('2011-7-28 8:30','yyyy-mm-dd hh:mi')";
--set until scn 7772354093;
duplicate target database to auxpjh;
}

      duplicate_pjh.sh

cp initauxpjh.ora  %ORACLE_HOME\database\initauxpjh.ora

export ORACLE_SID=auxpjh
sqlplus / as sysdba @.\1.sql

export ORACLE_SID=pjh
rman target / auxiliary sys/bondlovesu@auxpjh @'.\2.sql'
pause

      initauxpjh.ora   (实际上只要必要的参数)

*.audit_file_dest='/auxdb/auxpjh'
*.background_dump_dest='/auxdb/auxpjh'
*.compatible='10.2.0.1.0'
*.control_files='/auxdb/auxpjh/control01.ctl'
*.core_dump_dest='/auxdb/auxpjh'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='auxpjh'
*.job_queue_processes=10
*.log_archive_dest_1='LOCATION=/auxdb/auxpjh'
*.log_archive_format='ARC%S_%R.%T'
*.nls_language='SIMPLIFIED CHINESE' 
*.nls_territory='CHINA'
*.open_cursors=300
*.pga_aggregate_target=80m
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=512m
*.standby_archive_dest='/auxdb/auxpjh'
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/auxdb/auxpjh'
*.utl_file_dir='/auxdb'

*.db_file_name_convert=('/oradata/pjh','/auxdb/auxpjh')
*.log_file_name_convert=('/u02','/auxdb/auxpjh')

我将所有跟踪文件,数据文件、日志文件、控制文件均放在同一个目录中,这对于临时duplicate DB没有什么不好,用完就直接删掉:)

 

二. 当我们发现由于介质损坏而导致数据需要完全或者不完全恢复时:

RMAN ,绝对是RMAN!

   当然前提是我们必须要有一套可靠的备份,最好是有完整的full backup set 与完整的archive log。这可以保证我们能恢复到任意时刻。

大致过程:

   1. 开启control file autobackup

rman> configure controlfile autobackup on;


   2. rman脚本

##### make sure that 'controlfile autobackup' is on ######
run{ 
backup as compressed backupset incremental level=0 database format '/u01/rman/pjh/db_%T_%u.bk'  
plus archivelog delete all input format '/u01/rman/pjh/arc_%T_%u.bk'; 
delete noprompt obsolete;
}
list backup;
list copy;
   3.shell脚本
export ORACLE_SID=pjh
rman target / @'.\rman_autobak_v3pro.sql'

 

三. 当我们的测试database需要初始化至“原始状态

  FLASHBACK  是最佳选择

  eg:

  

SQL> set wrap off
SQL> select * from v$flashback_database_log;

OLDEST_FLASHBACK_SCN OLDEST_FLASHBA RETENTION_TARGET FLASHBACK_SIZE
-------------------- -------------- ---------------- --------------
          9770206280 04-7月 -12                 4320     3529310208
SQL> flashback database to 9770206280;
或者
SQL> flashback database to timestamp sysdate-1;
.....

 

四. 当我们的生产database需要还原至“升级调整”之前状态时:

   很抱歉,这里我们不能偷懒了。我们必须在升级方案中定制每个sql的执行方案与回退方案。并且在升级之前,做好full backup!

 

不论哪种方案,作为DBA,我们第一个宗旨就是“备份重于一切!”


 

 

 

 

 

 

 

 

 

 

 


       

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值