完成了以上工作后,可以关闭数据库,再次启动数据库到Mount状态,这时候新的控制文件已经发挥作用:
SQL> shutdown immediate;
ORA-01109: ??????
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 943718400 bytes
Fixed Size 1293960 bytes
Variable Size 239075704 bytes
Database Buffers 700448768 bytes
Redo Buffers 2899968 bytes
数据库装载完毕。
8. 完成数据库恢复
接下来再参考一下transport.sql中的推荐步骤:
ALTER DATABASE OPEN RESETLOGS;
-- Commands to add tempfiles to temporary tablespaces.
-- Online tempfiles have complete space information.
-- Other tempfiles may require adjustment.
ALTER TABLESPACE TEMP ADD TEMPFILE
SIZE 20971520 AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;
-- End of tempfile additions.
现在我们需要通过RESETLOGS方式来重新生成日志文件,然后手工添加临时文件。
注意,在迁移过程中如果两个平台的数据库版本完全一致,则以上步骤可以顺利执行,参考transport.sql可以顺利完成迁移。而本例的测试平台由于Linux平台的数据库版本为10.2.0.1,Windows平台版本为10.2.0.3,所以实际操作中还会有所不同,在执行RESETLOGS过程中,数据库会发生中断:
SQL> alter database open resetlogs;
alter database open resetlogs
*
第 1 行出现错误:
ORA-01092: ORACLE 实例终止。强制断开连接
检查日志我们发现以下提示:
Mon Jun 25 10:03:19 2007
Errors in file c:\oracle\admin\julia\udump\julia_ora_3596.trc:
ORA-00704: 引导程序进程失败
ORA-39700: 必须用 UPGRADE 选项打开数据库
Oracle要求以UPGRADE选项打开数据库,对数据库执行跨版本迁移。
我们继续参考transport.sql的最后部分:
SHUTDOWN IMMEDIATE
STARTUP UPGRADE PFILE='/opt/oracle/product/10.2.0/dbs/init_00il1i4r_1_0.ora'
@@ ?/rdbms/admin/utlirp.sql
SHUTDOWN IMMEDIATE
STARTUP PFILE='/opt/oracle/product/10.2.0/dbs/init_00il1i4r_1_0.ora'
-- The following step will recompile all PL/SQL modules.
-- It may take serveral hours to complete.
@@ ?/rdbms/admin/utlrp.sql
set feedback 6;
再次启动数据库到UPGRADE模式,由于之前的数据库中断,现在这些需要进行一点恢复工作:
SQL> startup upgrade;
ORACLE 例程已经启动。
Total System Global Area 943718400 bytes
Fixed Size 1293960 bytes
Variable Size 239075704 bytes
Database Buffers 700448768 bytes
Redo Buffers 2899968 bytes
数据库装载完毕。
ORA-01113: 文件 1 需要介质恢复
ORA-01110: 数据文件 1:'C:\ORACLE\ORADATA\JULIA\DATAFILE\O1_MF_SYSTEM_37TC1XNS_.DBF'
SQL> recover database;
完成介质恢复。
恢复完成之后启动数据库到UPGRADE模式:
SQL> shutdown immediate;
ORA-01109: 数据库未打开
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup upgrade;
ORACLE 例程已经启动。
Total System Global Area 943718400 bytes
Fixed Size 1293960 bytes
Variable Size 239075704 bytes
Database Buffers 700448768 bytes
Redo Buffers 2899968 bytes
数据库装载完毕。
数据库已经打开。
执行脚本?/rdbms/admin/utlirp.sql,这个脚本执行完成之后会有如下提示:
DOC>#######################################################################
DOC> utlirp.sql completed successfully. All PL/SQL objects in the
DOC> database have been invalidated.
DOC>
DOC> Shut down and restart the database in normal mode and run utlrp.sql to
DOC> recompile invalid objects.
DOC>#######################################################################
也就是说,这个脚本的作用是使数据库中的PL/SQL对象INVALID,然后通过utlrp.sql的重新编译,消除跨平台的兼容性影响。
按照transport.sql脚本提示的步骤,我们可以重新启动数据库来执行utlrp.sql脚本(由于本例涉及到版本迁移,需要再次启动数据库到upgrade模式,如果数据库版本相同,则可以直接启动数据库,执行utlrp.sql脚本完成最后的编译工作):
SQL> @@ ?/rdbms/admin/utlrp.sql
TIMESTAMP
-------------------------------------------------------------------------------
COMP_TIMESTAMP UTLRP_BGN 2007-06-25 10:27:57
............
PL/SQL 过程已成功完成。
TIMESTAMP
-------------------------------------------------------------------------------
COMP_TIMESTAMP UTLRP_END 2007-06-25 10:39:43
PL/SQL 过程已成功完成。
utlrp.sql执行完成之后我们需要再执行和数据库升级相关的脚本,这个脚本是catupgrd.sql:
SQL> @?/rdbms/admin/catupgrd.sql
这个脚本调用catlog.sql和 catproc.sql来重建字典对象等,在执行完这个脚本之后,我们可以关闭数据库后,正常打开数据库:
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 943718400 bytes
Fixed Size 1293960 bytes
Variable Size 239075704 bytes
Database Buffers 700448768 bytes
Redo Buffers 2899968 bytes
数据库装载完毕。
数据库已经打开。
SQL> select count(*) from dba_objects where status='INVALID';
COUNT(*)
----------
86
已选择 1 行。
SQL> @?\rdbms\admin\utlrp.sql
catupgrd.sql脚本可能会使部分字典对象失效,我们可以再次运行utlrp.sql脚本来进行编译,编译完成后,不要忘记为数据库添加临时文件:
SQL> ALTER TABLESPACE TEMP ADD TEMPFILE
2 SIZE 20971520 AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;
表空间已更改。
至此同字节序的跨平台迁移全部完成,当然由于版本的不同,整个过程稍微复杂了一些,不过这个过程对于跨平台的迁移及版本升级是一个很好的参考。
| 广告合作:400-664-0084 全国热线:400-664-0084 Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号 珠峰网 版权所有 All Rights Reserved
|