11g数据库升级共有3种方式:DBUA,,MANUAL,EXPDP/IMPDP+UPDATE
我们比较熟悉的是前两种升级方式,至于第三种,官方文档是这样说的:
Unlike DBUA or a manual upgrade, the Oracle Data Pump Export and Import utilities physically copy data from your current database to a new database. When upgrading from Oracle Database 10g Release 1 (10.1) or higher,Data Pump Export and Import are recommended for higher performance and to ensure support for new datatypes.
The Export utility of the current database copies specified parts of the database into an export dump file. Then, the Import utility of the new Oracle Database 11g release loads the exported data into a new database. However, the new Oracle Database 11g database must currently exist before it can be loaded from the export dump file.
When importing data from an earlier release, the Import utility of the new Oracle Database 11g release makes appropriate changes to data definitions as it reads export dump files from earlier releases.
If your database is earlier than Oracle Database release 10.1, then you can use the original Export and Import utilities to perform a full or partial export from your database, followed by a full or partial import into a new Oracle Database 11g database. Export/Import can copy a subset of the data in a database, leaving the original database unchanged.
详情可以参考官方文档:http://docs.oracle.com/cd/E11882_01/server.112/e23633/preup.htm#UPGRD12367
这里主要是用MANUAL方式来升级数据库到11.2.0.3
一、首先,安装数据库PSR 11.2.0.3(out-of-place upgrade--最佳实践方式)
我的11.2.0.1默认安装路径是E:\APP\ORACLE\PRODUCT\11.2.0\DB_1,这里注意要装到一个不同的目录里去,比如:E:\APP\ORACLE\PRODUCT\11.2.0\DB_2
二、运行utlu112i.sql脚本对数据库进行PRE-UPGRADE
其中会碰到一些预检测中碰到的问题,必须先一一解决掉
按照官方对于第一个WARNING的说明,推荐使用一个名叫check_schema_stale_stats.sql的脚本,可在官网下载到:
https://support.oracle.com/epmos/main/downloadattachmentprocessor?
该脚本用于检测哪些schema with stale optimizer statistics,并提供了收集数据字典状态的统计信息的脚本
第二个WARNING,下面直接给出了执行语句:PURGE DBA_RECYCLEBIN
三、停止Oracle的相关服务,包括em,sqlplus,lsnrctl,还有OracleServiceSID
四、执行catupgrd.sql升级数据字典
五、执行utlrp编译无效对象
六、测试数据库是否正确升级
SQL> select comp_id,comp_name,status from sys.dba_registery;
其实用DBUA方式升级,更容易些,具体方法可参考文档相关资料,下面给几个操作过程的图,一个是5个step
执行完整个过程,也要大约1个多小时
升级完11.2.0.3的PSR以后,再用Opatch升级PSU
一、解压缩PSU包到任意目录(注意,APPLY的时候必须进入该目录执行,否则报错)
二、如果Opatch软件版本过低,执行Opatch apply的时候会有提示,去官方下载新版的Opatch然后替换掉原来的,解压后复制黏贴到ORACLE_HOME/Opatch下覆盖掉原目录就可以了,当然你也可以把原来的目录先改个名,作为备份。比如改成:Optach_bak,不会影响使用的
这里提示最低要求的版本是11.2.0.1.9,而默认升级完11.2.0.3后自带的版本是11.2.0.1.7
三、先用opatch lsinventory查看一下目前opatch装了哪些补丁
这里,看到只装了一个11.2.0.3.0的主要PSR,并没有任何PSU补丁
四、执行opatch apply安装已经解压好的PSU补丁16345833
这里提示很多dll和jar文件正在被某些进程调用,返回error code 41。如果之前没有把oracle相关的服务和进程都关闭的话,就会提示该错误
如果你发现已经关闭数据库,并且和Oracle相关的Service和Process也都已经停掉了,但是还会报单独的一个oci.dll被占用的提示:
这个OCI.DLL是Oracle Call Interface的缩写,用于客户端和Oracle服务器之间进行远程通信的话,必须要用这个动态链接库文件,用过PL/SQL等工具的人应该不陌生吧,但是这里并没忽悠开启任何第三方的工具,怎么还会占用这个文件呢?
这里有两种方式可以解决该问题
一、修改Oracle Home的方式可以欺骗一下Opatch
1.修改Oracle Home路径(rename文件db_1的名字即可,或者改前面的第一个父目录E:\app\Oracle -> E:\app\Oacle2,目的就是让占用oci的程序无法正常调用)
2.重启系统
3.把Oracle Home路径改回原来的路径
4.重新执行Opatch
二、借助Microsoft公司的一个名叫procexp小工具
procexp是一个进程管理期的加强版,可以看到所有进程的运行情况,以及对应的文件路径,用它来查找是哪些进程占用了oci.dll文件,然后在任务管理器中关闭即可
这里非常清楚的告诉我们,有3个进程占用了Oracle Home中的oci.dll文件,我的环境Oracle Home是E:\app\oracle\product\11.2.0\db_2
其中procexp.exe是程序自己调用的,最后退出程序时就释放了,所以可以不用管,把剩下3个进程全部关闭,直到出现下图:
退出程序后,再次执行opatch apply,至此可以顺利执行了
用这个工具可以省去了重启服务器的麻烦,也不容易出错,所以推荐采用该方法来关闭oci.dll的占用。
接下去就是顺利安装PSU补丁了,开始的时候会提示你输入MOS邮件的账号密码,回车后按"Y"忽略即可,最后可以看到,Opatch顺利把PSU装完了
看到OPatch succeeded.字样就OK了,最后再用opatch lsinventory查看一下安装补丁后fix了哪些BUG,其实有几十个,后面内容省略掉了
我这里安装的PSU是16345833,版本是18,至此,数据库顺利升级完毕。