前提条件:两台机器数据库版本相同,备份路径相同,文件路径相同。目标库可以将数据文件,控制文件,闪回区,参数文件等清空,以方便后期恢复。(不删除也行,我习惯的是删除)

ps:注意目录权限

第一步:rman整库备份

run {
allocate channel ch1  type disk;
allocate channel ch2  type disk;
sql 'alter system archive log current';
backup as compressed backupset database format '/u01/rmanbak/testdb_%T_%U';
sql 'alter system archive log current';
backup as compressed backupset archivelog all format '/u01/rmanbak/testarc_%T_%U';
backup current controlfile format '/u01/rmanbak/testcon_%T_%U';
backup spfile format '/u01/rmanbak/%d.%s.%p.%T.SPFILE';
crosscheck backup;
delete noprompt expired backup;
release channel ch1;
release channel ch2;
}

第二步:在目标库建立相同的备份路劲,将源库备份scp传到目标库相同的路径下

第三步:在目标库上,还原spfile文件:

rman target /

startup nomount;     --这里会报错,主要是没有静态参数文件,可以先忽略

 restore spfile from'/u01/rmanbak/ORCL.106.1.20210716.SPFILE';

动态参数文件spfile恢复完成

第四步:利用spfile生成pfile,然后编辑pfile修改对应路径:

sqlplus / as sysdba

create pfile from spfile;

exit;

vi  $ORACLE_HOME/dbs/initorcl.ora

由于闪回区被我们清空了,所以pfile中的这一段要删除,否则会报错 。其他路径与目标库路径相同即可。

sqlplus  / as sysdba

shutdown immediate    --先关闭数据库,否则rman会进入DUMMY模式

create spifle from pfile='$ORACLE_HOME/dbs/initorcl.ora';    --利用修改过的pfile重新生成spfile

startup nomount;

第五步:还原控制文件

rman target  /

restore controlfile from'/u01/rmanbak/testcon_20210716_39043ija_1_1';

alter database mount;

 

检查并标记控制文件中存在,但是实际已经不存在的备份文件。

RMAN>crosscheck backup;

清理控制文件中存在,但是实际已经不存在的备份文件。

RMAN>delete noprompt expired backup;

将备份注册到rman

catalog backuppiece'/u01/rmanbak/testarc_20210716_36043ij8_1_1'

catalog backuppiece'/u01/rmanbak/testarc_20210716_37043ij8_1_1'

catalog backuppiece'/u01/rmanbak/testarc_20210716_38043ij9_1_1'
catalog backuppiece'/u01/rmanbak/testcon_20210716_39043ija_1_1'
catalog backuppiece'/u01/rmanbak/testdb_20210716_32043ii2_1_1'
catalog backuppiece'/u01/rmanbak/testdb_20210716_33043ii2_1_1'
catalog backuppiece'/u01/rmanbak/testdb_20210716_34043ij5_1_1'
catalog backuppiece'/u01/rmanbak/testdb_20210716_35043ij5_1_1'

确定需要恢复的Seq号:

RMAN> list backup of archivelog all;

 

第六步:根据备份信息,恢复数据文件及数据库

run {

set until sequence 50 thread 1;                                                                                                     

restore database;

switch datafile all;

recover database;

}

 一般是恢复到seq号最大的位置,如果数据文件路径改变需要重新定义文件路径

report schema;  --查询数据文件号

SET NEWNAME FOR DATAFILE 1 to 'xxxxxxxxxxxxxxxxxxx';

恢复完成

最后alter database open resetlogs; 

数据库成功打开

搞定,下课

ps:如果数据库前后版本不一致的,需要重新编译一下无效对象

SQL> startup upgrade

SQL>@?/rdbms/admin/catupgrd.sql

---Creates data dictionary views.重新编译一下一些无效的对象
SQL>@?/rdbms/admin/utlrp.sql

SQL>shutdown immediate
SQL>startup

 


 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐