灾备机房巡检,偶然发现EMC 存储两块盘亮黄灯,经过层层交流,确定是电子病历历史库,ip *.*.17.0
经过讨论,业务说偶尔登录上去查看一下历史数据
DBA登录系统查看 select status from v$instance; 为open状态
经过讨论,等业务确认是哪些表需要导出,等了一周左右没有捋清楚,又换一个方案,全库恢复到另外一个机器。
--------
环境检查
*.*.17.0:windows 2008 R2 32G内存 数据库文件分布 D盘,F盘 oracle 11.2.0.4
目标 *.*.10.14 windows 2008 R2 32G内存 仅有E盘,C盘 oracle 11.2.0.1
方案一 exp /expdp imp/impdp都可以 涉及版本,高版本可以导入到低版本,rman 无法实现
方案二 .*.17.0 rman 备份,异机恢复 .*.10.14( .*.10.14先升级到11.2.0.4)
备份脚本.
format 'E:\orabak\full_level0_%d_%T_%s_%p' database
sql 'alter system archive log current';
s ql 'alter system archive log current';
s ql 'alter system archive log current';
crosscheck archivelog all;
delete noprompt expired archivelog all;
delete noprompt obsolete;
delete noprompt expired backup;
}
二 备份+升级
执行备份开始
rman target /
.*.10.14开始升级
由于 .*.10.14是虚拟化平台的虚拟机,硬盘和内存,cpu都可以调整增加,升级前系统管理员说打一个快照
(快照是恢复windows所有数据,包含C,D,E盘等)
2.1 快照结束,大概10分钟
2.2 升级oracle
找到升级包
database
p13390677_112040_MSWIN-x86_1of7.zip
p13390677_112040_MSWIN-x86_2of7.zip
升级参照以下博客
yhttps://blog.csdn.net/bjywxc/article/details/103764077
其中,解压两个安装包后,忘了把 p13390677_112040_MSWIN-x86_2of7内容合到
安装过程中出现以下错误
解决:参照 https://blog.csdn.net/singit/article/details/70832723
注 linux 升级包解压,自动到一个文件,这个就是linux和windows的小区别
-----
三 oracle 异机恢复
升级完成....,验证原来数据,没有问题
设置* .*.17.0.备份目录的网络共享,在 *.*.10.14拷贝备份数据
恢复分三个步骤
1 恢复参数文件
2 回复控制文件 nomount阶段
3 恢复数据文件 mount阶段
3.1 rman 恢复参数文件没有直接从源库copy方便
* .*.17.0 . show parameter spfile,确定是spfile启动后
源库创建pfile文件
create pfile=‘D:\pfile1212.txt’ from spfile;
copy 到目标库 *.*.10.14,修改参数文件(内存大小,controlfile路径,归档路径,NLS_*, audit_file-dest等主要惨),启动
set ORACLE_SID=jhmr
sqlplus / as sysdba
报错:ORA-12560
无论怎么调试都不行,注册表修改ORACLE_SID 为jhmr,重启,关闭原来的实例都不行
请教两个高手朋友也么有办法,windows实在不友好,linux么有这个问题
灵机一动,dbca 新建一个库,就15分钟左右的事情,只用新建库的参数文件,修改一下
果然凑效,能到nomount
3.2 恢复控制文件也顺利
rman target /
set dbid=********( dbid 从源库查询的 desc v$database有dbid 列)
restore controlfile from 'E:\orabak\ctl_*******';
3.3 恢复数据文件
启动到mount阶段, 注册备份片
alter database mount;
catalog start with 'E:\orabak\';
恢复前 根据v$datafile ,v$tempfile,v$logfile;在目标系统创建对应目录,或者使用alter 命令修改为新位置
由于源库数据文件在D F盘,目标仅有E盘,而且数据文件99个,使用sql 批量修改
alter database rename file 'D:\ORAGLE\ORADATA\TEMPG1.DEF’ tO 'E:\ORADATA\TEMPB1.DEF'
....

select "alter database rename file '''||name||''' to '''||name''';',from v$datafile
-————————————————
spool /path/setnewnamedf.lst
select 'set newname for datafile ' || file# || ' to ''' ||replace( name,'/old/data/path','/new/data/path' ) || ''';' from v$datafile;
spool off
restore 恢复 经过一夜,早上上班过来一看,一堆报错,如下
幡然醒悟,可能是 * .*.17.0 .磁盘出现问题,数据库虽然可以打开,但是备份的文件在怀的磁盘上,rman备份也没有用户

冷静下来,想想方案出了问题


最终确定 exp或者expdp远程导出
目前在原服务器读没有问题,写入就不确定,只能远程exp/expdp 备份(rman不支持远程备份)
-----再次沟通,仅有一个用户数据导出就可以了
导出前查看用户所属表空间大小
①确认用户所属表空间
desc user_tables
select tablespace_name from user_tables
② 查看用户表空间总大小
select sum(bytes)/1024/1024 from dba_data_files where tablespace_name='AAAA'
第一次 exp 导出没有加任何参数花费20小时没有导出完成
65670 MB
选择空间
目标机器建立单独数据库实例,用户 ,表空间,设置修改redo 组大小 256MB
dbca 字符集和源库一样 查询源库字符集
修改exp参数
exp 加参数优化 direct=y recordlength=65535 buffer=65536
exp emr11/****@jhemaa170 file=emr111.dmp directory=y recordlength=65535 buffer=65536 owner=emr11
log=exp1218.log
--1个小时完成
导入
先导入表,再导入索引
imp emr11/**** file=emr111.dmp feedback=10000 commit=y buffer=4096000 ignore=y owner=emr11
rows=y indexes=n log=imp1218.log
imp emr11/**** file=emr111.dmp feedback=10000 commit=y buffer=4096000 ignore=y owner=emr11
rows=y indexes=n log=imp1218_2.log
大概1个半小时。