RMAN不完全恢复

RMAN不完全恢复

1 概念

RMAN不完全恢复的三个标准模式:

  • 基于time
  • 基于scn
  • 基于sequence

与手工不完全恢复相比原理类似,语法稍有不同:

1.1 备份数据库

清理表空间、旧的备份、进行一次全备

@/u01/backup/rman/hot.sql

run{
allocate channel c1 device type disk;
allocate channel c2 device type disk;
backup database format '/u01/backup/rman/db_%d_%T_%U.bak' plus archivelog format '/u01/backup/rman/ar_%d_%T_%U.bak';
backup current controlfile format '/u01/backup/rman/ctl_%d_%T_%U.bak';
release channel c1;
release channel c2;
}

1.2 配置环境变量NLS_DATE_FORMAT

vi .bash_profile

写入:

export NLS_DATE_FORMAT='yyyy-mm-dd hh24:mi:ss'

使其生效

source .bash_profile

 

2 【实战案例1】恢复spfilecontrolfile

2.1 环境准备:修改环境变量

有一套全备份,controlfile AUTOBACKUP设为on

CONFIGURE CONTROLFILE AUTOBACKUP ON;

控制文件自动备份,备份目的地是fast_recovery_area

report need backup;

2.2 关闭数据库,删参数文件

shutdown abort;

cd $ORACLE_HOME/dbs
rm spfileorcl.ora

startup

2.3 RMAN启动到nomount

startup nomount;

2.4 从自动备份转储spfile

查看快速恢复区中自动备份

restore spfile from '/u01/flash_recovery_area/ORCL/autobackup/2021_07_07/o1_mf_s_1077278436_jgb9q4z7_.bkp';

cd $ORACLE_HOME/dbs/
ll

查看在$ORACLE_HOME/dbs/目录下已经产生spfileorcl.ora文件,证明spfile恢复完成

起库

startup force;

2.5 恢复控制文件

shutdown abort;
rm /u01/app/oracle/oradata/ORCL/control*.ctl
ll /u01/app/oracle/oradata/ORCL/

startup

restore controlfile from '/u01/flash_recovery_area/ORCL/autobackup/2021_07_07/o1_mf_s_1077278436_jgb9q4z7_.bkp';

alter database mount;
recover database;
alter database open resetlogs;

 

3 【实战案例2】恢复过去某个时间点误操作(基于timescn)

3.1 环境准备:建表,插入数据

create table scott.t3(id number);
insert into scott.t3 values(99);
insert into scott.t3 values(999);
insert into scott.t3 values(9999);
commit;
select * from scott.t3;

3.2 查看故障前的时间

select current_scn,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from v$database;

SCN:2906423

时间:2021-07-07 17:02:05

3.3 模拟误操作truncate

truncate table scott.t3;

3.4 RMAN基于时间点做不完全恢复

run{
startup force mount;
allocate channel c1 type disk;
allocate channel c2 type disk;
set until time "to_date('2021-07-07 17:02:05','yyyy-mm-dd hh24:mi:ss')";
restore database;
recover database;
alter database open resetlogs;
}

 

3.5 验证

select * from scott.t3;

基于scn的方法与基于time相似,语法是set until scn 876383;

基于日志的方法类似手工恢复的例子,语法是set until sequence 3;

 

4 【实战案例3】RMAN恢复误删除表空间

  本例要做的是drop tablespace test,然后再通过不完全恢复,使数据库在drop表空间前的那一刻打开,从而恢复testtbs表空间及t2表的内容。当前控制文件里没有testtbs表空间的记录,需要通过备份的控制文件进行恢复

4.1 准备工作:创建表空间、创建表、插入数据

create tablespace t_tbs datafile '/u01/app/oracle/oradata/ORCL/t_tbs01.dbf' size 5m;
create table scott.t4(id number) tablespace t_tbs;
insert into scott.t4 values(10);
insert into scott.t4 values(20);
commit;
select * from scott.t4;

4.2 打开告警日志

查看drop tablespace的告警信息,然后记下时间点

tail -f /u01/app/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log

4.3 模拟误删除t_tbs表空间

drop tablespace t_tbs including contents and datafiles;

 

4.4 查看告警有关信息

记录下误删除之前时间,是until time的时刻      2021-07-07 17:33:24

4.5 查看DBID

从自动备份转储控制文件需set DBID

connected to target database: ORCL (DBID=1597307870)

4.6 使用旧的控制文件做不完全恢复

run{
startup force nomount;
set dbid=1597307870;
restore controlfile from autobackup until time "to_date('2021-07-07 17:33:24','yyyy-mm-dd hh24:mi:ss')";
alter database mount;
restore database;
recover database until time "to_date('2021-07-07 17:33:24','yyyy-mm-dd hh24:mi:ss')";
alter database open resetlogs;
}

4.7 验证

select * from scott.t4;

要点:

① 不使用当前的控制文件恢复误删除的表空间,因为当前控制文件已经没有该表空间的记录了

② DBIDRMAN识别数据库的身份证,保存在控制文件中,set dbid=对于控制文件自动恢复(from autobackup)是必要的;

 

5 【实战案例4】表空间时间点恢复(TSPITR

  作为一条基本原则,不完全恢复必须应用到整个数据库,即必须还原整个数据库并运用日志一起向前滚动

  TSPITR是一种对个别表空间执行不完全恢复的技术,一般是针对用户错误的删除(或截断)了表。TSPITR 的最大好处是不需要生产库停机

前提是:

① 有一套全库备份,因为TSPITR这个过程除了复制需要恢复的表空间外,也必须复制system,sysauxundo表空间(考点)

② 本例设置了控制文件自动备份RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;

【官方文档】

  Backup and Recovery User's Guide ---> 21 Performing RMAN Tablespace Point-in-Time Recovery (TSPITR) ---> Performing Fully Automated RMAN TSPITR

5.1 环境准备:创建表空间、表

create tablespace test_tbs datafile '/u01/app/oracle/oradata/ORCL/test_tbs01.dbf' size 10m;
create table scott.emp1 tablespace test_tbs as select * from scott.emp;
select table_name,tablespace_name from dba_tables where table_name='EMP1';
select * from scott.emp1;

5.2 RMAN备份

@/u01/backup/rman/hot.sql

做全备

5.3 取当前时间(误操作前)

select current_scn,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from v$database;

SCN:2913007

时间:2021-07-07 18:06:37

5.4 模拟误删除表

drop table scott.emp1 purge;

5.5 模拟误删除后 表空间上继续做其他业务操作

create table scott.dept1 tablespace test_tbs as select * from scott.dept;
select table_name,tablespace_name from dba_tables where table_name='DEPT1';
select * from scott.dept1;

5.6 检查自包含

exec DBMS_TTS.TRANSPORT_SET_CHECK('TEST_TBS',TRUE,TRUE);
SELECT * FROM TRANSPORT_SET_VIOLATIONS;

如果此表空间上有索引,指向其他表空间上的表,则不满足自包含

5.7 查看TSPTR后丢失对象

故障前的正常SCN为 2913007     

正常时间为 2021-07-07 18:06:37

col owner for a15
col name for a15
col tablespace_name for a20
SELECT OWNER,NAME,TABLESPACE_NAME,TO_CHAR(CREATION_TIME, 'yyyy-mm-dd hh24:mi:ss')
FROM TS_PITR_OBJECTS_TO_BE_DROPPED
WHERE TABLESPACE_NAME ='TEST_TBS' AND CREATION_TIME > TO_DATE('2021-07-07 18:06:37','yyyy-mm-dd hh24:mi:ss')
ORDER BY TABLESPACE_NAME, CREATION_TIME;

既可以使用时间来查也可以通过SCN号来查

SELECT OWNER,NAME,TABLESPACE_NAME,TO_CHAR(CREATION_TIME,'YYYY-MM-DD:HH24:MI:SS')
FROM TS_PITR_OBJECTS_TO_BE_DROPPED
WHERE TABLESPACE_NAME ='TEST_TBS'AND CREATION_TIME > TO_DATE(TO_CHAR(SCN_TO_TIMESTAMP(2903117),'MM/DD/YYYY HH24:MI:SS'),'MM/DD/YYYY HH24:MI:SS')
ORDER BY TABLESPACE_NAME, CREATION_TIME;

5.8 导出对象

创建导出文件夹

mkdir /u01/dir

create directory dir as '/u01/dir';
grant read,write on directory dir to public;

导出dept1表对象

cd /u01/dir/
expdp scott/tiger directory=dir dumpfile=dept1.dmp tables=dept1

5.9 建立目录指定辅助库目标

mkdir /u01/auxdest

5.10 RMAN TSPITR并指定辅助库目的地

建议使用CRT log session方便查看过程

recover tablespace test_tbs until scn 2913007 auxiliary destination '/u01/auxdest';

输出内容较长,如下:

RMAN> recover tablespace test_tbs until scn 2913007 auxiliary destination '/u01/auxdest';

Starting recover at 2021-07-07 18:26:19
current log archived
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=254 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 UNDOTBS1

Creating automatic instance, with SID='ojjb'

initialization parameters used for automatic instance:
db_name=ORCL
db_unique_name=ojjb_pitr_ORCL
compatible=19.0.0
db_block_size=8192
db_files=200
diagnostic_dest=/u01/app/oracle
_system_trig_enabled=FALSE
sga_target=1584M
processes=200
db_create_file_dest=/u01/auxdest
log_archive_dest_1='location=/u01/auxdest'
#No auxiliary parameter file used


starting up automatic instance ORCL

Oracle instance started

Total System Global Area    1660940992 bytes

Fixed Size                     8897216 bytes
Variable Size                402653184 bytes
Database Buffers            1241513984 bytes
Redo Buffers                   7876608 bytes
Automatic instance created
Running TRANSPORT_SET_CHECK on recovery set tablespaces
TRANSPORT_SET_CHECK completed successfully

contents of Memory Script:
{
# set requested point in time
set until  scn 2913007;
# 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;';
}
executing Memory Script

executing command: SET until clause

Starting restore at 2021-07-07 18:27:29
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=4 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 /u01/flash_recovery_area/ORCL/autobackup/2021_07_07/o1_mf_s_1077300341_jgbz3og0_.bkp
channel ORA_AUX_DISK_1: piece handle=/u01/flash_recovery_area/ORCL/autobackup/2021_07_07/o1_mf_s_1077300341_jgbz3og0_.bkp tag=TAG20210707T180541
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/auxdest/ORCL/controlfile/o1_mf_jgc0dm8d_.ctl
Finished restore at 2021-07-07 18:27:32

sql statement: alter database mount clone database

sql statement: alter system archive log current

sql statement: begin dbms_backup_restore.AutoBackupFlag(FALSE); end;

contents of Memory Script:
{
# set requested point in time
set until  scn 2913007;
plsql <<<--
declare
  sqlstatement       varchar2(512);
  pdbname            varchar2(128);
  offline_not_needed exception;
  pragma exception_init(offline_not_needed, -01539);
begin
   pdbname := null; -- pdbname
  sqlstatement := 'alter tablespace '||  'TEST_TBS' ||' offline immediate';
  krmicd.writeMsg(6162, sqlstatement);
  krmicd.execSql(sqlstatement, 0, pdbname);
exception
  when offline_not_needed then
    null;
end; >>>;
# set destinations for recovery set and auxiliary set datafiles
set newname for clone datafile  1 to new;
set newname for clone datafile  4 to new;
set newname for clone datafile  3 to new;
set newname for clone tempfile  1 to new;
set newname for datafile  2 to 
 "/u01/app/oracle/oradata/ORCL/test_tbs01.dbf";
# switch all tempfiles
switch clone tempfile all;
# restore the tablespaces in the recovery set and the auxiliary set
restore clone datafile  1, 4, 3, 2;
 
switch clone datafile all;
}
executing Memory Script

executing command: SET until clause

sql statement: alter tablespace TEST_TBS offline immediate

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/auxdest/ORCL/datafile/o1_mf_temp_%u_.tmp in control file

Starting restore at 2021-07-07 18:27:41
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/auxdest/ORCL/datafile/o1_mf_system_%u_.dbf
channel ORA_AUX_DISK_1: restoring datafile 00002 to /u01/app/oracle/oradata/ORCL/test_tbs01.dbf
channel ORA_AUX_DISK_1: reading from backup piece /u01/backup/rman/db_ORCL_20210707_1q03cj2o_1_1.bak
channel ORA_AUX_DISK_1: piece handle=/u01/backup/rman/db_ORCL_20210707_1q03cj2o_1_1.bak tag=TAG20210707T180512
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 00004 to /u01/auxdest/ORCL/datafile/o1_mf_undotbs1_%u_.dbf
channel ORA_AUX_DISK_1: restoring datafile 00003 to /u01/auxdest/ORCL/datafile/o1_mf_sysaux_%u_.dbf
channel ORA_AUX_DISK_1: reading from backup piece /u01/backup/rman/db_ORCL_20210707_1r03cj2o_1_1.bak
channel ORA_AUX_DISK_1: piece handle=/u01/backup/rman/db_ORCL_20210707_1r03cj2o_1_1.bak tag=TAG20210707T180512
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:15
Finished restore at 2021-07-07 18:28:23

datafile 1 switched to datafile copy
input datafile copy RECID=8 STAMP=1077301704 file name=/u01/auxdest/ORCL/datafile/o1_mf_system_jgc0dzbb_.dbf
datafile 4 switched to datafile copy
input datafile copy RECID=9 STAMP=1077301704 file name=/u01/auxdest/ORCL/datafile/o1_mf_undotbs1_jgc0frcw_.dbf
datafile 3 switched to datafile copy
input datafile copy RECID=10 STAMP=1077301704 file name=/u01/auxdest/ORCL/datafile/o1_mf_sysaux_jgc0frbj_.dbf

contents of Memory Script:
{
# set requested point in time
set until  scn 2913007;
# online the datafiles restored or switched
sql clone "alter database datafile  1 online";
sql clone "alter database datafile  4 online";
sql clone "alter database datafile  3 online";
sql clone "alter database datafile  2 online";
# recover and open resetlogs
recover clone database tablespace  "TEST_TBS", "SYSTEM", "UNDOTBS1", "SYSAUX" delete archivelog;
alter clone database open resetlogs;
}
executing Memory Script

executing command: SET until clause

sql statement: alter database datafile  1 online

sql statement: alter database datafile  4 online

sql statement: alter database datafile  3 online

sql statement: alter database datafile  2 online

Starting recover at 2021-07-07 18:28:26
using channel ORA_AUX_DISK_1

starting media recovery

archived log for thread 1 with sequence 2 is already on disk as file /u01/arch/arch_ORCL_1_2_1077299060.dbf
archived log for thread 1 with sequence 3 is already on disk as file /u01/arch/arch_ORCL_1_3_1077299060.dbf
archived log file name=/u01/arch/arch_ORCL_1_2_1077299060.dbf thread=1 sequence=2
archived log file name=/u01/arch/arch_ORCL_1_3_1077299060.dbf thread=1 sequence=3
media recovery complete, elapsed time: 00:00:04
Finished recover at 2021-07-07 18:28:36

database opened

contents of Memory Script:
{
# make read only the tablespace that will be exported
sql clone 'alter tablespace  TEST_TBS read only';
# create directory for datapump import
sql "create or replace directory TSPITR_DIROBJ_DPDIR as ''
/u01/auxdest''";
# create directory for datapump export
sql clone "create or replace directory TSPITR_DIROBJ_DPDIR as ''
/u01/auxdest''";
}
executing Memory Script

sql statement: alter tablespace  TEST_TBS read only

sql statement: create or replace directory TSPITR_DIROBJ_DPDIR as ''/u01/auxdest''

sql statement: create or replace directory TSPITR_DIROBJ_DPDIR as ''/u01/auxdest''

Performing export of metadata...
   EXPDP> Starting "SYS"."TSPITR_EXP_ojjb_grAD":  
   EXPDP> Processing object type TRANSPORTABLE_EXPORT/STATISTICS/TABLE_STATISTICS
   EXPDP> Processing object type TRANSPORTABLE_EXPORT/STATISTICS/MARKER
   EXPDP> Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK
   EXPDP> Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
   EXPDP> Processing object type TRANSPORTABLE_EXPORT/TABLE
   EXPDP> Master table "SYS"."TSPITR_EXP_ojjb_grAD" successfully loaded/unloaded
   EXPDP> ******************************************************************************
   EXPDP> Dump file set for SYS.TSPITR_EXP_ojjb_grAD is:
   EXPDP>   /u01/auxdest/tspitr_ojjb_86879.dmp
   EXPDP> ******************************************************************************
   EXPDP> Datafiles required for transportable tablespace TEST_TBS:
   EXPDP>   /u01/app/oracle/oradata/ORCL/test_tbs01.dbf
   EXPDP> Job "SYS"."TSPITR_EXP_ojjb_grAD" successfully completed at Wed Jul 7 18:30:49 2021 elapsed 0 00:00:44
Export completed


contents of Memory Script:
{
# shutdown clone before import
shutdown clone abort
# drop target tablespaces before importing them back
sql 'drop tablespace  TEST_TBS including contents keep datafiles cascade constraints';
}
executing Memory Script

Oracle instance shut down

sql statement: drop tablespace  TEST_TBS including contents keep datafiles cascade constraints

Performing import of metadata...
   IMPDP> Master table "SYS"."TSPITR_IMP_ojjb_ixfr" successfully loaded/unloaded
   IMPDP> Starting "SYS"."TSPITR_IMP_ojjb_ixfr":  
   IMPDP> Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK
   IMPDP> Processing object type TRANSPORTABLE_EXPORT/TABLE
   IMPDP> Processing object type TRANSPORTABLE_EXPORT/STATISTICS/TABLE_STATISTICS
   IMPDP> Processing object type TRANSPORTABLE_EXPORT/STATISTICS/MARKER
   IMPDP> Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
   IMPDP> Job "SYS"."TSPITR_IMP_ojjb_ixfr" successfully completed at Wed Jul 7 18:31:41 2021 elapsed 0 00:00:40
Import completed


contents of Memory Script:
{
# make read write and offline the imported tablespaces
sql 'alter tablespace  TEST_TBS read write';
sql 'alter tablespace  TEST_TBS offline';
# enable autobackups after TSPITR is finished
sql 'begin dbms_backup_restore.AutoBackupFlag(TRUE); end;';
}
executing Memory Script

sql statement: alter tablespace  TEST_TBS read write

sql statement: alter tablespace  TEST_TBS offline

sql statement: begin dbms_backup_restore.AutoBackupFlag(TRUE); end;

Removing automatic instance
Automatic instance removed
auxiliary instance file /u01/auxdest/ORCL/datafile/o1_mf_temp_jgc0hhf4_.tmp deleted
auxiliary instance file /u01/auxdest/ORCL/onlinelog/o1_mf_3_jgc0gqxb_.log deleted
auxiliary instance file /u01/auxdest/ORCL/onlinelog/o1_mf_2_jgc0gnmp_.log deleted
auxiliary instance file /u01/auxdest/ORCL/onlinelog/o1_mf_1_jgc0gnlq_.log deleted
auxiliary instance file /u01/auxdest/ORCL/datafile/o1_mf_sysaux_jgc0frbj_.dbf deleted
auxiliary instance file /u01/auxdest/ORCL/datafile/o1_mf_undotbs1_jgc0frcw_.dbf deleted
auxiliary instance file /u01/auxdest/ORCL/datafile/o1_mf_system_jgc0dzbb_.dbf deleted
auxiliary instance file /u01/auxdest/ORCL/controlfile/o1_mf_jgc0dm8d_.ctl deleted
auxiliary instance file tspitr_ojjb_86879.dmp deleted
Finished recover at 2021-07-07 18:31:53

RMAN> 
output

5.11 验证

select tablespace_name,status from dba_tablespaces;

alter tablespace test_tbs online;

select owner,table_name from dba_tables where tablespace_name='test_tbs';

select * from scott.emp1;

5.12 导入丢失对象

cd /u01/dir/
impdp scott/tiger directory=dir dumpfile=dept1.dmp

select owner,table_name from dba_tables where tablespace_name='test_tbs';
select * from scott.dept1;

5.13 相关知识点

1TSPITR是保持在线业务下表空间级的不完全恢复,恢复的表空间要自包含。使用TS_PITR_CHECK视图查看自包含信息

2TSPITR一般用于将已有的表空间恢复到过去的某个时间点,而11gR2版使用可传输表空间和数据泵技术,Oracle声明可以恢复被删除的表空间

3) 通过TS_PITR_OBJECTS_TO_BE_DROPPED视图,查看creation time字段可以知道截止恢复时间之后的有哪些新建对象可能丢失了

4) 完成指定表空间的TSPITR后,这个表空间之前做的备份就不能再用于以后的TSPITR。这就是在TSPITR之后要重新备份表空间的原因

posted @ 2021-07-07 18:40  chchcharlie、  阅读(521)  评论(0编辑  收藏  举报