当我们提起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,我们第一个宗旨就是“备份重于一切!”