客户需要,将windows下10g(10.2.0.3)32位数据库迁移到11g64位。不过主要目的是为10g32位windows打补丁,怕出问题做的迁移。这里自己先做下测试。
参考文章:
测试环境:
Win server 2003 32位,先安装oracle10.2.0.1,然后升级到10.2.0.5(因为10.2.0.1不能升到11g,所以得升级到10.2.0.2以上),最后迁移到11.2.0.1(Win server 2008 64位)。
安装就不详述了。
1、升级数据库10.2.0.1到10.2.0.5
㈠升级前准备
打开命令行关闭EM:d:\> emctl stop dbconsole
关闭监听:d:\> lsnrctl stop
进入sql提示符关闭数据库:d:\> sqlplus / as sysdba
SQL> shutdown immediate
关闭服务:开始菜单》管理工具》服务,停止所有ORACLE开始的服务
备份:可直接复制或者压缩,包括Oracle Inventory、Oracle HOME和数据库
升级前检查:sql提示符下
SQL> spool d:\logs\utlu102i.log --保留日志信息,以便查看
SQL> @?/rdbms/admin/utlu102i.sql ---@?默认的ORACLE HOME目录
㈡升级
与安装基本一致,指定ORACLE HOME目录时,覆盖原来HOME即可,我的是:E:\oracle\product\10.2.0\db_1
开户OracleserviceSID服务
开启监听:d:\> lsnrctl start
升级数据字典:
SQL> startup upgrade
SQL> spool d:\logs\catupgrd.log
SQL> @?/rdbms/admin/catupgrd.sql
SQL> shutdown immediate
SQL> startup
SQL> spool d:\logs\utlrp.log
SQL> @?/rdbms/admin/utlrp.sql
㈢升级后检查
SQL> SELECT COMP_NAME, VERSION, STATUS FROM SYS.DBA_REGISTRY;
status输出都为VALID说明升级成功
设置compatible参数,不是必须的,重启后生效
SQL> alter system set compatible='10.2.0.5.0' scope=spfile;
使用catalog备份的可升级一下:
d:\> rman catalog username/passwd@alias
RMAN> upgrade catalog;
升级完成。
2、10.2.0.5(源库)的数据迁移到11.2.0.1(目标库)
因为是32位到64位,所以可分为四步:
㈠备份
备份前在源库执行一个脚本,否则在目标库recover后升级数据字典时报错
SQL> spool e:\logs\utlu112i.log
SQL> @?/rdbms/admin/utlu112i.sql ---此文件从目标库复制过来的,避免出问题也可以在完成升级后先进行备份
备份:
RMAN> run{
backup as compressed backupset database format 'e:\backup\%d_%s_%T.db';
sql 'alter system switch logfile';
backup archivelog all format 'e:\backup\%d_%s_%T.arch';
backup spfile format 'e:\backup\%d_%s_%T.sp';
backup current controlfile format 'e:\backup\%d_%s_%T.ctl';
}
SQL> create pfile='d:\backup\inittest.ora' from spfile; ---目标库上实例名为test,所以使用pfile并修改相关参数和目录(不使用restore spfile)
然后把备份文件上传到目标库服务器上。
查看源库DBID
SQL> select dbid from v$database;
DBID
---------------
274060241
㈡恢复
修改后的pfile文件
*.compatible='10.2.0.5.0'
*.control_files='d:\controlfile\control01.ctl'
*.db_block_size=8192
*.db_name='prod'
*.db_unique_name='test'
SQL> startup nomount pfile='d:\share\inittest.ora';
D:\>rman target /
连接到目标数据库: PROD (未装载) --因为没有Mount,不识别库,需要设置dbid
RMAN> set dbid=274060241
RMAN> restore controlfile from 'd:\share\prod_20_20141030.ctl'; --恢复控制文件
RMAN> mount database;
SQL> create spfile from pfile='d:\share\inittest.ora';--生成spfile,然后重启到mount状态
SQL> startup mount force;
RMAN> catalog start with 'd:\share'; ---源库的备份目录为d:\backup,restore时不识别此目录,可以catalog下,当然也可以使目录一致。
恢复,因为不完全恢复,可以设置恢复到某个日志号(从源库查看备份完成后的当前日志序列):
RMAN> run{
set newname for datafile 1 to 'd:\ORADATA\SYSTEM01.DBF'; --数据文件目录一致可以不用newname
set newname for datafile 2 to 'd:\ORADATA\UNDOTBS01.DBF';
set newname for datafile 3 to 'd:\ORADATA\SYSAUX01.DBF';
set newname for datafile 4 to 'd:\ORADATA\USERS01.DBF';
set newname for datafile 5 to 'd:\ORADATA\EXAMPLE01.DBF';
set until sequence 60;
restore database;
switch datafile all;
recover database;
}
目录一致可以不用如下操作,不一致需要rename下:
SQL> alter database rename file 'e:\onlinelog\prod\redo01.log' to 'd:\onlinelog\redo01.log';
SQL> alter database rename file 'e:\onlinelog\prod\redo02.log' to 'd:\onlinelog\redo02.log';
SQL> alter database rename file 'e:\onlinelog\prod\redo03.log' to 'd:\onlinelog\redo03.log';
以升级模式打开:
SQL> alter database open resetlogs upgrade;
添加临时表空间文件:
SQL> alter tablespace temp add tempfile 'd:\oradata\temp01.dbf' size 500m autoextend on next 50m;
SQL> select name from v$tempfile;
NAME
----------------------------------------------------------------------
E:\ORADATA\PROD\TEMP01.DBF
D:\ORADATA\TEMP01.DBF
目录不一致的要删除,因数据文件目录不一致所致,否则之后执行脚本会报错:
SQL> alter tablespace temp drop tempfile 'e:\oradata\prod\temp01.dbf';
㈢升级
下面脚本执行时间很长,一个小时:
SQL> spool d:\share\catupgrd.log
SQL> @?/rdbms/admin/catupgrd.sql
跑完库关闭了,要重新打开
修改一下compatible参数
SQL> alter system set compatible='11.2.0.1.0' scope=spfile;
如下脚本可选择执行:
SQL> spool d:\share\utlu112s.log
SQL> @?/rdbms/admin/utlu112s.sql
因需位数转换,可到最后再编译无效对象。
㈣64位的转换
SQL> shutdown immediate
SQL> startup migrate
SQL> spool d:\logs\utlirp.log
SQL> @?/rdbms/admin/utlirp.sql
最后重启数据库,重新编译无效对象
SQL> shutdown immediate
SQL> startup
SQL> spool d:\logs\utlrp.log SQL> @?/rdbms/admin/utlrp.sql
重启下,总体检查一下,主要查看是否还有无效对象。
select count(*) from dba_invalid_objects;