关于号主,姚远:
Oracle ACE(Oracle和MySQL数据库方向)
华为云最有价值专家
《MySQL 8.0运维与优化》的作者
拥有 Oracle 10g、12c和19c OCM等数十项数据库认证
曾任IBM公司数据库部门经理
20+年DBA经验,服务2万+客户
精通C和Java,发明两项计算机专利
在Oracle中,通常所有的表空间都要在同一个时间点上保持一致。但实际工作中,有时我们需要在同一个数据库中,把部分数据恢复到不同的时间点。这时就要用到RMAN的表空间时间点恢复功能。这里姚远老师给大家介绍一下这个功能,参考官方文档《Backup and Recovery User's Guide》21 Performing RMAN Tablespace Point-in-Time Recovery (TSPITR)
表空间时间点恢复实质是先将指定表空间按照时间点恢复到一个辅助的实例,然后用数据泵把数据抽取处理,再将抽取处理的数据导入到老的实例中。
01
—
环境准备
首先我们先进行环境准备。
SQL> -- Performing RMAN Tablespace Point-in-Time Recovery (TSPITR)SQL> create tablespace mva datafile size 10m;SQL> create table tbb(i int) tablespace mva;SQL> insert into tbb values(2);SQL> insert into tbb values(2);SQL> insert into tbb values(3);1 row created.SQL> commit;Commit complete.SQL> alter system switch logfile;System altered.SQL> archive log list;Database log mode Archive ModeAutomatic archival EnabledArchive destination USE_DB_RECOVERY_FILE_DESTOldest online log sequence 11Next log sequence to archive 13Current log sequence 13SQL> insert into tbb values(4);1 row created.SQL> commit;Commit complete.SQL> alter system switch logfile;System altered.SQL> archive log list;Database log mode Archive ModeAutomatic archival EnabledArchive destination USE_DB_RECOVERY_FILE_DESTOldest online log sequence 12Next log sequence to archive 14Current log sequence 14
使用下面的存储过程检查MVA表空间是否是自包含,如果检查到违反自包含的结果会放在视图TRANSPORT_SET_VIOLATIONS中。
BEGINDBMS_TTS.TRANSPORT_SET_CHECK('MVA', TRUE,TRUE);END;/SELECT * FROM TRANSPORT_SET_VIOLATIONS;no rows selected
02
—
全自动恢复
姚远老师这里计划把MVA这个表空间恢复到第13个归档日志的时间点,使用下面的RMAN命令进行表空间的时间点恢复。
此处有图未下载
RECOVER TABLESPACE MVAUNTIL LOGSEQ 133> AUXILIARY DESTINATION '/u01/tmp' ;Starting recover at 2023-08-28using channel ORA_DISK_1RMAN-05026: warning: presuming following set of tablespaces applies to specified point-in-timeList of tablespaces expected to have UNDO segmentsTablespace SYSTEMTablespace PDBA:SYSTEMTablespace UNDOTBS1Tablespace PDBA:UNDOTBS1Creating automatic instance, with SID='bAwz'initialization parameters used for automatic instance:db_name=SMALLdb_unique_name=bAwz_pitr_SMALLcompatible=19.0.0db_block_size=8192db_files=200diagnostic_dest=/u01/app/oracle_system_trig_enabled=FALSEsga_target=7312Mprocesses=200db_create_file_dest=/u01/tmplog_archive_dest_1='location=/u01/tmp'enable_pluggable_database=true_clone_one_pdb_recovery=true#No auxiliary parameter file usedstarting up automatic instance SMALLOracle instance startedTotal System Global Area 7667185656 bytesFixed Size 9152504 bytesVariable Size 1291845632 bytesDatabase Buffers 6308233216 bytesRedo Buffers 57954304 bytesAutomatic instance createdRunning TRANSPORT_SET_CHECK on recovery set tablespacesTRANSPORT_SET_CHECK completed successfullycontents of Memory Script:{# set requested point in timeset until logseq 13 thread 1;# restore the controlfilerestore clone controlfile;# mount the controlfilesql clone 'alter database mount clone database';# archive current online logsql 'alter system archive log current';# avoid unnecessary autobackups for structural changes during TSPITRsql 'begin dbms_backup_restore.AutoBackupFlag(FALSE); end;';}executing Memory Scriptexecuting command: SET until clauseStarting restore at 2023-08-28allocated channel: ORA_AUX_DISK_1channel ORA_AUX_DISK_1: SID=246 device type=DISKchannel ORA_AUX_DISK_1: starting datafile backup set restorechannel ORA_AUX_DISK_1: restoring control filechannel ORA_AUX_DISK_1: reading from backup piece +DATA3/SMALL/AUTOBACKUP/2023_08_28/s_1146076218.575.1146076219channel ORA_AUX_DISK_1: piece handle=+DATA3/SMALL/AUTOBACKUP/2023_08_28/s_1146076218.575.1146076219 tag=TAG20230828T183018channel ORA_AUX_DISK_1: restored backup piece 1channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:05output file name=/u01/tmp/SMALL/controlfile/o1_mf_lgrxyfbj_.ctlFinished restore at 2023-08-28sql statement: alter database mount clone databasesql statement: alter system archive log currentsql statement: begin dbms_backup_restore.AutoBackupFlag(FALSE); end;contents of Memory Script:{# set requested point in timeset until logseq 13 thread 1;plsql <<<--declaresqlstatement varchar2(512);pdbname varchar2(128);offline_not_needed exception;pragma exception_init(offline_not_needed, -01539);beginpdbname := null; -- pdbnamesqlstatement := 'alter tablespace '|| 'MVA' ||' offline immediate';krmicd.writeMsg(6162, sqlstatement);krmicd.execSql(sqlstatement, 0, pdbname);exceptionwhen offline_not_needed thennull;end; >>>;# set destinations for recovery set and auxiliary set datafilesset newname for clone datafile 1 to new;set newname for clone datafile 9 to new;set newname for clone datafile 4 to new;set newname for clone datafile 11 to new;set newname for clone datafile 3 to new;set newname for clone tempfile 1 to new;set newname for datafile 13 to"+DATA3/SMALL/DATAFILE/mva.585.1146075991";# switch all tempfilesswitch clone tempfile all;# restore the tablespaces in the recovery set and the auxiliary setrestore clone datafile 1, 9, 4, 11, 3, 13;switch clone datafile all;}executing Memory Scriptexecuting command: SET until clausesql statement: alter tablespace MVA offline immediateexecuting command: SET NEWNAMEexecuting command: SET NEWNAMEexecuting command: SET NEWNAMEexecuting command: SET NEWNAMEexecuting command: SET NEWNAMEexecuting command: SET NEWNAMEexecuting command: SET NEWNAMErenamed tempfile 1 to u01/tmp/SMALL/datafile/o1_mf_temp_%u_.tmp in control fileStarting restore at 2023-08-28using channel ORA_AUX_DISK_1channel ORA_AUX_DISK_1: starting datafile backup set restorechannel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup setchannel ORA_AUX_DISK_1: restoring datafile 00001 to u01/tmp/SMALL/datafile/o1_mf_system_%u_.dbfchannel ORA_AUX_DISK_1: restoring datafile 00004 to u01/tmp/SMALL/datafile/o1_mf_undotbs1_%u_.dbfchannel ORA_AUX_DISK_1: restoring datafile 00003 to u01/tmp/SMALL/datafile/o1_mf_sysaux_%u_.dbfchannel ORA_AUX_DISK_1: restoring datafile 00013 to +DATA3/SMALL/DATAFILE/mva.585.1146075991channel ORA_AUX_DISK_1: reading from backup piece +DATA3/SMALL/BACKUPSET/2023_08_28/nnndf0_tag20230828t183003_0.580.1146076203channel ORA_AUX_DISK_1: piece handle=+DATA3/SMALL/BACKUPSET/2023_08_28/nnndf0_tag20230828t183003_0.580.1146076203 tag=TAG20230828T183003channel ORA_AUX_DISK_1: restored backup piece 1channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:15channel ORA_AUX_DISK_1: starting datafile backup set restorechannel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup setchannel ORA_AUX_DISK_1: restoring datafile 00009 to u01/tmp/SMALL/03F9F6DBB7925A5AE063B257A8C0F566/datafile/o1_mf_system_%u_.dbfchannel ORA_AUX_DISK_1: restoring datafile 00011 to u01/tmp/SMALL/03F9F6DBB7925A5AE063B257A8C0F566/datafile/o1_mf_undotbs1_%u_.dbfchannel ORA_AUX_DISK_1: reading from backup piece +DATA3/SMALL/03F9F6DBB7925A5AE063B257A8C0F566/BACKUPSET/2023_08_28/nnndf0_tag20230828t183003_0.579.1146076211channel ORA_AUX_DISK_1: piece handle=+DATA3/SMALL/03F9F6DBB7925A5AE063B257A8C0F566/BACKUPSET/2023_08_28/nnndf0_tag20230828t183003_0.579.1146076211 tag=TAG20230828T183003channel ORA_AUX_DISK_1: restored backup piece 1channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:03Finished restore at 2023-08-28datafile 1 switched to datafile copyinput datafile copy RECID=9 STAMP=1146076392 file name=/u01/tmp/SMALL/datafile/o1_mf_system_lgrxyp7h_.dbfdatafile 9 switched to datafile copyinput datafile copy RECID=10 STAMP=1146076392 file name=/u01/tmp/SMALL/03F9F6DBB7925A5AE063B257A8C0F566/datafile/o1_mf_system_lgrxz59b_.dbfdatafile 4 switched to datafile copyinput datafile copy RECID=11 STAMP=1146076392 file name=/u01/tmp/SMALL/datafile/o1_mf_undotbs1_lgrxyp7j_.dbfdatafile 11 switched to datafile copyinput datafile copy RECID=12 STAMP=1146076392 file name=/u01/tmp/SMALL/03F9F6DBB7925A5AE063B257A8C0F566/datafile/o1_mf_undotbs1_lgrxz59d_.dbfdatafile 3 switched to datafile copyinput datafile copy RECID=13 STAMP=1146076392 file name=/u01/tmp/SMALL/datafile/o1_mf_sysaux_lgrxyp7j_.dbfcontents of Memory Script:{# set requested point in timeset until logseq 13 thread 1;# online the datafiles restored or switchedsql clone "alter database datafile 1 online";sql clone 'PDBA' "alter database datafile9 online";sql clone "alter database datafile 4 online";sql clone 'PDBA' "alter database datafile11 online";sql clone "alter database datafile 3 online";sql clone "alter database datafile 13 online";# recover and open resetlogsrecover clone database tablespace "MVA", "SYSTEM", "PDBA":"SYSTEM", "UNDOTBS1", "PDBA":"UNDOTBS1", "SYSAUX" delete archivelog;alter clone database open resetlogs;}executing Memory Scriptexecuting command: SET until clausesql statement: alter database datafile 1 onlinesql statement: alter database datafile 9 onlinesql statement: alter database datafile 4 onlinesql statement: alter database datafile 11 onlinesql statement: alter database datafile 3 onlinesql statement: alter database datafile 13 onlineStarting recover at 2023-08-28using channel ORA_AUX_DISK_1starting media recoveryarchived log for thread 1 with sequence 11 is already on disk as file +DATA3/SMALL/ARCHIVELOG/2023_08_28/thread_1_seq_11.577.1146076217archived log for thread 1 with sequence 12 is already on disk as file +DATA3/SMALL/ARCHIVELOG/2023_08_28/thread_1_seq_12.574.1146076261archived log file name=+DATA3/SMALL/ARCHIVELOG/2023_08_28/thread_1_seq_11.577.1146076217 thread=1 sequence=11archived log file name=+DATA3/SMALL/ARCHIVELOG/2023_08_28/thread_1_seq_12.574.1146076261 thread=1 sequence=12media recovery complete, elapsed time: 00:00:01Finished recover at 2023-08-28database openedcontents of Memory Script:{# make read only the tablespace that will be exportedsql clone 'alter tablespace MVA read only';# create directory for datapump importsql "create or replace directory TSPITR_DIROBJ_DPDIR as ''/u01/tmp''";# create directory for datapump exportsql clone "create or replace directory TSPITR_DIROBJ_DPDIR as ''/u01/tmp''";}executing Memory Scriptsql statement: alter tablespace MVA read onlysql statement: create or replace directory TSPITR_DIROBJ_DPDIR as ''/u01/tmp''sql statement: create or replace directory TSPITR_DIROBJ_DPDIR as ''/u01/tmp''Performing export of metadata...EXPDP>Warning: Oracle Data Pump operations are not typically needed when connected to the root or seed of a container database.EXPDP> Starting "SYS"."TSPITR_EXP_bAwz_irAw":EXPDP> Processing object type TRANSPORTABLE_EXPORT/STATISTICS/TABLE_STATISTICSEXPDP> Processing object type TRANSPORTABLE_EXPORT/STATISTICS/MARKEREXPDP> Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLKEXPDP> Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLKEXPDP> Processing object type TRANSPORTABLE_EXPORT/TABLEEXPDP> Master table "SYS"."TSPITR_EXP_bAwz_irAw" successfully loaded/unloadedEXPDP> ******************************************************************************EXPDP> Dump file set for SYS.TSPITR_EXP_bAwz_irAw is:EXPDP> u01/tmp/tspitr_bAwz_11401.dmpEXPDP> ******************************************************************************EXPDP> Datafiles required for transportable tablespace MVA:EXPDP> +DATA3/SMALL/DATAFILE/mva.585.1146075991EXPDP> Job "SYS"."TSPITR_EXP_bAwz_irAw" successfully completed at Mon Aug 28 18:33:56 2023 elapsed 0 00:00:30Export completedcontents of Memory Script:{# shutdown clone before importshutdown clone abort# drop target tablespaces before importing them backsql 'drop tablespace MVA including contents keep datafiles cascade constraints';}executing Memory ScriptOracle instance shut downsql statement: drop tablespace MVA including contents keep datafiles cascade constraintsPerforming import of metadata...IMPDP>Warning: Oracle Data Pump operations are not typically needed when connected to the root or seed of a container database.IMPDP> Master table "SYS"."TSPITR_IMP_bAwz_tzxB" successfully loaded/unloadedIMPDP> Starting "SYS"."TSPITR_IMP_bAwz_tzxB":IMPDP> Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLKIMPDP> Processing object type TRANSPORTABLE_EXPORT/TABLEIMPDP> Processing object type TRANSPORTABLE_EXPORT/STATISTICS/TABLE_STATISTICSIMPDP> Processing object type TRANSPORTABLE_EXPORT/STATISTICS/MARKERIMPDP> Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLKIMPDP> Job "SYS"."TSPITR_IMP_bAwz_tzxB" successfully completed at Mon Aug 28 18:34:25 2023 elapsed 0 00:00:19Import completedcontents of Memory Script:{# make read write and offline the imported tablespacessql 'alter tablespace MVA read write';sql 'alter tablespace MVA offline';# enable autobackups after TSPITR is finishedsql 'begin dbms_backup_restore.AutoBackupFlag(TRUE); end;';}executing Memory Scriptsql statement: alter tablespace MVA read writesql statement: alter tablespace MVA offlinesql statement: begin dbms_backup_restore.AutoBackupFlag(TRUE); end;Removing automatic instanceAutomatic instance removedauxiliary instance file u01/tmp/SMALL/datafile/o1_mf_temp_lgrxzjbn_.tmp deletedauxiliary instance file u01/tmp/SMALL/onlinelog/o1_mf_3_lgrxzd4t_.log deletedauxiliary instance file u01/tmp/SMALL/onlinelog/o1_mf_2_lgrxzd49_.log deletedauxiliary instance file u01/tmp/SMALL/onlinelog/o1_mf_1_lgrxzd3s_.log deletedauxiliary instance file u01/tmp/SMALL/datafile/o1_mf_sysaux_lgrxyp7j_.dbf deletedauxiliary instance file u01/tmp/SMALL/03F9F6DBB7925A5AE063B257A8C0F566/datafile/o1_mf_undotbs1_lgrxz59d_.dbf deletedauxiliary instance file u01/tmp/SMALL/datafile/o1_mf_undotbs1_lgrxyp7j_.dbf deletedauxiliary instance file u01/tmp/SMALL/03F9F6DBB7925A5AE063B257A8C0F566/datafile/o1_mf_system_lgrxz59b_.dbf deletedauxiliary instance file u01/tmp/SMALL/datafile/o1_mf_system_lgrxyp7h_.dbf deletedauxiliary instance file u01/tmp/SMALL/controlfile/o1_mf_lgrxyfbj_.ctl deletedauxiliary instance file tspitr_bAwz_11401.dmp deletedFinished recover at 2023-08-28
注意until子句指定的log sequence号,但不包括这个log,具体参见官方文档database-backup-and-recovery-reference.pdf。
完成恢复后表空间为offline的状态,需要备份后再改为online。
RMAN> backup tablespace mva;Starting backup at 2023-08-28using channel ORA_DISK_1channel ORA_DISK_1: starting full datafile backup setchannel ORA_DISK_1: specifying datafile(s) in backup setinput datafile file number=00014 name=+DATA3/SMALL/DATAFILE/mva.585.1146075991channel ORA_DISK_1: starting piece 1 at 2023-08-28channel ORA_DISK_1: finished piece 1 at 2023-08-28piece handle=+DATA3/SMALL/BACKUPSET/2023_08_28/nnndf0_tag20230828t183438_0.571.1146076479 tag=TAG20230828T183438 comment=NONEchannel ORA_DISK_1: backup set complete, elapsed time: 00:00:01Finished backup at 2023-08-28Starting Control File and SPFILE Autobackup at 2023-08-28piece handle=+DATA3/SMALL/AUTOBACKUP/2023_08_28/s_1146076479.570.1146076479 comment=NONEFinished Control File and SPFILE Autobackup at 2023-08-28RMAN> alter tablespace mva online;Statement processed
恢复完成后检查数据
SQL> select * from tbb;I----------123
发现没有恢复记值为4的记录,也就是恢复到第13个归档日志。
如果是恢复PDB中的表空间,可以使用类似下面的命令
RECOVER TABLESPACE PDBA:MVAUNTIL LOGSEQ 30AUXILIARY DESTINATION '/u01/tmp' ;
03
—
客户化自动恢复参数
前面的例子是全自动的恢复,实际工作中还可以对一些参数进行客户化,例如可以使用指定的参数文件进行恢复。下面是一个参数文件的例子。
oracle@YaoYuan ~$ cat tmp/mva.oraSGA_TARGET=2gPROCESSES=200
还可以指定数据文件恢复的路径,下面是恢复脚本的一个例子。
run{SET NEWNAME FOR DATAFILE '+DATA3/SMALL/DATAFILE/mva.585.1146075991' to '/home/oracle/tmp/mva.dbf';SET AUXILIARY INSTANCE PARAMETER FILE to '/home/oracle/tmp/mva.ora';RECOVER TABLESPACE MVAUNTIL LOGSEQ 21AUXILIARY DESTINATION '/u01/tmp' ;}
04
—
可能会遇到的坑
run{SET AUXILIARY INSTANCE PARAMETER FILE TO '/home/oracle/tmp/mva.ora';RECOVER TABLESPACE PDBA:MVAUNTIL TIME "TO_DATE('03-AUG-28:10:19:19','YY-MON-DD:HH24:MI:SS')"AUXILIARY DESTINATION '/u01/tmp' ;}RECOVER TABLESPACE MVAUNTIL TIME "TO_DATE('03-AUG-28:10:19:19','YY-MON-DD:HH24:MI:SS')"AUXILIARY DESTINATION '/u01/tmp' ;Automatic instance removedRMAN-00571: ===========================================================RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============RMAN-00571: ===========================================================RMAN-03002: failure of recover command at 08/28/2023 11:45:52RMAN-20202: Tablespace not found in the recovery catalogRMAN-06019: could not translate tablespace name "SYSTEM"
日期格式错误,参见文档《RMAN-05015 RMAN-20202 & RMAN-06019 : Could Not Translate Tablespace Name "SYSTEM" (Doc ID 2952072.1)》要用2023,而不是23。
RECOVER TABLESPACE MVAUNTIL TIME "to_date('08/28/2023 15:11:49','MM/DD/YYYY HH24:MI:SS')"AUXILIARY DESTINATION '/u01/tmp' ;
经过测试的时间点粒度不能到具体的时间,只能恢复到logilfe。
注意until子句指定的log sequence号,但不包括这个log,具体参见官方文档database-backup-and-recovery-reference.pdf。
欢迎加我的微信,拉你进数据库微信群👇

推荐文章👇
托业890分的Oracle ACE为您翻译国际大佬的雄文(合集)




