表空间时间点恢复,是Oracle在基于冷备,热备恢复以外的一种以表空间为粒度的,不完全恢复的形式来将表空间恢复到过去某个特定的时间点的一种恢复方式。它整合了RMAN以及DataPump这2个备份恢复工具来实现时间点恢复。
TSPITR试用的场景
恢复单独的逻辑对象而不影响数据库的其他对象
可以恢复table到DDL操作之前,这是flashback table无法做到的
可以恢复 drop purge的表
恢复逻辑错误的表
恢复被drop的表空间,即使没有catalog也可以
TSPITR限制条件 上面说了一些很方便的场景,但是也有一些限制条件
必须要在archivelog模式下
如果要恢复表空间到其rename之前,则在恢复的时候必须要用之前的名称(这样在恢复完成之后,会发现数据库中存在两个一样的表空间)
如果table A同时用到了tablespace B和C,则你必须要同时对两个表空间做TSPITR
如果表和索引分别出在不同的表空间,则必须先将索引drop叼
你不能对现有的default tablespace做恢复,要先修改default tablespace
你不能恢复含有以下对象的表空间
对象含有下级对象(例如物化视图),容器对象(分区表)
回滚段
属于SYS用户的对象
TSPITR过程中自动做了哪些操作
如果要被恢复的表空间目前仍存在于数据库中,则检查这个表空间是否有其他依赖的对象,如果是则需要解决这些依赖关系
检查是否可以连到辅助实例,如果没有则会新建一个
如果表空间目前没有被drop的话,则会在目标库先将表空间offline
restore一个目标时间之前的控制文件到辅助实例
将备份集里的数据文件恢复到辅助实例(包含system,sysaux,undo和要恢复的数据文件)
recover辅助实例的数据文件到指定时间
用resetlogs打开辅助实例
将辅助实例的tablespace置于read-only
用数据泵的方式将辅助实例的表空间导出生成一个用于传输表空间的dump file
关闭辅助实例
drop源库的表空间(如果存在的话)
数据泵工具读取导出的dump file,然后将表空间插入到源库
将插入的表空间置于read-write,然后立刻offline之
删除所有的辅助实例文件
现在做个小测试
创建表空间 1 2 3 4 5 6 7 8 9 10 11 12 13 14 SYS@xb> create tablespace tbs_xb datafile '/u01/app/oracle/oradata/xb/tbs_xb01.dbf' size 10m reuse; 表空间已创建。 SYS@xb> select tablespace_name from dba_tablespaces; TABLESPACE_NAME ------------------------------ SYSTEM SYSAUX UNDOTBS1 TEMP USERS TBS_XB
创建用户和表 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 SYS@xb> create user xb identified by xb; 用户已创建。 SYS@xb> grant dba to xb; 授权成功。 SYS@xb> conn xb/xb 已连接。 XB@xb> create table tb_xb tablespace tbs_xb as select * from dba_tables; 表已创建。 XB@xb> select count(1) from tb_xb; COUNT(1) ---------- 2797
查看当前logfile sequence 1 2 3 4 5 XB@xb> select sequence# from v$log where status='CURRENT'; SEQUENCE# ---------- 117
rman备份 1 2 3 [oracle@xb ContentsXML]$ rman target / RMAN> backup database plus archivelog;
drop tablespace 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 SYS@xb> alter system switch logfile; 系统已更改。 SYS@xb> / 系统已更改。 SYS@xb> / 系统已更改。 SYS@xb> drop tablespace tbs_xb including contents and datafiles; 表空间已删除。 SYS@xb> select sequence# from v$log where status='CURRENT'; SEQUENCE# ---------- 122
当前我们删除完表空间以后所在的sequence no为122,如果我们要恢复到表空间删除之前,那么必须要恢复到122之前
TSPITR 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 RMAN> recover tablespace tbs_xb until logseq 122 auxiliary destination '/u01/app/oracle/oradata/'; 启动 recover 于 20-10月-18 使用通道 ORA_DISK_1 RMAN-05026: 警告: 假定以下表空间集适用于指定的时间点 表空间列表要求具有 UNDO 段 表空间 SYSTEM 表空间 UNDOTBS1 使用 SID='phsf' 创建自动实例 供自动实例使用的初始化参数: db_name=XB db_unique_name=phsf_tspitr_XB compatible=11.2.0.4.0 db_block_size=8192 db_files=200 sga_target=1G processes=80 db_create_file_dest=/u01/app/oracle/oradata/ >>>>====这里就是设置的辅助目标路径 log_archive_dest_1='location=/u01/app/oracle/oradata/' #No auxiliary parameter file used 启动自动实例 XB Oracle 实例已启动 系统全局区域总计 1068937216 字节 Fixed Size 2260088 字节 Variable Size 281019272 字节 Database Buffers 780140544 字节 Redo Buffers 5517312 字节 自动实例已创建 已从目标数据库中删除的表空间的列表: 表空间 tbs_xb 内存脚本的内容: { # set requested point in time set until logseq 122 thread 1; # restore the controlfile restore clone controlfile; # mount the controlfile sql clone 'alter database mount clone database'; # archive current online log sql 'alter system archive log current'; # avoid unnecessary autobackups for structural changes during TSPITR sql 'begin dbms_backup_restore.AutoBackupFlag(FALSE); end;'; } 正在执行内存脚本 正在执行命令: SET until clause 启动 restore 于 20-10月-18 分配的通道: ORA_AUX_DISK_1 通道 ORA_AUX_DISK_1: SID=18 设备类型=DISK 通道 ORA_AUX_DISK_1: 正在开始还原数据文件备份集 通道 ORA_AUX_DISK_1: 正在还原控制文件 通道 ORA_AUX_DISK_1: 正在读取备份片段 /u01/app/oracle/fast_recovery_area/XB/backupset/2018_10_20/o1_mf_ncsnf_TAG20181020T132437_fwoh15g3_.bkp 通道 ORA_AUX_DISK_1: 段句柄 = /u01/app/oracle/fast_recovery_area/XB/backupset/2018_10_20/o1_mf_ncsnf_TAG20181020T132437_fwoh15g3_.bkp 标记 = TAG20181020T132437 通道 ORA_AUX_DISK_1: 已还原备份片段 1 通道 ORA_AUX_DISK_1: 还原完成, 用时: 00:00:01 输出文件名=/u01/app/oracle/oradata/XB/controlfile/o1_mf_fwohcoyp_.ctl 完成 restore 于 20-10月-18 sql 语句: alter database mount clone database sql 语句: alter system archive log current sql 语句: begin dbms_backup_restore.AutoBackupFlag(FALSE); end; 内存脚本的内容: { # set requested point in time set until logseq 122 thread 1; # set destinations for recovery set and auxiliary set datafiles set newname for clone datafile 1 to new; set newname for clone datafile 3 to new; set newname for clone datafile 2 to new; set newname for clone tempfile 1 to new; set newname for datafile 5 to "/u01/app/oracle/oradata/xb/tbs_xb01.dbf"; # switch all tempfiles switch clone tempfile all; # restore the tablespaces in the recovery set and the auxiliary set restore clone datafile 1, 3, 2, 5; switch clone datafile all; } 正在执行内存脚本 正在执行命令: SET until clause 正在执行命令: SET NEWNAME 正在执行命令: SET NEWNAME 正在执行命令: SET NEWNAME 正在执行命令: SET NEWNAME 正在执行命令: SET NEWNAME 临时文件 1 在控制文件中已重命名为 /u01/app/oracle/oradata/XB/datafile/o1_mf_temp_%u_.tmp 启动 restore 于 20-10月-18 使用通道 ORA_AUX_DISK_1 通道 ORA_AUX_DISK_1: 正在开始还原数据文件备份集 通道 ORA_AUX_DISK_1: 正在指定从备份集还原的数据文件 通道 ORA_AUX_DISK_1: 将数据文件 00001 还原到 /u01/app/oracle/oradata/XB/datafile/o1_mf_system_%u_.dbf 通道 ORA_AUX_DISK_1: 将数据文件 00003 还原到 /u01/app/oracle/oradata/XB/datafile/o1_mf_undotbs1_%u_.dbf 通道 ORA_AUX_DISK_1: 将数据文件 00002 还原到 /u01/app/oracle/oradata/XB/datafile/o1_mf_sysaux_%u_.dbf 通道 ORA_AUX_DISK_1: 将数据文件 00005 还原到 /u01/app/oracle/oradata/xb/tbs_xb01.dbf 通道 ORA_AUX_DISK_1: 正在读取备份片段 /u01/app/oracle/fast_recovery_area/XB/backupset/2018_10_20/o1_mf_nnndf_TAG20181020T132437_fwoh0och_.bkp 通道 ORA_AUX_DISK_1: 段句柄 = /u01/app/oracle/fast_recovery_area/XB/backupset/2018_10_20/o1_mf_nnndf_TAG20181020T132437_fwoh0och_.bkp 标记 = TAG20181020T132437 通道 ORA_AUX_DISK_1: 已还原备份片段 1 通道 ORA_AUX_DISK_1: 还原完成, 用时: 00:00:15 完成 restore 于 20-10月-18 数据文件 1 已转换成数据文件副本 输入数据文件副本 RECID=5 STAMP=990019850 文件名=/u01/app/oracle/oradata/XB/datafile/o1_mf_system_fwohcvqx_.dbf 数据文件 3 已转换成数据文件副本 输入数据文件副本 RECID=6 STAMP=990019850 文件名=/u01/app/oracle/oradata/XB/datafile/o1_mf_undotbs1_fwohcvr1_.dbf 数据文件 2 已转换成数据文件副本 输入数据文件副本 RECID=7 STAMP=990019850 文件名=/u01/app/oracle/oradata/XB/datafile/o1_mf_sysaux_fwohcvqz_.dbf 内存脚本的内容: { # set requested point in time set until logseq 122 thread 1; # online the datafiles restored or switched sql clone "alter database datafile 1 online"; sql clone "alter database datafile 3 online"; sql clone "alter database datafile 2 online"; sql clone "alter database datafile 5 online"; # recover and open resetlogs recover clone database tablespace "TBS_XB", "SYSTEM", "UNDOTBS1", "SYSAUX" delete archivelog; alter clone database open resetlogs; } 正在执行内存脚本 正在执行命令: SET until clause sql 语句: alter database datafile 1 online sql 语句: alter database datafile 3 online sql 语句: alter database datafile 2 online sql 语句: alter database datafile 5 online 启动 recover 于 20-10月-18 使用通道 ORA_AUX_DISK_1 正在开始介质的恢复 线程 1 序列 118 的归档日志已作为文件 /u01/arch/1_118_984998420.dbf 存在于磁盘上 线程 1 序列 119 的归档日志已作为文件 /u01/arch/1_119_984998420.dbf 存在于磁盘上 线程 1 序列 120 的归档日志已作为文件 /u01/arch/1_120_984998420.dbf 存在于磁盘上 线程 1 序列 121 的归档日志已作为文件 /u01/arch/1_121_984998420.dbf 存在于磁盘上 归档日志文件名=/u01/arch/1_118_984998420.dbf 线程=1 序列=118 归档日志文件名=/u01/arch/1_119_984998420.dbf 线程=1 序列=119 归档日志文件名=/u01/arch/1_120_984998420.dbf 线程=1 序列=120 归档日志文件名=/u01/arch/1_121_984998420.dbf 线程=1 序列=121 介质恢复完成, 用时: 00:00:00 完成 recover 于 20-10月-18 数据库已打开 内存脚本的内容: { # make read only the tablespace that will be exported sql clone 'alter tablespace TBS_XB read only'; # create directory for datapump import sql "create or replace directory TSPITR_DIROBJ_DPDIR as '' /u01/app/oracle/oradata/''"; # create directory for datapump export sql clone "create or replace directory TSPITR_DIROBJ_DPDIR as '' /u01/app/oracle/oradata/''"; } 正在执行内存脚本 sql 语句: alter tablespace TBS_XB read only sql 语句: create or replace directory TSPITR_DIROBJ_DPDIR as ''/u01/app/oracle/oradata/'' sql 语句: create or replace directory TSPITR_DIROBJ_DPDIR as ''/u01/app/oracle/oradata/'' 正在执行元数据导出... EXPDP> 启动 "SYS"."TSPITR_EXP_phsf": EXPDP> 处理对象类型 TRANSPORTABLE_EXPORT/PLUGTS_BLK EXPDP> 处理对象类型 TRANSPORTABLE_EXPORT/TABLE EXPDP> 处理对象类型 TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK EXPDP> 已成功加载/卸载了主表 "SYS"."TSPITR_EXP_phsf" EXPDP> ****************************************************************************** EXPDP> SYS.TSPITR_EXP_phsf 的转储文件集为: EXPDP> /u01/app/oracle/oradata/tspitr_phsf_68494.dmp EXPDP> ****************************************************************************** EXPDP> 可传输表空间 TBS_XB 所需的数据文件: EXPDP> /u01/app/oracle/oradata/xb/tbs_xb01.dbf EXPDP> 作业 "SYS"."TSPITR_EXP_phsf" 已于 星期六 10月 20 13:31:26 2018 elapsed 0 00:00:22 成功完成 导出完毕 内存脚本的内容: { # shutdown clone before import shutdown clone immediate } 正在执行内存脚本 数据库已关闭 数据库已卸装 Oracle 实例已关闭 正在执行元数据导入... IMPDP> 已成功加载/卸载了主表 "SYS"."TSPITR_IMP_phsf" IMPDP> 启动 "SYS"."TSPITR_IMP_phsf": IMPDP> 处理对象类型 TRANSPORTABLE_EXPORT/PLUGTS_BLK IMPDP> 处理对象类型 TRANSPORTABLE_EXPORT/TABLE IMPDP> 处理对象类型 TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK IMPDP> 作业 "SYS"."TSPITR_IMP_phsf" 已于 星期六 10月 20 13:31:43 2018 elapsed 0 00:00:02 成功完成 导入完毕 内存脚本的内容: { # make read write and offline the imported tablespaces sql 'alter tablespace TBS_XB read write'; sql 'alter tablespace TBS_XB offline'; # enable autobackups after TSPITR is finished sql 'begin dbms_backup_restore.AutoBackupFlag(TRUE); end;'; } 正在执行内存脚本 sql 语句: alter tablespace TBS_XB read write sql 语句: alter tablespace TBS_XB offline sql 语句: begin dbms_backup_restore.AutoBackupFlag(TRUE); end; 删除自动实例 自动实例已删除 已删除辅助实例文件 /u01/app/oracle/oradata/XB/datafile/o1_mf_temp_fwohdmto_.tmp 已删除辅助实例文件 /u01/app/oracle/oradata/XB/onlinelog/o1_mf_3_fwohdjsz_.log 已删除辅助实例文件 /u01/app/oracle/oradata/XB/onlinelog/o1_mf_2_fwohdg6h_.log 已删除辅助实例文件 /u01/app/oracle/oradata/XB/onlinelog/o1_mf_1_fwohdcgm_.log 已删除辅助实例文件 /u01/app/oracle/oradata/XB/datafile/o1_mf_sysaux_fwohcvqz_.dbf 已删除辅助实例文件 /u01/app/oracle/oradata/XB/datafile/o1_mf_undotbs1_fwohcvr1_.dbf 已删除辅助实例文件 /u01/app/oracle/oradata/XB/datafile/o1_mf_system_fwohcvqx_.dbf 已删除辅助实例文件 /u01/app/oracle/oradata/XB/controlfile/o1_mf_fwohcoyp_.ctl 完成 recover 于 20-10月-18
rman 其实是用了transportable tablespace机制将删除的表空间重新插回database
1 2 3 4 5 6 7 8 9 10 11 12 SYS@xb> select tablespace_name,status,plugged_in from dba_tablespaces; TABLESPACE_NAME STATUS PLU ------------------------------ --------- --- SYSTEM ONLINE NO SYSAUX ONLINE NO UNDOTBS1 ONLINE NO TEMP ONLINE NO USERS ONLINE NO TBS_XB OFFLINE YES >>>>====表示plug 已选择6行。
恢复表 1 2 3 4 5 6 7 8 9 10 11 SYS@xb> alter tablespace tbs_xb online; 表空间已更改。 SYS@xb> conn xb/xb XB@xb> select count(1) from tb_xb; COUNT(1) ---------- 2797