五、数据库升级的各种方法讨论 实现数据库升级可以选择多种方法,一般有:数据库升级助手(database upgrade assistant),手工的脚本升级,exp/imp(exdmp/imdmp)工具,表空间传输特性(transportable tablespace),table copy,实体化视图(material ized view)等技术,在升级前,首先确定升级路径,根据具体情况选择合适的升级方法,对升级过程的各个阶段进行测试。本文以军卫一号医院信息系统为例,涉及的数据库版本主要有oracle8i,oracle9i,oracle10gr2,操作系统平台主要有windows2000,oracle unbreakable linux as 4等,主要实现oracle8i,oracle9i向oracle10gr2的升级过程,oracle8i,oracle9i运行在windows2000上,oracle10gr2主要运行在windows2000,oracle unbreakable linux as 4两种平台,我使用以上各种方法对各种升级过程都做了测试。以下详细介绍这些方法的升级过程。
1、手工脚本升级 手工脚本升级在命令行运行一些sql脚本和工具,手工升级对升级过程提供了更多的控制,但是如果没有遵循严格的升级步骤,在升级过程中容易出错,它与dbua一样只能在相同的操作系统平台间跨数据库版本升级,对于不同的os平台不能使用,而且升级需要遵循严格的升级路径。
本测试从oracle9.2.0.1升级到oracle10.2.0.3,由于oracle9.2.0.1不能直接升级到oracle10.2.0.3,首先对oracle9.2.0.1安装补丁(补丁号p3095277_9204_WINNT)升级到oracle9.2.0.4,然后oracle9.2.0.4再升级到oracle10.2.0.3。以下是升级的测试过程:
1.安装oracle 10g r2的软件。
2.打oracle 10g最新的补丁,我打的是升级到10.2.0.2(补丁号p4547817_10202_WINNT)和10.2.0.3(补丁号p5948242_10203_WINNT)的补丁,关于如何安装oracle补丁程序,需要认真阅读每个补丁程序提供的readme,按照readme的步骤进行安装。
3.运行Pre-Upgrade Information Tool.分析升级到10g前要做的一些操作,包括:
数据库版本、日志文件大小、 表空间大小、 服务器选项、 初始化参数(新增的,降级的,废弃的)、数据库组件 、sysaux表空间、 集群信息等分析。升级前要解决该脚本生成的各种问题。
启动要升级的DB,用SYSDBA运行10g的ORACLE_HOME/rdbms/admin下的utlu102i.sql,查看产生的日志.
SQL> SPOOL info.log
SQL> @utlu102i.sql
SQL> SPOOL OFF
copy oracle 9i的pfile(Dracleora92databaseINITzhangye.ORA)到oracle 10g的pfile(Dracle10gdatabaseINITzhangye.ORA),检查info.log,对oracle 10g的pfile修改.
4.运行Oracle Net Configuration Assistant,生成10g的listener.ora
5.rman备份DB.
6.stop所有oracle 9i的服务.
删除oracle 9i的服务. C:> ORADIM -DELETE -SID test
新建oracle 10g的服务 C:> ORADIM -NEW -SID orcl -MAXUSERS 10 -STAMODE AUTO -PFILE Dracle10gdatabaseINITzhangye.ORA
7.UPGRADE选项启动DB. SQL> STARTUP UPGRADE
8.创建SYSAUX表空间CREATE TABLESPACE sysaux DATAFILE 'Dracleoradatazhangyesysaux01.dbf'
SIZE 500M REUSE
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO
ONLINE;
9.运行10g的ORACLE_HOME/rdbms/admin/catupgrd.sql,然后运行utlu102s.sql查看升级结果.
SQL> SPOOL upgrade.log
SQL> @catupgrd.sql
SQL> @utlu102s.sql
SQL> SPOOL OFF
检查upgrade.log,如果有错误,处理错误后再次运行catupgrd.sql.
10.重新启动DB,编译无效对象.
SQL> shutdown immediate
SQL> startup pfile=Dracle10gdatabaseINITzhangye.ORA
SQL> @Dracle10gRDBMSADMINutlrp.sql
编译后没有无效对象,升级完成。
SQL> SELECT count(*) FROM dba_objects WHERE status='INVALID';