如果自己搞不定可以找诗檀软件专业ORACLE数据库修复团队成员帮您恢复!

诗檀软件专业数据库修复团队

服务热线 : 13764045638    QQ号:47079569    邮箱:service@parnassusdata.com

  目录 定义 术语 方法 用户管理的TSPITR在相同服务器上 用户管理的TSPITR在不同的服务器上 使用RMAN 全自动TSPITR 自定义TSPITR使用自动辅助实例 用户管理辅助实例的TSPITR  

定义

表空间时间点恢复(TSPITR)是恢复一个或多个表空间(除system表空间)到一个优先数据库其他部分的时间点.下面的场景说明了什么时候需要使用TSPITR:
  • 恢复drop或truncate的表
  • 恢复逻辑损坏的表
  • 恢复drop 的表空间
  • 恢复只影响部分数据库的不正确的批处理作业或DML语句
包括克隆一个新实例/数据库在相同或不同的服务器上使用最少的数据文件,恢复到指定的时间,导出对象,然后移动到主库中.  

术语

术语 描述
TSPITR 表空间时间点恢复
Auxiliary Database or Instance 从备份中恢复出来的当前数据库的副本,通常在辅助主机上.
Recovery Set 主库(源库)上所有需要按时间点恢复的表空间也称作Transportable Tablspase Set (TTS)
Auxiliary Set 所有在辅助数据库执行恢复必需要恢复的文件(system,sysaux和undo表空间)
 

方法

用户执行TSPITR在相同服务器上

  1. 查询辅助集文件和你主库需要恢复的表空间的id和名字.
SQL> col file_id head "FID" for 999 col TABLESPACE_NAME for a15 col FILE_NAME for a50 set linesize 100 break on tablespace_name   select TABLESPACE_NAME, FILE_ID,FILE_NAME from dba_data_files order by TABLESPACE_NAME;   askmaclean.com
 
  1. 恢复辅助集(system,sysaux,undo)到一个临时位置在同一个服务器上
$ rman target sys/oracle10g@test10g catalog rman/rman@rcvcat10 RMAN> run { set newname for datafile 1 to '/u01/tspitr/system.299.708546925'; set newname for datafile 2 to '/u01/tspitr/undotbs1.262.725629799'; set newname for datafile 3 to '/u01/tspitr/sysaux.298.708546925'; set newname for datafile 6 to '/u01/tspitr/t2.318.725626177'; restore controlfile to '/u01/tspitr/ctrl01.ctl'; restore datafile 1, 2, 3, 6; }
 
  1. 拷贝主库的ora到临时位置
  2. 编辑ora然后修改新实例需要的参数
control_files='/u01/tspitr/ctrl01.ctl' db_unique_name='tspitr' *_dump_dest (optional) log_archive_dest_N (optional) Disable archive log shipment in case of standby
 
  1. 启动临时实例到clone模式
$ export ORACLE_SID=tspitr SQL> startup nomount pfile=/u01/tspitr/inittspitr.ora SQL> alter database mount CLONE database; askmaclean.com
 
  1. 更新(恢复)控制文件指明数据文件和日志文件的新位置/名字
重命名辅助集和需要的数据文件: SQL> alter database rename file '+DATA/test10g/datafile/system.299.708546925' to '/u01/tspitr/system.299.708546925'; SQL> alter database rename file '+DATA/test10g/datafile/undotbs1.262.725629799' to '/u01/tspitr/undotbs1.262.725629799'; SQL> alter database rename file '+DATA/test10g/datafile/sysaux.298.708546925' to '/u01/tspitr/sysaux.298.708546925'; SQL> alter database rename file '+DATA/test10g/datafile/t2.318.725626177' to '/u01/tspitr/t2.318.725626177';   Online新的数据文件: SQL> alter database datafile '/u01/tspitr/system.299.708546925' online; SQL> alter database datafile '/u01/tspitr/undotbs1.262.725629799' online; SQL> alter database datafile '/u01/tspitr/sysaux.298.708546925' online; SQL> alter database datafile'/u01/tspitr/t2.318.725626177' online;   Offline不需要的数据文件: SQL> ALTER DATABASE datafile '+DATA/test10g/datafile/users.296.708546925' offline drop; SQL> ALTER DATABASE datafile '+DATA/test10g/datafile/t1.268.725626169' offline drop;   重命名日志文件: SQL> ALTER DATABASE RENAME FILE '+DATA/test10g/onlinelog/group_1.294.708547123' to '/u01/tspitr/group_1.294.708547123'; SQL> ALTER DATABASE RENAME FILE '+DATA/test10g/onlinelog/group_2.293.708547129' to '/u01/tspitr/group_2.293.708547129'; SQL> ALTER DATABASE RENAME FILE '+DATA/test10g/onlinelog/group_3.292.708547133' to '/u01/tspitr/group_3.292.708547133';
 
  1. 恢复数据库
SQL> recover database using backup controlfile until time '2009-04-30:10:03:00'; 或使用rman恢复 RMAN> run { set until time "to_date('2009-04-30:10:03:00','YYYY-MON-DD:HH24:MI:SS')"; recover database; }
 
  1. 使用resetlogs打开数据库
SQL> alter database open resetlogs;
 
  1. 导出想要的对象从克隆的数据库,然后导入主库中
  2. 删除临时实例/数据库
   

用户执行TSPITR在不同的服务器上

  1. 从主库拷贝ora上传到目标服务器
scp inittspitr.ora sscnjlnx5:/home/oracle/ray/tspitr
 
  1. 编辑ora然后为新实例修改需要的参数
control_files='/u02/oradata/tspitr/ctrl01.ctl' db_unique_name='tspitr' (Not Needed) *_dump_dest (optional) log_archive_dest_N (optional) Disable archive log shipment in case of standby
 
  1. 上传备份集到目标服务器并创建软链接
scp * sscnjlnx5:/home/oracle/ray/bkp
 
  1. 如果和源库位置不同,对新的备份集位置创建软链接
- Backup was exist at /u02/backup/test10g on the source host - Backup was moved to /home/oracle/ray/bkp on the target host ln -s /home/oracle/ray/bkp /u02/backup/test10g
 
  1. 启动临时实例
export ORACLE_SID=tet10g startup nomount pfile=/home/oracle/ray/tspitr/inittspitr.ora
 
  1. 使用rman nocatalog方式连接临时实例,恢复控制文件并挂载实例
$ rman target / nocatalog RMAN> restore controlfile to '/u02/oradata/tspitr/ctrl01.ctl' from'/home/oracle/ray/bkp/c-959778546-20100731-00'; RMAN> alter database mount;
 
  1. 恢复辅助/临时数据库
run { set until time "to_date('2008-04-30:10:03:00','YYYY-MON-DD:HH24:MI:SS')"; set newname for datafile 1 to '/u02/oradata/tspitr/system.299.708546925'; set newname for datafile 2 to '/u02/oradata/tspitr/undotbs1.262.725629799'; set newname for datafile 3 to '/u02/oradata/tspitr/sysaux.298.708546925'; set newname for datafile 6 to '/u02/oradata/tspitr/t2.318.725626177'; restore datafile 1,2,3,6; # 重命名TSPITR需要的辅助集和数据文件 sql "alter database rename file ''+DATA/test10g/datafile/system.299.708546925'' to ''/u02/oradata/tspitr/system.299.708546925''"; sql "alter database rename file ''+DATA/test10g/datafile/undotbs1.262.725629799'' to ''/u02/oradata/tspitr/undotbs1.262.725629799''"; sql "alter database rename file ''+DATA/test10g/datafile/sysaux.298.708546925'' to ''/u02/oradata/tspitr/sysaux.298.708546925''"; sql "alter database rename file ''+DATA/test10g/datafile/t2.318.725626177'' to ''/u02/oradata/tspitr/t2.318.725626177''"; # online新的数据文件: sql "alter database datafile ''/u02/oradata/tspitr/system.299.708546925'' online"; sql "alter database datafile ''/u02/oradata/tspitr/undotbs1.262.725629799'' online"; sql "alter database datafile ''/u02/oradata/tspitr/sysaux.298.708546925'' online"; sql "alter database datafile ''/u02/oradata/tspitr/t2.318.725626177'' online"; # Offline 不需要的数据文件: sql "ALTER DATABASE datafile ''+DATA/test10g/datafile/users.296.708546925'' offline drop"; sql "ALTER DATABASE datafile ''+DATA/test10g/datafile/t1.268.725626169'' offline drop"; # 重命名在线日志文件: sql "ALTER DATABASE RENAME FILE ''/u01/tspitr/group_1.294.708547123'' to ''/u02/oradata/tspitr/group_1.294.708547123''"; sql "ALTER DATABASE RENAME FILE ''/u01/tspitr/group_2.293.708547129'' to ''/u02/oradata/tspitr/group_2.293.708547129''"; sql "ALTER DATABASE RENAME FILE ''/u01/tspitr/group_3.292.708547133'' to ''/u02/oradata/tspitr/group_3.292.708547133''"; #恢复辅助数据库直到指定时间跳过不需要的表空间,然后打开: recover database skip forever tablespace t1, users; alter database open resetlogs; }
 
  1. 从克隆的数据库导出想要的对象,然后导入到主库
  2. 删除临时实例/数据库。
   

使用RMAN

Rman需要下面这些步骤去执行TSPITR  
  • RMAN自动创建辅助实例,启动(nomount状态)并连接它
  • 离线目标数据库的TTS
  • 恢复控制文件到辅助实例
  • 恢复辅助实例的辅助集,并恢复TTS到原来的位置或指定的新位置
  • 恢复辅助实例到指定的时间,使用resetlogs模式打开
  • 从辅助实例导出TTS的字典元数据,然后关闭实例
  • 转换目标库的控制文件去指出TTS
  • 导入元数据
  • 删除辅助实例和辅助集
 

全自动TSPITR(推荐)

RMAN管理并控制TTS进程的所有方面。然而这种方法保留了AUX。你的需求决定辅助集的位置。你可以控制数据文件的名字和位置。Recovery set (bug 4090065)  在这种方法中RMAN客户端使用下面的参数文件创建辅助实例
初始化参数用于自动实例: db_name=TEST10G                           --同源库相同 compatible=10.2.0.3.0                        --同源库相同 db_block_size=8192                          --同源库相同 db_files=200                                --同源库相同 db_unique_name=tspitr_TEST10G_pdts          –基于源库的DB_NAME产生的 large_pool_size=1M shared_pool_size=110M #辅助参数文件没用过的 db_create_file_dest=/u02/auxdest               --同辅助库数据文件相同 control_files=/u02/auxdest/cntrl_tspitr_TEST10G_pdts.f --基于源库的DB_NAME产生的 askmaclean.com
 
  • 连接RMAN并恢复TTS
$ rman target sys/oracle10g@test10g catalog rman/rman@rcvcat10 注意: RMAN 使用目标库配置的通道去配置辅助实例 RMAN> run { recover tablespace t1, t2 until time "to_date('2008-04-30:10:03:00','YYYY-MON-DD:HH24:MI:SS')" auxiliary destination '/u02/auxdest'; } 或者 RMAN> run { set newname for datafile 5 to '/tmp/t1.dbf'; set newname for datafile 6 to '/tmp/t2.dbf'; set newname for datafile 1 to '/tmp/system01.dbf'; recover tablespace t1, t2 until time "to_date('2008-04-30:10:03:00','YYYY-MON-DD:HH24:MI:SS')" auxiliary destination '/u02/auxdest'; }
 
  • 备份所有的TTS并online
RMAN> backup tablespace t1,t2; RMAN> sql "alter tablespace t1 online"; RMAN> sql "alter tablespace t2 online";
   

自定义TSPITR使用一个自动辅助实例(推荐)

使用这种方法,必须使用run{SET AUXILIARY INSTANCE PARAMETER FILE TO ‘/?/?..’}告诉RMAN客户端使用什么参数去创建辅助实例,而不是RMAN客户端自动寻找参数文件在$OH/rdbms/admin/params_auxint.ora(默认位置)。如果没发现RMAN使用内存初始化参数(默认值)。参考全自动 “TSPITR”   在这个方法中:
  • 你可以使用辅助参数文件控制一些初始化参数
  • 你可以使用下面命令去控制数据文件的名字和位置:
SET NEWNAME (1) CONFIGURE AUXNAME (2) CONFIGURE AUXNAME FOR DATAFILE ‘n’ TO auxname_’n’; DB_FILE_NAME_CONVERT (3) AUXILIARY DESTINATION (4) 例如
RMAN> run { set auxiliary instance parameter file to '/tmp/auxinstparams.ora'; set newname for datafile 1 to '/tmp/system01.dbf'; recover tablespace t1, t2 until time "to_date('2008-04-30:10:03:00','YYYY-MON-DD:HH24:MI:SS')" auxiliary destination '/u02/auxdest'; }
       

用户管理辅助实例的TSPITR

在这种方法中,你完全控制辅助实例
  • 准备RMAN使用的辅助实例
  • 创建密码文件
  • 创建参数文件
  1. DB_NAM
  2. DB_UNIQUE_NAME
  • CONTROL_FILES
  1. DB_FILE_NAME_CONVERT
  2. LOG_FILE_CONVERT
  3. REMOTE_LOGIN_PASSWORDFILE
  • DB_BLOCK_SIZE
 
  1. 配置网络连接
 
  • 开启并连接辅助实例
SQL> startup nomount pfile=/tmp/inittspitr.ora
 
  • 执行TSPITR
$ rman target sys/oracle10g@test10g catalog rman/rman@rcvcat10 RMAN> run { # 指定恢复的数据文件的新名字(可选) set newname for datafile 5 to '/tmp/t1.dbf'; set newname for datafile 6 to '/tmp/t2.dbf'; # 指定辅助集的新名字(可选的) set newname for datafile 1 to '/tmp/system01.dbf';. # 指定磁盘和通道(根据需要尽可能多的) allocate auxiliary channel c1 device type disk; recover tablespace t1, t2 until time "to_date('2008-04-30:10:03:00','YYYY-MON-DD:HH24:MI:SS')"= }
 
  • 备份所有的TTS并online
RMAN> backup tablespace t1,t2; RMAN> sql "alter tablespace t1 online"; RMAN> sql "alter tablespace t2 online";
         

脚本:

!rm up_new_ctrl.lst set echo off set feedback off SET VERIFY OFF; set heading off set pagesize 10000 accept dest default ' /tmp' prompt ' Enter the new or Aux datafile/Logfile distination? </tmp> :' spool up_new_ctrl select ' alter database rename file ' ||' ' ' ' ||name||' ' ' to ' ||' ' ' ' ||' &dest' ||' /' ||substr(name,instr(name,' /' ,-1)+1,vsize(name)-vsize(substr(name,1,instr(name,' /' ,- 1)))+1)||' ' ' ;' fr om v$datafile where FILE# in (1,2,3,6); select ' alter database datafile ' ||' ' ' ' ||' &dest' ||' /' ||substr(name,instr(name,' /' ,-1)+1,vsize(name)- vsize(substr(name,1,instr(name,' /' ,-1)))+1)||' ' ' online ;' fr om v$datafile where FILE# in (1,2,3,6); select ' alter database datafile ' ||' ' ' ' ||name||' offline drop' ' ;' fr om v$datafile where FILE# not in (1,2,3,6); select ' alter database rename file ' ||' ' ' ' ||member||' ' ' to ' ||' ' ' ' ||' &dest' ||' /' ||substr(member,instr(member,' /' ,-1)+1,vsize(member)- vsize(substr(member,1,instr(member,' /' ,-1)))+1)||' ' ' ;' fr om v$logfile; spool off