一个环境是oracle 11.2.0.1,一个环境是oracle 11.2.0.4,同样的数据,同样的sql,在两个版本数据库表现不一样。于是,干脆都统一为11.2.0.4。 

    但由于环境限制,只能用静默的方法,把oracle 11.2.0.1 升级到 11.2.0.4。 

    不过,还好,根据网上的文档,升级过程还算顺利。

    下面,我记录一下升级过程,供自己以后查看,也供有需要的人参考。

1、11.2.0.1环境(待升级数据库) 

 

​​SQL> ​​​​select​​​ ​​* from ​​​​v​​​​$version;​​
​​BANNER​​
​​--------------------------------------------------------------------------------​​
​​Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production​​
​​PL​​​​/SQL​​​ ​​Release 11.2.0.1.0 - Production​​
​​CORE11.2.0.4.0Production​​
​​TNS ​​​​for​​​ ​​Linux: Version 11.2.0.1.0 - Production​​
​​NLSRTL Version 11.2.0.1.0 - Production​​

 

​​[root@localhost ~]​​​​# su - oracle​​
​​[oracle@localhost ~]$ ​​​​cat​​​ ​​.bash_profile ​​
​​export​​​ ​​ORACLE_SID=orcl​​
​​export​​​ ​​ORACLE_BASE=​​​​/u01/app/oracle​​
​​export​​​ ​​ORACLE_HOME=$ORACLE_BASE​​​​/product/11​​​​.2.0​​​​/db_1​​
​​export​​​ ​​LD_LIBRARY_PATH=$ORACLE_HOME​​​​/lib​​​​:​​​​/lib​​​​:​​​​/usr/lib​​
​​export​​​ ​​CLASSPATH=$ORACLE_HOME​​​​/JRE​​​​:$ORACLE_HOME​​​​/jlib​​​​:$ORACLE_HOME​​​​/rdbms/jlib​​
​​export​​​ ​​PATH=$ORACLE_HOME​​​​/bin​​​​:$PATH:$HOME​​​​/bin​​
​​alias​​​ ​​sqlplus=​​​​'rlwrap sqlplus'​​

 

 

2、升级前的准备工作 

2.1、 备份数据库

    升级数据库是一个有风险的过程,需要仔细规划和慎重处理。首先要做数据库的完全备份,备份的内容包括数据文件,控制文件,归档文件,日志文件,参数文件,密码文件等。可以备份一下整个ORACLE_HOME目录,如果升级有问题,还可以还原回来。备份的方法可以使用dump数据泵,tar,rman等。

     如:RMAN全备 

​​[oracle@localhost ~]$ ​​​​export​​​ ​​ORACLE_SID=orcl​​
​​[oracle@localhost ~]$ rman target /​​
​​RMAN>backup database ​​​​format​​​ ​​'/home/oracle/rmanbak/df_%t_%s_%p.bak'​​​​;​​

    备份老的ORACLE_HOME和oraInventory 

​​[oracle@localhost ~]$​​​​tar​​​ ​​–cvfp product.​​​​tar​​​​.gz ​​​​/u01/app/oracle/​​
​​[oracle@localhost ~]$​​​​tar​​​ ​​–cvfp oraInventory.​​​​tar​​​​.gz ​​​​/u01/app/oraInventory/​​

2.2、干净的关闭数据库

​​SQL> ​​​​shutdown​​​ ​​immediate;​​

2.3、 关闭数据库的监听

在数据库的升级中,会对数据库的监听文件做重新的配置,建议正常的关闭监听,如下:

 

​​[oracle@localhost ~]$ lsnrctl stop​​
​​[oracle@localhost ~]$ ​​​​netstat​​​ ​​-an |​​​​grep​​​ ​​1521​​

2.4、 关闭OEM 

在升级中需要关闭EM,

 

​​[oracle@localhost ~]$emctl stop dbconsole​​
​​[oracle@localhost ~]$​​​​netstat​​​ ​​-an |​​​​grep​​​ ​​1158​​

2.5、不 对数据库的任何原有文件做操作   

    本人在升级中,编辑数据库的监听文件,导致配置监听和EM错误,故不对数据库的任何原有文件做操作。

3、安装oracle 11.2.0.4软件包

    把oracle 11.2.0.4的安装包上传到/home/oracle目录下,解压后得到database目录。 

​​[oracle@localhost ~]$ ​​​​ls​​
​​p13390677_112040_Linux-x86-64_1of7.zip p13390677_112040_Linux-x86-64_2of7.zip​​
​​[oracle@localhost ~]$ unzip p13390677_112040_Linux-x86-64_1of7.zip​​
​​[oracle@localhost ~]$ unzip p13390677_112040_Linux-x86-64_2of7.zip​​
​​[oracle@localhost ~]$ ​​​​ls​​
​​database​​

    开始安装数据库软件11.2.0.4。

​​[oracle@localhost ~]$ ​​​​cd​​​ ​​database​​
​​[oracle@localhost ~]$.​​​​/runInstaller​​​ ​​-silent -debug -force -ignorePrereq \​​
​​DECLINE_SECURITY_UPDATES=​​​​true​​​ ​​\​​
​​oracle.​​​​install​​​​.option=INSTALL_DB_SWONLY \​​
​​UNIX_GROUP_NAME=oinstall \​​
​​INVENTORY_LOCATION=​​​​/u01/app/oraInventory​​​ ​​\​​
​​ORACLE_HOME=​​​​/u01/app/oracle/product/11​​​​.2.0.4​​​​/dbhome_1​​​ ​​\​​
​​ORACLE_BASE=​​​​/u01/app/oracle​​​ ​​\​​
​​oracle.​​​​install​​​​.db.InstallEdition=EE \​​
​​oracle.​​​​install​​​​.db.DBA_GROUP=dba \​​
​​oracle.​​​​install​​​​.db.OPER_GROUP=oinstall​​

     说明:INVENTORY_LOCATION可以和老版本共用一个目录。ORACLE_BASE和老版本保持一样,ORACLE_HOME指向了一个新的目录11.2.0.4/dbhome_1(以前是11.2.0/db_1)。

     不过,这些目录都是可以随意指定,我上面做是只是为了版本管控方便。 

    安装过程大概需要15分钟左右(根据机型配置时间也不同),安装过程中有警告[WARNING] 时需要安装一些i386 的包。查看log安装即可。

     出现以下字样表示升级成功。

 

​​As a root user, execute the following script(s):​​
​​1. ​​​​/u01/oracle/app/product/11​​​​.2.0.4​​​​/dbhome_1/root​​​​.sh​​
​​Successfully Setup Software.​​

     切换到 ​​root​​ 用户执行脚本。

 

​​[root@localhost ~]​​​​# /u01/oracle/app/product/11.2.0.4/dbhome_1/root.sh​​

4、配置新环境变量,拷贝参数文件和监听文件 

4.1、配置新环境变量

​​[oracle@localhost ~]$ ​​​​whoami​​ 
​​oracle​​
​​[oracle@localhost ~]$ ​​​​cat​​​ ​​.bash_profile ​​
​​export​​​ ​​ORACLE_SID=orcl​​
​​export​​​ ​​ORACLE_BASE=​​​​/u01/app/oracle​​
​​export​​​ ​​ORACLE_HOME=$ORACLE_BASE​​​​/product/11​​​​.2.0.4​​​​/dbhome_1​​
​​export​​​ ​​LD_LIBRARY_PATH=$ORACLE_HOME​​​​/lib​​​​:​​​​/lib​​​​:​​​​/usr/lib​​
​​export​​​ ​​CLASSPATH=$ORACLE_HOME​​​​/JRE​​​​:$ORACLE_HOME​​​​/jlib​​​​:$ORACLE_HOME​​​​/rdbms/jlib​​
​​export​​​ ​​PATH=$ORACLE_HOME​​​​/bin​​​​:$PATH:$HOME​​​​/bin​​
​​alias​​​ ​​sqlplus=​​​​'rlwrap sqlplus'​​

    上面看到,新环境变量和老环境变量相比,我只修改了一个参数:

​​新参数:ORACLE_HOME=$ORACLE_BASE​​​​/product/11​​​​.2.0.4​​​​/dbhome_1​​
​​老参数:ORACLE_HOME=$ORACLE_BASE​​​​/product/11​​​​.2.0​​​​/db_1​​

     注意: 在10g以后,一般情况下环境变量中没有必要设置LD_LIBRARY_PATH,但是一旦将ORACLE_HOME迁移到其他目录,则环境变量中还需要添加这个变量。

    source一下后,环境变量就指向新安装的11.2.0.4位置了。

​​[oracle@localhost ~]$ ​​​​source​​​ ​​.bash_profile​​
​​[oracle@localhost ~]$ ​​​​env​​​ ​​|​​​​grep​​​ ​​ORA​​
​​ORACLE_SID=orcl​​
​​ORACLE_BASE=​​​​/u01/app/oracle​​
​​ORACLE_HOME=​​​​/u01/app/oracle/product/11​​​​.2.0.4​​​​/dbhome_1​​

4.2、修改 /etc/oratab 内容为最新位置

​​[oracle@localhost ~]$ vim ​​​​/etc/oratab​​
​​orcl:​​​​/u01/app/oracle/product/11​​​​.2.0.4​​​​/db_1​​​​:N​​

4.3、 将参数文件copy到新的目录下

​​[oracle@localhost ~]$ ​​​​cd​​​ ​​/u01/app/oracle/product/11​​​​.2.0​​​​/db_1/dbs/​​
​​[oracle@localhost dbs]$ ​​​​cp​​​ ​​-a * ​​​​/u01/app/oracle/product/11​​​​.2.0.4​​​​/dbhome_1/dbs/​​

4.4、 拷贝监听TNS配置文件到新的目录下

​​[oracle@localhost admin]$  ​​​​cd​​​ ​​/u01/app/oracle/product/11​​​​.2.0​​​​/db_1/network/admin/​​
​​[oracle@localhost dbs]$ ​​​​cp​​​ ​​-a * ​​​​/u01/app/oracle/product/11​​​​.2.0.4​​​​/dbhome_1/network/admin​​

4.5、启动监听 

    先修改新位置下的listener.ora里面的路径,然后启动监听。

​​[oracle@localhost admin]$ lsnrctl start​​

5、升级数据库 

    要注意退出oracle用户重新su - oracle下,然后sqlplus能看到11.2.0.4.0字样才行。

​​[oracle@19_mysql-slave ~]$ sqlplus / as sysdba​​
​​SQL*Plus: Release 11.2.0.4.0 Production on Mon Mar 30 12:10:30 2020​​
​​Copyright (c) 1982, 2013, Oracle. All rights reserved.​​
​​Connected to an idle instance.​​
​​SQL> startup upgrade​​
​​ORACLE instance started.​​
​​Total System Global Area 1603411968 bytes​​
​​Fixed Size 2253664 bytes​​
​​Variable Size 1006636192 bytes​​
​​Database Buffers 587202560 bytes​​
​​Redo Buffers 7319552 bytes​​
​​Database mounted.​​
​​Database opened.​​
​​SQL> @$ORACLE_HOME​​​​/rdbms/admin/catupgrd​​​​.sql ---该脚本会运行30分钟左右​​

    以上catupgrd.sql脚本整整运行了30分钟,执行完之后会shutdown immediate数据库。这个时候我们重启数据库即可。

 

​​[oracle@localhost admin]$ sqlplus ​​​​/nolog​​
​​SQL> conn / as sysdba​​
​​SQL> startup​​
​​SQL> ​​​​select​​​ ​​* from ​​​​v​​​​$version;​​
​​BANNER​​
​​--------------------------------------------------------------------------------​​
​​Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production​​
​​PL​​​​/SQL​​​ ​​Release 11.2.0.4.0 - Production​​
​​CORE 11.2.0.4.0 Production​​
​​TNS ​​​​for​​​ ​​Linux: Version 11.2.0.4.0 - Production​​
​​NLSRTL Version 11.2.0.4.0 - Production​​

6、 运行 utlrp.sql 编译失效对象

 

    检查无效对象:

​​SQL> ​​​​select​​​ ​​* ​​​​from​​​ ​​dba_objects ​​​​where​​​ ​​status !=​​​​'VALID'​​​​;​​
​​SQL> ​​​​SELECT​​​ ​​count​​​​(*) ​​​​FROM​​​ ​​dba_objects ​​​​WHERE​​​ ​​status=​​​​'INVALID'​​​​;​​

    运行utlrp.sql编译失效对象。

​​SQL> @?​​​​/rdbms/admin/utlrp​​

    该脚本耗时约为3分钟左右。 至此数据库已经升级完成。

    最后,重启数据库没有问题就是升级成功了。

7、更新数据库服务脚本

​ 将/u01/app/oracle/product/11.2.0.4/dbhome_1/bin/​​​ 下的 ​​dbstart​​​ 和 ​​dbshut​​​ ,​​ORACLE_HOME_LISTNER=$1​​​ 改为 ​​$ORACLE_HOME​​ 。

​​#ORACLE_HOME_LISTNER=$1​​
​​ORACLE_HOME_LISTNER=$ORACLE_HOME​​

8、 升级后的检查确认

​​SQL> ​​​​select​​​ ​​status ​​​​from​​​ ​​v$instance;​​
​​STATUS​​

​​------------​​
​​OPEN​​​ ​​ #注意,成功打开数据库后,这里将是​​​​OPEN​​​​,而非​​​​OPEN​​​ ​​MIGRATE​​
​​SQL> ​​​​select​​​ ​​* ​​​​from​​​ ​​v$version;​​
​​BANNER​​
​​--------------------------------------------------------------------------------​​
​​Oracle ​​​​Database​​​ ​​11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production​​
​​PL/SQL Release 11.2.0.4.0 - Production​​
​​CORE 11.2.0.4.0 Production​​
​​TNS ​​​​for​​​ ​​Linux: Version 11.2.0.4.0 - Production​​
​​NLSRTL Version 11.2.0.4.0 - Production​​

9、升级成功后需重建EM(没有EM可忽略该步)

手工创建EM资料库: 

​​####emca -repos drop​​
​​[oracle@localhost admin]$ emca -reposdrop​​
​​####emca -repos create​​

​​[oracle@localhost admin]$ emca -reposcreate​​

​​###emca -config dbcontrol db​​
​​[oracle@localhost admin]$ emca-config dbcontrol db​​

参考链接:


2、 ​​https://www.icode9.com/content-2-4058.html​

日积月累