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
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'; 转换文件路径!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下