run{
change archivelog all crosscheck;
CROSSCHECK BACKUPSET;
DELETE force NOPROMPT OBSOLETE;
allocate channel c1 type disk;
backup full tag 'dbfull' format '/opt/oracle/backup/full_%d_%T_%s' database
plus archivelog format '/opt/oracle/backup/arch_%d_%T_%s'
delete all input;
release channel c1;
}
这是我的备份脚本,保留7天的备份,计划是在每天凌晨2点执行,大家看这个脚本有什么问题吗?
1.麻烦各位高手帮忙写个恢复用的脚本或者语句,我在网上看的太杂,不知道该怎么写了。
2.如果在2点之后数据库出了问题,执行恢复之后,数据库是恢复到最后一次备份时的状态吗?在这段时间之内的数据是不是就丢了,能找回来吗?应该怎么解决?

解决方案 »

  1.   

    你这是数据库全备份,建议用Level 0和Level 1备份相结合。
    run

      allocate channel c1 device type disk; 
      backup full tag 'dbfull' format '/opt/oracle/backup/full_%d_%T_%s' database 
      plus archivelog format '/opt/oracle/backup/arch_%d_%T_%s' 
      delete all input; 
      sql 'alter system archive log current';
      release channel c1; 

    {
      CROSSCHECK BACKUPSET;
      delete noprompt expired backup;
      delete noprompt obsolete;
    }
      

  2.   

    1.全库恢复没啥难度啊.run{allocate channel t1 type disk;
    restore database;
    recover database;
    };2.如果你的归档存在的话就没关系,在恢复的同时oracle会自动应用归档和redo的.
      

  3.   

    谢谢你的回复!~关于第二个问题,我还是不太明白,比如在日常运行中突然down机而又无法正常open,那么我可以restore,recover吗?可以的话是不是数据库就恢复到了down机时的状态,不行的话我应该怎么样恢复down机前的状态呢?
      

  4.   

    1,简单的备份脚本:
    备份脚本:create script b_whole_inc0
    {
    allocate channel d1 type disk;
    backup
    incremental level 0
    format '/export/home/oracle/ora10g/backup/rman_bak/db_bak0_%d_%s_%p_%t'
    tag 'whole_inc0'
    database;
    release channel d1;
    }create script b_whole_inc1
    {
    allocate channel d1 type disk;
    backup
    incremental level 1
    format '/export/home/oracle/ora10g/backup/rman_bak/db_bak1_%d_%s_%p_%t'
    tag 'whole_inc1'
    database;
    release channel d1;
    }create script b_whole_inc2
    {
    allocate channel d1 type disk;
    backup
    incremental level 2
    format '/export/home/oracle/ora10g/backup/rman_bak/db_bak2_%d_%s_%p_%t'
    tag 'whole_inc2'
    database;
    release channel d1;
    }create script archive_log_current
    {
    sql 'alter system archive log current';
    }
    create script b_archive_2days
    {
    allocate channel d1 type disk;
    execute script archive_log_current;
    backup
    format '/export/home/oracle/ora10g/backup/rman_bak/arch_%d_%s_%p_%t'
    tag 'arch_bak_2days'
    archivelog
    from time 'sysdate-2';
    release channel d1;
    }create script archive_delete3
    {
    allocate channel d1 type disk;
    execute script archive_log_current;
    backup
    format '/export/home/oracle/ora10g/backup/rman_bak/arch_%d_%s_%p_%t'
    tag 'arch_bak_day3'
    archivelog
    from time 'sysdate-3' until time 'sysdate-2'
    delete input;
    release channel d1;
    }2,如果归档日至和redolog没有丢失或者被破坏的话,还是可以恢复的。
    你可以使用不完全恢复,恢复到备份之后到破坏之前的某个时间点,logseq或SCN。
    之后使用alter databaase open resetlogs 就可以使数据库正常打开。
    但是你之前的备份都会失效,因为数据库会产生一个新的incarnation。
    你要在数据库opne之后,马上进行一次0级备份。
      

  5.   


    在你执行介质恢复的时候,oracle会读取备份以来的所有归档日志,一般来说crash都发生在故障时,因此很有可能实例是靠shutdown abort的不干净的方式来关闭的.
    那么这时候在介质恢复完成后,o如果你的redo还在,那么会应用redo里面的信息.这样就保证了可恢复的完整性.当然,前提是当前redo没有损坏.否则的话.就需要基于cancel的恢复了.
      

  6.   

    你可以使用不完全恢复,恢复到备份之后到破坏之前的某个时间点,logseq或SCN
    怎么样取到破坏前的logseq或scn呢?
      

  7.   

    不知道你的数据库还能否启动到mount状态,如果只是某个数据文件损坏的话,
    检查v$recover_file;
    确定时间点的,scn等工作,你可以检查alert日至,v$log,
    以及v$log_history动态视图,
    也可以咨询值班的同事,呵呵。