前言:
Oracle12c退出了新功能基于时间点的recover table,可以从备份里面基于时间快速恢复表或者表分区,并且支持通过remap将恢复的表更换为其他表名或者将恢复的表通过expdp导出为dmp,这个功能可以使我们更加快速的进行表数据的恢复。
recover table:
能够将一个或多个表或表分区恢复到指定的时间点,而不影响其余的数据库对象。可以使用以前创建的RMAN备份将表和表分区恢复到指定的时间点。
在以下场景中非常有用:
-
需要将非常少量的表恢复到特定的时间点。在这种情况下,TSPITR不是最有效的解决方案,因为它将表空间中的所有对象恢复到指定的时间点。
-
需要恢复逻辑损坏或已经删除和清除的表。
-
无法进行flashback table,因为所需的时间点的undo已经过期。
-
恢复DDL操作修改表结构后丢失的数据。无法使用flashback table,flashback table无法对结构更改的表(如截断表操作)进行闪回数据。
recover table的前提:
-
目标数据库必须是读写模式
-
目标数据库必须开启归档模式
-
要恢复时间点的表或者表分区要有恢复时间点的备份文件
-
如果要恢复单个表分区,目标数据库的参数 COMPATIBLE需要11.1.0或以上
-
辅助实例的数据文件存储空间要足够,需要存放system,sysaux,undo以及需要恢复表所在的表空间
-
需要对undo、SYSTEM、SYSAUX和包含表或表分区的表空间进行完全备份,包含表的依赖对象的所有分区都必须包含在恢复集中。如果表空间tbs1中的表的索引或分区包含在表空间tbs2中,那么只有当表空间tbs2也包含在恢复集中时,才能恢复该表
-
要恢复PDB中的表,需要root,pdb$seed以及恢复PDB的SYSTEM、SYSAUX和undo表空间以及包含pdb表或分区的表空间
-
恢复可以基于time,scn,或者log sequence number
-
如果要从cdb里面恢复,需要通过cdb的服务名连接rman,否则可能出现以下错误
The ROOT container SYSTEM and UNDO tablespaces are restored to the auxiliary therefore RECOVER TABLE has to be run after a direct connection to ROOT CDB. If a service_name is not used, RMAN will fail during export:
% rman target / log /tmp/recover_table.log
RMAN> RECOVER TABLE SMEDS."RECTEST" OF PLUGGABLE DATABASE T12CPDB1
UNTIL SEQUENCE 48 THREAD 1
AUXILIARY DESTINATION '/testcases/rectbl/'
REMAP TABLE 'SMEDS'.'RECTEST':'TEST_RECTEST';
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 01/21/2013 15:24:19
RMAN-06962: Error received during export of metadata
RMAN-06960: EXPDP> ORA-31626: job does not exist
ORA-31633: unable to create master table "SYSBACKUP.TSPITR_EXP_xoxr_CDcd"
ORA-01552: cannot use system rollback segment for non-system tablespace 'USERS'
recover table恢复的步骤:
-
根据恢复指定的时间点,确定哪个备份包含需要恢复的表或表分区。
-
确定目标主机上是否有足够的空间来创建恢复过程中使用的辅助实例。如果所需的空间不足,则RMAN显示错误并退出恢复操作。
-
在目标主机上创建一个辅助数据库,并根据时间点以及表或表分区恢复到这个辅助数据库中。可以指定恢复的数据文件存储在辅助数据库中的目标主机上的位置。
-
创建Data Pump导出dmp文件,其中包含恢复的表或表分区。可以指定Data Pump导出dmp文件的名称和位置,该文件用于存储恢复的表或表分区的元数据。
-
(可选)导入恢复的表或表分区dmp文件到目标实例中。也可以选择不导入到目标数据库。如果在恢复过程中不导入dmp文件,则需要使用Data Pump import手动导入它。
-
(可选)重命名目标数据库中恢复的表或表分区。还可以将恢复的对象导入不同于它们最初存在的表空间或者用户或者表名之下
recover table的测试:
模拟误删除场景
---在PDB ebsdb里面创建测试数据
alter session set container=ebsdb;
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
create tablespace tbstest1 datafile size 100M;
create tablespace tbstest2 datafile size 100M;
create tablespace tbstest3 datafile size 100M;
create tablespace tbstest4 datafile size 100M;
create table test.test_part
(id number ,
insertdate date
)
partition by range(id)
(partition p_10 values less than (10) tablespace tbstest1,
partition p_20 values less than (20) tablespace tbstest2,
partition p_30 values less than (30) tablespace tbstest3,
partition p_40 values less than (40) tablespace tbstest4
);
insert into test.test_part values(1,sysdate);
insert into test.test_part values(11,sysdate);
insert into test.test_part values(21,sysdate);
insert into test.test_part values(31,sysdate);
commit;
---进行全量备份
run{
allocate channel c1 type disk;
allocate channel c2 type disk;
allocate channel c3 type disk;
backup as compressed backupset database format='/backup/%d_full_%s_%p.bak';
backup archivelog all format='/backup/%d_arch_%s_%p.bak' delete all input;
release channel c1;
release channel c2;
release channel c3;
}
---再插入数据
alter session set container=ebsdb;
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
insert into test.test_part values(22,sysdate);
commit;
---模拟误删除drop p_20分区数据
alter session set container=ebsdb;
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
select sysdate from dual;
select * from test.test_part;
SQL> select sysdate from dual;
SYSDATE
-------------------
2022-11-09 15:18:11
SQL> select * from test.test_part;
ID INSERTDATE
---------- -------------------
1 2022-11-09 15:15:24
11 2022-11-09 15:15:25
21 2022-11-09 15:15:25
22 2022-11-09 15:18:00
31 2022-11-09 15:15:25
SQL>
alter table test.test_part drop partition p_20;
---再插入数据,用于验证表数据恢复会不会影响表空间里面的其他数据
alter session set container=ebsdb;
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
insert into test.test_part values(12,sysdate);
commit;
create table test.test_recover(insertdate date) tablespace tbstest2;
insert into test.test_recover values(sysdate);
commit;
---在备份归档
run{
allocate channel c1 type disk;
allocate channel c2 type disk;
allocate channel c3 type disk;
backup archivelog all format='/backup/%d_arch_%s_%p.bak' delete all input;
release channel c1;
release channel c2;
release channel c3;
}
测试从备份里面恢复时间点表分区数据
由于恢复操作都在辅助实例上,除了导入数据到目标数据库,其他操作没有在目标数据库上进行,所以目标数据库在整个恢复的操作过程中基本没有影响的,
但在实际的生产恢复中,为了最大化的不影响误删数据现场以及减少数据库的运行,在条件允许的情况下,还是建议在备库进行操作,以确保整个恢复的安全以下演示环境也在备库进行操作
---关闭主库的mrp进程
alter database recover managed standby database cancel;
---failover激活备库,因为恢复需要在open write模式下进行,并且控制文件的类型不能为standby control,不能创建检查点
#RMAN-05010: target database must be opened in READ WRITE mode for Tablespace Point-in-Time Recovery
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
alter database open;
alter pluggable database all open instances=all;
---将备份发生到备库主机
scp -rp /backup oracle@xxxxx:/
---并注册备份到控制文件,确保数据库可以访问到备份文件
rman target /
crosscheck backup
catalog start with '/backup'
---在备库执行recover table恢复命令,恢复EBSDB PDB里面的表test_part的分区p20
---until time 恢复的时间点
---AUXILIARY DESTINATION 辅助实例的数据文件路径
---DATAPUMP DESTINATION 导出dmp文件的路径
---DATAPUMP FILE 导出的dmp文件名
---NOTABLEIMPORT 不导入目标数据库
rman target sys/oracle@racpdg log /tmp/recover_table.log
RECOVER TABLE "TEST"."TEST_PART":"P_20" OF PLUGGABLE DATABASE ebsdb
UNTIL time "to_date('11/09/2022 15:18:11','MM/DD/YYYY HH24:MI:SS')"
AUXILIARY DESTINATION '/u01/app/oracle/auxinstance'
DATAPUMP DESTINATION '/tmp'
DUMP FILE 'test_part_p20.dmp'
NOTABLEIMPORT;
recover table日志解析
RMAN> RECOVER TABLE "TEST"."TEST_PART":"P_20" OF PLUGGABLE DATABASE ebsdb
2> UNTIL time "to_date('11/09/2022 15:18:11','MM/DD/YYYY HH24:MI:SS')"
3> AUXILIARY DESTINATION '/u01/app/oracle/auxinstance'
4> DATAPUMP DESTINATION '/tmp'
5> DUMP FILE 'test_part_p20.dmp'
6> NOTABLEIMPORT;
Starting recover at 2022/11/13 14:50:02
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=14 device type=DISK
RMAN-05026: warning: presuming following set of tablespaces applies to specified point-in-time
List of tablespaces expected to have UNDO segments
Tablespace SYSTEM
Tablespace EBSDB:SYSTEM
Tablespace UNDOTBS1
Tablespace EBSDB:UNDOTBS1
Tablespace EBSDB:UNDO_2
##############################创建辅助实例
Creating automatic instance, with SID='helw'
initialization parameters used for automatic instance:
db_name=RACPDB
db_unique_name=helw_pitr_ebsdb_RACPDB
compatible=19.0.0
db_block_size=8192
db_files=200
diagnostic_dest=/u01/app/oracle
_system_trig_enabled=FALSE
sga_target=2320M
processes=200
db_create_file_dest=/u01/app/oracle/auxinstance
log_archive_dest_1='location=/u01/app/oracle/auxinstance'
enable_pluggable_database=true
_clone_one_pdb_recovery=true
#No auxiliary parameter file used
starting up automatic instance RACPDB
Oracle instance started
Total System Global Area 2432695632 bytes
Fixed Size 9137488 bytes
Variable Size 536870912 bytes
Database Buffers 1879048192 bytes
Redo Buffers 7639040 bytes
Automatic instance created
##############################辅助实例上恢复控制文件
contents of Memory Script:
{
# set requested point in time
set until time "to_date('11/09/2022 15:18:11','MM/DD/YYYY HH24:MI:SS')";
# 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';
}
executing Memory Script
executing command: SET until clause
Starting restore at 2022/11/13 14:50:15
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=162 device type=DISK
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: restoring control file
channel ORA_AUX_DISK_1: reading from backup piece /backup/backup/c-2010038303-20221109-06
channel ORA_AUX_DISK_1: piece handle=/backup/backup/c-2010038303-20221109-06 tag=TAG20221109T151657
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
output file name=/u01/app/oracle/auxinstance/RACPDG/controlfile/o1_mf_kq14x83o_.ctl
Finished restore at 2022/11/13 14:50:17
sql statement: alter database mount clone database
sql statement: alter system archive log current
##############################辅助实例上恢复root,pdb的数据文件undo,system,sysaux(不包括要恢复的表空间)
contents of Memory Script:
{
# set requested point in time
set until time "to_date('11/09/2022 15:18:11','MM/DD/YYYY HH24:MI:SS')";
# set destinations for recovery set and auxiliary set datafiles
set newname for clone datafile 1 to new;
set newname for clone datafile 16 to new;
set newname for clone datafile 5 to new;
set newname for clone datafile 18 to new;
set newname for clone datafile 19 to new;
set newname for clone datafile 3 to new;
set newname for clone datafile 17 to new;
set newname for clone tempfile 1 to new;
set newname for clone tempfile 5 to new;
# switch all tempfiles
switch clone tempfile all;
# restore the tablespaces in the recovery set and the auxiliary set
restore clone datafile 1, 16, 5, 18, 19, 3, 17;
switch clone datafile all;
}
executing Memory Script
executing command: SET until clause
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
renamed tempfile 1 to /u01/app/oracle/auxinstance/RACPDG/datafile/o1_mf_temp_%u_.tmp in control file
renamed tempfile 5 to /u01/app/oracle/auxinstance/RACPDG/ECDB7CD71FEB9A44E053DC01A8C0E647/datafile/o1_mf_temp_%u_.tmp in control file
Starting restore at 2022/11/13 14:50:23
using channel ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00001 to /u01/app/oracle/auxinstance/RACPDG/datafile/o1_mf_system_%u_.dbf
channel ORA_AUX_DISK_1: restoring datafile 00003 to /u01/app/oracle/auxinstance/RACPDG/datafile/o1_mf_sysaux_%u_.dbf
channel ORA_AUX_DISK_1: reading from backup piece /backup/backup/RACPDB_full_337_1.bak
channel ORA_AUX_DISK_1: piece handle=/backup/backup/RACPDB_full_337_1.bak tag=TAG20221109T151547
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:25
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00016 to /u01/app/oracle/auxinstance/RACPDG/ECDB7CD71FEB9A44E053DC01A8C0E647/datafile/o1_mf_system_%u_.dbf
channel ORA_AUX_DISK_1: reading from backup piece /backup/backup/RACPDB_full_343_1.bak
channel ORA_AUX_DISK_1: piece handle=/backup/backup/RACPDB_full_343_1.bak tag=TAG20221109T151547
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:15
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00005 to /u01/app/oracle/auxinstance/RACPDG/datafile/o1_mf_undotbs1_%u_.dbf
channel ORA_AUX_DISK_1: reading from backup piece /backup/backup/RACPDB_full_339_1.bak
channel ORA_AUX_DISK_1: piece handle=/backup/backup/RACPDB_full_339_1.bak tag=TAG20221109T151547
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00018 to /u01/app/oracle/auxinstance/RACPDG/ECDB7CD71FEB9A44E053DC01A8C0E647/datafile/o1_mf_undotbs1_%u_.dbf
channel ORA_AUX_DISK_1: restoring datafile 00019 to /u01/app/oracle/auxinstance/RACPDG/ECDB7CD71FEB9A44E053DC01A8C0E647/datafile/o1_mf_undo_2_%u_.dbf
channel ORA_AUX_DISK_1: reading from backup piece /backup/backup/RACPDB_full_338_1.bak
channel ORA_AUX_DISK_1: piece handle=/backup/backup/RACPDB_full_338_1.bak tag=TAG20221109T151547
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:03
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00017 to /u01/app/oracle/auxinstance/RACPDG/ECDB7CD71FEB9A44E053DC01A8C0E647/datafile/o1_mf_sysaux_%u_.dbf
channel ORA_AUX_DISK_1: reading from backup piece /backup/backup/RACPDB_full_342_1.bak
channel ORA_AUX_DISK_1: piece handle=/backup/backup/RACPDB_full_342_1.bak tag=TAG20221109T151547
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:15
Finished restore at 2022/11/13 14:51:22
datafile 1 switched to datafile copy
input datafile copy RECID=8 STAMP=1120661483 file name=/u01/app/oracle/auxinstance/RACPDG/datafile/o1_mf_system_kq14xhqd_.dbf
datafile 16 switched to datafile copy
input datafile copy RECID=9 STAMP=1120661483 file name=/u01/app/oracle/auxinstance/RACPDG/ECDB7CD71FEB9A44E053DC01A8C0E647/datafile/o1_mf_system_kq14y8rr_.dbf
datafile 5 switched to datafile copy
input datafile copy RECID=10 STAMP=1120661483 file name=/u01/app/oracle/auxinstance/RACPDG/datafile/o1_mf_undotbs1_kq14yqt3_.dbf
datafile 18 switched to datafile copy
input datafile copy RECID=11 STAMP=1120661483 file name=/u01/app/oracle/auxinstance/RACPDG/ECDB7CD71FEB9A44E053DC01A8C0E647/datafile/o1_mf_undotbs1_kq14yrv9_.dbf
datafile 19 switched to datafile copy
input datafile copy RECID=12 STAMP=1120661483 file name=/u01/app/oracle/auxinstance/RACPDG/ECDB7CD71FEB9A44E053DC01A8C0E647/datafile/o1_mf_undo_2_kq14yrvq_.dbf
datafile 3 switched to datafile copy
input datafile copy RECID=13 STAMP=1120661483 file name=/u01/app/oracle/auxinstance/RACPDG/datafile/o1_mf_sysaux_kq14xhqs_.dbf
datafile 17 switched to datafile copy
input datafile copy RECID=14 STAMP=1120661483 file name=/u01/app/oracle/auxinstance/RACPDG/ECDB7CD71FEB9A44E053DC01A8C0E647/datafile/o1_mf_sysaux_kq14yvwc_.dbf
contents of Memory Script:
{
# set requested point in time
set until time "to_date('11/09/2022 15:18:11','MM/DD/YYYY HH24:MI:SS')";
# online the datafiles restored or switched
sql clone "alter database datafile 1 online";
sql clone 'EBSDB' "alter database datafile
16 online";
sql clone "alter database datafile 5 online";
sql clone 'EBSDB' "alter database datafile
18 online";
sql clone 'EBSDB' "alter database datafile
19 online";
sql clone "alter database datafile 3 online";
sql clone 'EBSDB' "alter database datafile
17 online";
# recover and open database read only
recover clone database tablespace "SYSTEM", "EBSDB":"SYSTEM", "UNDOTBS1", "EBSDB":"UNDOTBS1", "EBSDB":"UNDO_2", "SYSAUX", "EBSDB":"SYSAUX";
sql clone 'alter database open read only';
}
executing Memory Script
executing command: SET until clause
sql statement: alter database datafile 1 online
sql statement: alter database datafile 16 online
sql statement: alter database datafile 5 online
sql statement: alter database datafile 18 online
sql statement: alter database datafile 19 online
sql statement: alter database datafile 3 online
sql statement: alter database datafile 17 online
Starting recover at 2022/11/13 14:51:23
using channel ORA_AUX_DISK_1
##############################辅助实例上对已经恢复的表空间undo,system,sysaux(不包括要恢复的表空间)recover到指定时间点
starting media recovery
archived log for thread 1 with sequence 99 is already on disk as file /u01/app/oracle/product/19.0.0/dbhome_1/dbs/arch1_99_1120132767.dbf
archived log for thread 1 with sequence 100 is already on disk as file /u01/app/oracle/product/19.0.0/dbhome_1/dbs/arch1_100_1120132767.dbf
archived log file name=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/arch1_99_1120132767.dbf thread=1 sequence=99
archived log file name=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/arch1_100_1120132767.dbf thread=1 sequence=100
media recovery complete, elapsed time: 00:00:00
Finished recover at 2022/11/13 14:51:24
sql statement: alter database open read only
contents of Memory Script:
{
sql clone 'alter pluggable database EBSDB open read only';
}
executing Memory Script
sql statement: alter pluggable database EBSDB open read only
##############################关闭辅助实例,然后重新启动到mount
contents of Memory Script:
{
sql clone "create spfile from memory";
shutdown clone immediate;
startup clone nomount;
sql clone "alter system set control_files =
''/u01/app/oracle/auxinstance/RACPDG/controlfile/o1_mf_kq14x83o_.ctl'' comment=
''RMAN set'' scope=spfile";
shutdown clone immediate;
startup clone nomount;
# mount database
sql clone 'alter database mount clone database';
}
executing Memory Script
sql statement: create spfile from memory
database closed
database dismounted
Oracle instance shut down
connected to auxiliary database (not started)
Oracle instance started
Total System Global Area 2432695632 bytes
Fixed Size 9137488 bytes
Variable Size 536870912 bytes
Database Buffers 1879048192 bytes
Redo Buffers 7639040 bytes
sql statement: alter system set control_files = ''/u01/app/oracle/auxinstance/RACPDG/controlfile/o1_mf_kq14x83o_.ctl'' comment= ''RMAN set'' scope=spfile
Oracle instance shut down
connected to auxiliary database (not started)
Oracle instance started
Total System Global Area 2432695632 bytes
Fixed Size 9137488 bytes
Variable Size 536870912 bytes
Database Buffers 1879048192 bytes
Redo Buffers 7639040 bytes
sql statement: alter database mount clone database
##############################辅助实例上恢复表与表分区所在的表空间tbstest2
contents of Memory Script:
{
# set requested point in time
set until time "to_date('11/09/2022 15:18:11','MM/DD/YYYY HH24:MI:SS')";
# set destinations for recovery set and auxiliary set datafiles
set newname for datafile 65 to new;
# restore the tablespaces in the recovery set and the auxiliary set
restore clone datafile 65;
switch clone datafile all;
}
executing Memory Script
executing command: SET until clause
executing command: SET NEWNAME
Starting restore at 2022/11/13 14:52:30
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=18 device type=DISK
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00065 to /u01/app/oracle/auxinstance/HELW_PITR_EBSDB_RACPDB/ECDB7CD71FEB9A44E053DC01A8C0E647/datafile/o1_mf_tbstest2_%u_.dbf
channel ORA_AUX_DISK_1: reading from backup piece /backup/backup/RACPDB_full_343_1.bak
channel ORA_AUX_DISK_1: piece handle=/backup/backup/RACPDB_full_343_1.bak tag=TAG20221109T151547
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
Finished restore at 2022/11/13 14:52:31
datafile 65 switched to datafile copy
input datafile copy RECID=16 STAMP=1120661551 file name=/u01/app/oracle/auxinstance/HELW_PITR_EBSDB_RACPDB/ECDB7CD71FEB9A44E053DC01A8C0E647/datafile/o1_mf_tbstest2_kq151gpp_.dbf
contents of Memory Script:
{
# set requested point in time
set until time "to_date('11/09/2022 15:18:11','MM/DD/YYYY HH24:MI:SS')";
# online the datafiles restored or switched
sql clone 'EBSDB' "alter database datafile
65 online";
# recover and open resetlogs
recover clone database tablespace "EBSDB":"TBSTEST2", "SYSTEM", "EBSDB":"SYSTEM", "UNDOTBS1", "EBSDB":"UNDOTBS1", "EBSDB":"UNDO_2", "SYSAUX", "EBSDB":"SYSAUX" delete archivelog;
alter clone database open resetlogs;
}
executing Memory Script
executing command: SET until clause
sql statement: alter database datafile 65 online
Starting recover at 2022/11/13 14:52:31
using channel ORA_AUX_DISK_1
##############################辅助实例上恢复表空间tbstest2到指定的时间点
starting media recovery
archived log for thread 1 with sequence 99 is already on disk as file /u01/app/oracle/product/19.0.0/dbhome_1/dbs/arch1_99_1120132767.dbf
archived log for thread 1 with sequence 100 is already on disk as file /u01/app/oracle/product/19.0.0/dbhome_1/dbs/arch1_100_1120132767.dbf
archived log file name=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/arch1_99_1120132767.dbf thread=1 sequence=99
archived log file name=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/arch1_100_1120132767.dbf thread=1 sequence=100
media recovery complete, elapsed time: 00:00:01
Finished recover at 2022/11/13 14:52:33
database opened
contents of Memory Script:
{
sql clone 'alter pluggable database EBSDB open';
}
executing Memory Script
sql statement: alter pluggable database EBSDB open
contents of Memory Script:
{
# create directory for datapump import
sql 'EBSDB' "create or replace directory
TSPITR_DIROBJ_DPDIR as ''
/tmp''";
# create directory for datapump export
sql clone 'EBSDB' "create or replace directory
TSPITR_DIROBJ_DPDIR as ''
/tmp''";
}
executing Memory Script
##############################expdp导出分区到指定的路径下
sql statement: create or replace directory TSPITR_DIROBJ_DPDIR as ''/tmp''
sql statement: create or replace directory TSPITR_DIROBJ_DPDIR as ''/tmp''
Performing export of tables...
EXPDP> Starting "SYS"."TSPITR_EXP_helw_jFyq":
EXPDP> Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
EXPDP> Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
EXPDP> Processing object type TABLE_EXPORT/TABLE/TABLE
EXPDP> . . exported "TEST"."TEST_PART":"P_20" 5.484 KB 1 rows
EXPDP> Master table "SYS"."TSPITR_EXP_helw_jFyq" successfully loaded/unloaded
EXPDP> ******************************************************************************
EXPDP> Dump file set for SYS.TSPITR_EXP_helw_jFyq is:
EXPDP> /tmp/test_part_p20.dmp
EXPDP> Job "SYS"."TSPITR_EXP_helw_jFyq" successfully completed at Sun Nov 13 14:53:11 2022 elapsed 0 00:00:21
Export completed
Not performing table import after point-in-time recovery
##############################删除辅助实例,完成恢复
Removing automatic instance
shutting down automatic instance
Oracle instance shut down
Automatic instance removed
auxiliary instance file /u01/app/oracle/auxinstance/RACPDG/ECDB7CD71FEB9A44E053DC01A8C0E647/datafile/o1_mf_temp_kq14zgc5_.tmp deleted
auxiliary instance file /u01/app/oracle/auxinstance/RACPDG/datafile/o1_mf_temp_kq14zdz6_.tmp deleted
auxiliary instance file /u01/app/oracle/auxinstance/HELW_PITR_EBSDB_RACPDB/onlinelog/o1_mf_3_kq151k9b_.log deleted
auxiliary instance file /u01/app/oracle/auxinstance/HELW_PITR_EBSDB_RACPDB/onlinelog/o1_mf_2_kq151k84_.log deleted
auxiliary instance file /u01/app/oracle/auxinstance/HELW_PITR_EBSDB_RACPDB/onlinelog/o1_mf_1_kq151k7n_.log deleted
auxiliary instance file /u01/app/oracle/auxinstance/HELW_PITR_EBSDB_RACPDB/ECDB7CD71FEB9A44E053DC01A8C0E647/datafile/o1_mf_tbstest2_kq151gpp_.dbf deleted
auxiliary instance file /u01/app/oracle/auxinstance/RACPDG/ECDB7CD71FEB9A44E053DC01A8C0E647/datafile/o1_mf_sysaux_kq14yvwc_.dbf deleted
auxiliary instance file /u01/app/oracle/auxinstance/RACPDG/datafile/o1_mf_sysaux_kq14xhqs_.dbf deleted
auxiliary instance file /u01/app/oracle/auxinstance/RACPDG/ECDB7CD71FEB9A44E053DC01A8C0E647/datafile/o1_mf_undo_2_kq14yrvq_.dbf deleted
auxiliary instance file /u01/app/oracle/auxinstance/RACPDG/ECDB7CD71FEB9A44E053DC01A8C0E647/datafile/o1_mf_undotbs1_kq14yrv9_.dbf deleted
auxiliary instance file /u01/app/oracle/auxinstance/RACPDG/datafile/o1_mf_undotbs1_kq14yqt3_.dbf deleted
auxiliary instance file /u01/app/oracle/auxinstance/RACPDG/ECDB7CD71FEB9A44E053DC01A8C0E647/datafile/o1_mf_system_kq14y8rr_.dbf deleted
auxiliary instance file /u01/app/oracle/auxinstance/RACPDG/datafile/o1_mf_system_kq14xhqd_.dbf deleted
auxiliary instance file /u01/app/oracle/auxinstance/RACPDG/controlfile/o1_mf_kq14x83o_.ctl deleted
Finished recover at 2022/11/13 14:53:14
RMAN>
其他恢复场景:
直接将恢复的数据导入目标数据库(恢复最快)
RECOVER TABLE "TEST"."TEST_PART":"P_20" OF PLUGGABLE DATABASE ebsdb
UNTIL time "to_date('11/09/2022 15:18:11','MM/DD/YYYY HH24:MI:SS')"
AUXILIARY DESTINATION '/u01/app/oracle/auxinstance';
---会执行导入操作,导入目标库的表为表名_分区
Performing import of tables...
IMPDP> Master table "SYS"."TSPITR_IMP_lAng_oigD" successfully loaded/unloaded
IMPDP> Starting "SYS"."TSPITR_IMP_lAng_oigD":
IMPDP> Processing object type TABLE_EXPORT/TABLE/TABLE
IMPDP> Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
IMPDP> . . imported "TEST"."TEST_PART_P_20" 5.484 KB 1 rows
IMPDP> Job "SYS"."TSPITR_IMP_lAng_oigD" successfully completed at Sun Nov 13 15:15:50 2022 elapsed 0 00:00:06
Import completed
---不会影响表空间里面的其他表数据
SQL> select * from "TEST"."TEST_PART_P_20" ;
ID INSERTDATE
---------- -------------------
11 2022-11-09 15:15:25
SQL> select * from "TEST".test_recover;
INSERTDATE
-------------------
2022-11-09 15:23:08
SQL>
基于日志序列号恢复多个分区表,并remap恢复的表空间,表名
RECOVER TABLE SH.SALES:SALES_1998, SH.SALES:SALES_1999
UNTIL SEQUENCE 354
AUXILIARY DESTINATION '/tmp/oracle/recover'
REMAP TABLE 'SH'.'SALES':'SALES_1998':'HISTORIC_SALES_1998',
'SH'.'SALES':'SALES_1999':'HISTORIC_SALES_1999'
REMAP TABLESPACE 'SALES_TS':'SALES_PRE_2000_TS';
恢复多个表,并remap恢复的用户,表名
RECOVER TABLE HR.DEPARTMENTS, SH.CHANNELS
UNTIL TIME 'SYSDATE – 1'
AUXILIARY DESTINATION '/tmp/auxdest'
REMAP TABLE hr.departments:example.new_departments, sh.channels:example.new_channels;
总结:
recover table相比于之前的表空间基于时间点的恢复(TSPITR)更适合对表数据的恢复,恢复更加的快速简单,并且恢复不会对目标数据库进行offline表空间的操作,对目标数据库几乎无影响。