4.手工rman备份与恢复(不完全恢复)

源库在不停库的情况下备份(不完全恢复)

源:

rman>

backup as compressed backupset database format '/oradata/rman/wholem_%d_U';

backup archivelog all format '/oradata/rman/arch_%d_%U';

backup current controlfile format '/oradata/rman/ctl_%d_%U';

 

scp 传目标库中

目标库:启动nomount

scp 传目标库中

目标库操作:
rman>  restore controfile from '/oradata/rman/ctl_xxxxxxx';     --先恢复控制文件
rman>  sql 'alter database mount';

在restore database之前先看看源库的数据文件/临时文件 路径和目标库是否相同,如果不相同,需要用下面方法进行修改
set pagesize 200
set linesize 200
select 'SET NEWNAME FOR DATAFILE '|| file# ||' to ' ||''''|| name ||''''|| ';' from v$datafile;
select 'SET NEWNAME FOR tempfile '|| file# ||' to ' ||''''|| name ||''''|| ';' from v$tempfile;

run {
    allocate channel c1 type disk;
    allocate channel c2 type disk;
    allocate channel c3 type disk;
    allocate channel c4 type disk;
    SET NEWNAME FOR DATAFILE 1 to '/XXXX/racdb/system.260.1088939967';     ##这个后面加上目标库的数据文件目录
    SET NEWNAME FOR DATAFILE 3 to '/XXXXX/racdb/sysaux.259.1088939875';
    SET NEWNAME FOR DATAFILE 4 to '/XXXXX/racdb/undotbs1.262.1088940095';
    SET NEWNAME FOR DATAFILE 5 to '/XXXXX/racdb/pdbseed/system.268.1088940189';
    SET NEWNAME FOR DATAFILE 6 to '/oradata/racdb/users.261.1088940093';
    restore database;
    switch datafile all;
    swithc tempfile all;    
    release channel c1;
    release channel c2;
    release channel c3;
    release channel c4;    
}
恢复归档
查看归档进程号
list backupset of archivelog all;
......
1    80      2769330    2024-09-04 13:23:10 2769407    2024-09-04 13:23:27

run{
    set until  sequence 80 thread 1
    set until  sequence 80 thread 2   -- 如果是rac的话
    recover database;
}

alter database open resetlogs;     #不完全恢复

 

说明:1.在恢复数据库时要在目标库中建立和源库相同的目录(必须)

     2.查看数据文件所在的位置:select name from v$datafile;

     3.查看日志文件所在的位置:select member from v$logfile;

     4.查看临时文件所在的位置:select name from v$tempfile;

     5.查看控制文件所在的位置:show parameter control;

   6.查看参数文件所在的位置:show parameter spfile;

   

注册备份集到控制文件:

RMAN> alter database mount;
RMAN> CATALOG START WITH '/backup';

 补充:上面的不完全恢复是针对文件系统文件系统的不完全恢复且有限制

       要在目标库中建立和源库一模一样的(数据文件目录,控制文件目录,日志文件目录)

扩展:如果是asm文件呢?(比如说源库是rac--->目标库file 或者 源库是文件系统---->目标库是rac),这里就会涉及到asm文件系统,这时我们可以在restore之前可以执行修改数据文件和临时文件路径的命令:

set pagesize 200
set linesize 200
select 'SET NEWNAME FOR DATAFILE '|| file# ||' to ' ||''''|| name ||''''|| ';' from v$datafile;
select 'SET NEWNAME FOR tempfile '|| file# ||' to ' ||''''|| name ||''''|| ';' from v$tempfile;

再用命令:

复制代码
run {
    allocate channel c1 type disk;
    allocate channel c2 type disk;
    allocate channel c3 type disk;
    allocate channel c4 type disk;
    SET NEWNAME FOR DATAFILE 1 to '/XXXX/racdb/system.260.1088939967';     ##这个后面加上目标库的数据文件目录
    SET NEWNAME FOR DATAFILE 3 to '/XXXXX/racdb/sysaux.259.1088939875';
    SET NEWNAME FOR DATAFILE 4 to '/XXXXX/racdb/undotbs1.262.1088940095';
    SET NEWNAME FOR DATAFILE 5 to '/XXXXX/racdb/pdbseed/system.268.1088940189';
    SET NEWNAME FOR DATAFILE 6 to '/oradata/racdb/users.261.1088940093';
    restore database;
    switch datafile all;
    swithc tempfile all;    
    release channel c1;
    release channel c2;
    release channel c3;
    release channel c4;    
}
复制代码

switch 的作用就是修改控制文件关于数据文件和临时文件的路径

执行完了之后:recover database

最后还要重建控制文件,因为如果是asm的话,日志文件目录没法在目标库(文件系统中创建),因此需要手工创建控制文件,修改里面的redo log所在的目录

alter database backup controlfile to trace as '/tmp/cro.bak'

修改完了之后再alter database open resetlogs; 

再补充

  在补充这一节中,我们说如果源库和目标库是不一样的存储结构,可以用set newname for datafile xx to 'xxx' 和switch datafile all命令,将一个个数据文件存储到新的路径中(手工),但是说如果oracle数据库数据文件太多,手工一个个的转换实在太傻了,这里我们可以通过一下伪shell脚本进行转换:

复制代码
sqlplus / as sysdba <<EOF>/dev/null
set linesize 200
col name for a80
set head off 
set pages 0
spool 2.txt
select 'AUTO/'|| file#||'/',name from v\$datafile;
spool off
exit
EOF

run {
    allocate channel c1 type disk;
    allocate channel c2 type disk;
    allocate channel c3 type disk;
    allocate channel c4 type disk;
    grep '^AUTO' 2.txt |sed 's/ //g'|awk -F "/" '{print "set newname for datafile "$2,"to '\'''/oracle/datafile/'"$2"_"$NF"'\'';"}'
    resotre database;
    swithc datafile all;
    restore database;
    switch datafile all;   
    release channel c1;
    release channel c2;
    release channel c3;
    release channel c4;    
}
复制代码

   注意:grep 这一行,这一行就是将源库的数据文件转移到指定的目录下

   如果是临时文件和redo文件要转换目录的话,可以使用alter database rename file 'xxxx'  to 'xxxx'; 转换文件路径!!!

posted on   太白金星有点烦  阅读(58)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下

导航

< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5
点击右上角即可分享
微信分享提示