Best Practice of Oracle11.2.0.3 Upgrade&Rollback manually from Oracle 10.2.0.5 in Linux

Best Practice of Oracle11.2.0.3 Upgrade&Rollback manually from 10.2.0.5

前言:

1.11g升级官方文档 /E11882_01/server.112/e23633/upgrade.htm#CACGGHJC
2.本实践基于单实例,无ASM
3.未启用外部认证,Stream,Vault,无dblink
4.适合对于10g到11g升级过程还比较陌生的同学,进行一次完整的升级体验,是DataGuard环境的也可以哦!


1.升级规划

1.1  新版本ORACLE_HOME及相关路径指定

   通常情况下,出于回滚需要,我们会保留原有ORACLE_HOME且不做任何修改,从而可以完整保留升级前的所有bin文件, pfile.ora, spfileSID.ora, orapwdSID, listener.ora, tnsname.ora.
   因此推荐使用新路径作为升级后的ORACLE_HOME.但是数据文件,控制文件,日志文件路径,归档日志路径,闪回恢复区配置在升级过程中是不会改变的。
   
预先准备好升级完成后所需要的环境变量设置,当整个升级完成后,再正式进行变更。因为升级过程中,可能有实例或者监听是在旧ORACLE_HOME下运行着。或者在多instance的环境下,部分实例仍然会依赖其对外提供服务!  
#for oracle 11.2.0.3
stty erase ^?  
ORACLE_BASE=/u01/app
ORACLE_HOME=$ORACLE_BASE/oracle/product/11.2.0/dbhome_1
PATH=$ORACLE_HOME/bin:$PATH
SQLPATH=$ORACLE_HOME/sqlplus/admin/:$ORACLE_HOME/rdbms/admin/  
EDITOR=vi
export EDITOR  ORACLE_BASE ORACLE_HOME PATH SQLPATH

也同样准备好,临时设置环境变量的方法:
export ORACLE_BASE=/u01/app
export ORACLE_HOME=$ORACLE_BASE/oracle/product/11.2.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
export SQLPATH=$ORACLE_HOME/sqlplus/admin/:$ORACLE_HOME/rdbms/admin/  
export EDITOR=vi



1.2 核实系统包是否完整,并补全

以11.2.0.3文档标准核实包的状态
rpm -q --qf '%{NAME}-%{VERSION}-%{RELEASE} (%{ARCH})\n' \
binutils \
compat-libstdc++-33 \
elfutils-libelf \
elfutils-libelf-devel \
gcc \
gcc-c++ \
glibc-2.5 \
glibc-common \
glibc-devel \
glibc-headers \
ksh \
libaio \
libaio-devel \
libgcc \
libstdc++ \
libstdc++-devel  \
make \
sysstat \

如果出现其中两个包互相依赖的情况,可以使用--nodeps参数安装,作用是忽略依赖关系。
rpm -ivh --nodeps elfutils-libelf-devel-static-x86_64.rpm


1.3 修改系统参数以满足新版本需求

vi /etc/security/limits.conf
#for oracle (for 11.2.0.3)
oracle              soft    nproc   2047
oracle              hard    nproc   16384
oracle              soft    nofile  1024
oracle              hard    nofile  65536
oracle              soft    stack   10240

vi /etc/sysctl.conf
#for oracle (for 11.2.0.3)
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = 2097152
kernel.shmmax = 4294967295      
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576

# /sbin/sysctl -p

1.4 使用响应文件静默安装

响应文件至少需要进行下列配置,顺序从上倒下:
oracle.install.option=INSTALL_DB_SWONLY
ORACLE_HOSTNAME=redhat
UNIX_GROUP_NAME=dba
INVENTORY_LOCATION=/u01/app/oraInventory
SELECTED_LANGUAGES=en
ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
ORACLE_BASE=/u01/app
oracle.install.db.InstallEdition=EE
oracle.install.db.EEOptionsSelection=false
oracle.install.db.DBA_GROUP=dba
oracle.install.db.OPER_GROUP=dba

执行安装之前 unset DISPLAY 否则有可能仍然会调用X11
runInstaller -silent -responseFile /home/oracle/install_swonly_11.2.0.3_test3.rsp

注:a)如果现有系统中已经有oracleInventory,则安装会自动使用该路径,且忽略响应文件的指定。
    b)如果安装过程被迫中断或者失败,需要将 oraInventory/ContentsXML/inventory.xml 中关于新版本的记录删除掉,否则将不能在以选定的ORACLE_HOME下再次安装二进制文件。

    
安装完成后,在安装日志中查找 Error Message 可以确认有问题的requirement,例如以下示例,tmp与swap的问题都是IGNORABLE的,不影响静默安装成功:
INFO: *********************************************
INFO: Swap Size: This is a prerequisite condition to test whether sufficient total swap space is available on the system.
INFO: Severity:IGNORABLE
INFO: OverallStatus:VERIFICATION_FAILED
INFO: -----------------------------------------------
INFO: Verification Result for Node:gstqp010b
INFO: Expected Value:7.7958GB (8174516.0KB)
INFO: Actual Value:4GB (4194296.0KB)
INFO: Error Message:PRVF-7573 : Sufficient swap size is not available on node "gstqp010b" [Required = 7.7958GB (8174516.0KB) ; Found = 4GB (4194296.0KB)]
INFO: Cause: The swap size found does not meet the minimum requirement.
INFO: Action: Increase swap size to at least meet the minimum swap space requirement.
INFO: -----------------------------------------------
INFO: *********************************************


2  参数文件,口令文件筹备

2.1 新版本pfile,spfile,orapwd筹备 (配置新instance)

当前环境变量是10g的ORACLE_HOME,但是调用11g ORACLE_HOME下的脚本
[oracle@redhat ~]$ cd /u01/app/oracle/product/11.2.0/dbhome_1/rdbms/admin/  
$ export ORACLE_SID=test3
$ sqlplus / as sysdba
SQL> spool /tmp/upgrade_info_test3.log
SQL> @utlu112i.sql
SQL> spool off
SQL>
生成的upgrade_info.log里的内容很重要,后续步骤要根据该文件的内容做相应的修改,因此一定要保留下来。


为每个旧实例生成静态参数文件,拷贝至新ORACLE_HOME下;
SQL> create pfile='/tmp/inittest3.ora' from spfile;
cp /tmp/inittest3.ora /u01/app/oracle/product/11.2.0/dbhome_1/dbs/

cp /u01/app/oracle/product/10.2.0.5/dbhome_1/dbs/orapwtest3 /u01/app/oracle/product/11.2.0/dbhome_1/dbs/


如果是DG环境,需要同时拷贝至standby端:

scp /u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapwtest3 oracle@10.0.0.22:/u01/app/oracle/product/11.2.0/dbhome_1/dbs/

scp /u01/app/oracle/product/11.2.0/dbhome_1/dbs/inittest3.ora oracle@10.0.0.22:/u01/app/oracle/product/11.2.0/dbhome_1/dbs/    (注意修改参数)



然后可以在新ORACLE_HOME下startup nomount测试实例参数均正确。
注:在10g升11g情况下,通常需要修改的参数有
    diagnostic_dest='/u01/app/oracle',  (diag会自动加上)
    OPTIMIZER_FEATURES_ENABLE='11.2.0.3',

    core_dump_dest='/u01/app/oracle/product/11.2.0/dbhome_1/dbs'

    COMPATIBLE = '11.2.0'  (如果使用restore point,这个参数只能在升级成功后再修改,注意此参数从10g起,只能增大,不能直接回退)

    注意core_dump_dest不修改并不会有错误,且是升级后仍会沿用旧路径,但是旧ORACLE_HOME若被移除,则可能导致实例出错,所以建议修改好。并且我发现oracle实例启动时,是会自动在默认的位置创建好cdump的。


2.2  新版本listener.ora, tnsname.ora筹备

   将相关的网络配置文件直接拷贝至新ORACLE_HOME下,再根据实际情况修改。
cp /u01/app/oracle/product/10.2.0.5/dbhome_1/network/admin/listener.ora /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/

cp /u01/app/oracle/product/10.2.0.5/dbhome_1/network/admin/tnsnames.ora /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/


如果是DG环境,需要同时拷贝至standby 端:

scp /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/tnsnames.ora oracle@10.0.0.22:/u01/app/oracle/product/11.2.0/dbhome_1/network/admin/ 

scp /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora oracle@10.0.0.22:/u01/app/oracle/product/11.2.0/dbhome_1/network/admin/   (注意修改ORACLE_HOME)


注:注意在有静态注册的场景中listener.ora与tnsname.ora对应的原理。tnsname.ora使用service name与监听配对;listener.ora中的GLOBAL_DBNAME负责前端接收客户端tnsname.ora请求,
    而GLOBAL_DBNAME与数据库初始参数service_names对应,且service_names自动继承db_unique_name。后端由SID_NAME与ORACLE_HOME确定将客户请求转发给哪个实例。
    针对tnsname.ora的修改,可以用tnsping进行解析测试
示例:
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (SID_NAME = test3)
      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
      (GLOBAL_DBNAME= test3_a)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = redhat.localdomain)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
    )
  )
 
Services Summary...
Service "PLSExtProc" has 1 instance(s).
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "test3XDB" has 1 instance(s).
  Instance "test3", status READY, has 1 handler(s) for this service...
Service "test3_a" has 2 instance(s).
  Instance "test3", status UNKNOWN, has 1 handler(s) for this service...
  Instance "test3", status READY, has 1 handler(s) for this service...
The command completed successfully


3.升级DataBase

备注: 如果是DG环境,standby是可以在primary升级期间接收并应用日志的。 因此必须注意以下几点:

a. 升级之前,确保DG处于正常状态,即无gap,RFS 与 MRP0 进程正常。

b. primary升级期间,standby实例的compatible参数与二进制文件与primary保持一致,建议升级完全完成之前,compatible 保持为旧版本 10.2.0.5.0

c. standby上切换至新ORACLE_HOME的监听程序; primary端可以维持旧ORACLE_HOME中的监听。

d. 使用新ORACLE_HOME,启动实例,并mount database,然后启动实时应用。 此时可以在standby实例警告日志中看见日志正常接收与应用。

如果当然不采取以上方式升级standby,而是采用primary升级完成后,重建DG的方式 也是可以的,但是正对重建DG成本较高的场景,需要谨慎。

升级过程会产生860M 闪回日志,与3.5G 归档日志,某些场景下网络传输量远小于重建DG的网络传输量。

e. 升级完成后,可以考虑保留主备两端compatible为10.2.0.5.0。但是如果要在备库使用open readonly with apply, 则必须将主备更改为 11.2.0.0.0或者更高。并且注意,如果此时仍有10.2.0.5.0时期的日志文件还未在备库被应用,而此时备库已经是11.2.0.0.0,则只能在mount下将这部分日志全部应用之后,再开启open readonly with apply。


3.1 三种预防性备份方案

3.1.1 旧ORACLE_HOME下创建担保性还原点

SQL> CREATE RESTORE POINT before_upgrade GUARANTEE FLASHBACK DATABASE;
注:必须先开启归档并启用闪回恢复区,预计产生800M左右闪回日志;
     新实例的初始参数中必须COMPATIBLE ='10.2.0.5.0',否则会报ORA-38880: Cannot advance compatibility from 10.2.0.5.0 to 11.2.0.0.0 due to guaranteed restore points
    在闪回时,必须在新ORACLE_HOME下完成闪回操作,并关闭数据库。然后才能在旧 ORACLE_HOME下先mount再alter database open resetlogs。
    

3.1.2 旧ORACLE_HOME下RMAN 执行备份及压缩

     好处是最大可节省85%的冷备空间,且在恢复时必须回到旧ORACLE_HOME下进行。
如果未启用归档,必须干净关闭实例备份数据文件与控制文件:
RUN
{     
  shutdown immediate  
  startup mount      
  BACKUP as compressed backupset DATABASE FORMAT '/u01/beforeupgrade/test3/before_upgrade_%u.bk';    
  BACKUP CURRENT CONTROLFILE FORMAT '/u01/beforeupgrade/test3/before_upgrade_%u.cl';  
  alter database open;  
}

如果启用了归档,可直接热备,且在最后备份当前日志文件:
RUN
{
  BACKUP as compressed backupset DATABASE FORMAT '/u01/beforeupgrade/test3/before_upgrade_%u.bk';    
  BACKUP CURRENT CONTROLFILE FORMAT '/u01/beforeupgrade/test3/before_upgrade_%u.cl';  
  sql'ALTER SYSTEM ARCHIVE LOG CURRENT';
  backup archivelog all FORMAT '/u01/beforeupgrade/test3/before_upgrade_%u.arc';
}


3.1.3 数据库冷备份(通常不建议用这种方式)

  参见http://blog.csdn.net/cainiaofly/article/details/7988934


3.2 核实信息并升级数据字典

3.2.1 在升级之前,确保所有的组件和对象都是valid:

--针对组件
col comp_name for a30
select substr(comp_name,1,40) comp_name, status, substr(version,1,10) version from dba_registry order by comp_name;

--针对对象如果有invalid的对象,运行utlrp.sql重新编译对象。
col object_name for a30
select substr(object_name,1,40) object_name,substr(owner,1,20) owner,object_type from dba_objects where status='INVALID' order by owner,object_type;



3.2.2 确保sys和system下没有重复的对象:

select object_name, object_type from dba_objects where object_name||object_type in(select object_name||object_type from dba_objects where owner = 'SYS') and owner = 'SYSTEM';
上面这条语句只能返回以下4条记录:
OBJECT_NAME OBJECT_TYPE
---------------------------------------- ---------------
DBMS_REPCAT_AUTH PACKAGE BODY
DBMS_REPCAT_AUTH PACKAGE
AQ$_SCHEDULES_PRIMARY INDEX
AQ$_SCHEDULESTABLE
如果有其它记录返回,则必须根据下面这篇文档把重复记录删除:
How to Clean Up Duplicate Objects Owned by SYS and SYSTEM Schema [ID 1030426.6]



3.2.3 备份Enterprise Manager Database Control Data

(实际上也可以删掉资料库,待升级完后重建)
删除资料库步骤:
drop user sysman cascade;
drop role MGMT_USER;
drop user MGMT_VIEW cascade;
drop public synonym MGMT_TARGET_BLACKOUTS;
drop public synonym SETEMVIEWUSERCONTEXT;

重建步骤:在命令行下执行以下命令
emca -repos recreate    如果是第一次安装就  emca -repos create
emctl stop agent
emca -config dbcontrol db
emctl start dbconsole


3.2.3 使用以下语句生产分析数据字典的脚本 (as sysdba):

Set verify off
Set space 0
Set line 120
Set heading off
Set feedback off
Set pages 1000
Spool /tmp/analyze_test3.sql

SELECT 'Analyze cluster "'||cluster_name||'" validate structure cascade;'
FROM dba_clusters
WHERE owner='SYS'
UNION
SELECT 'Analyze table "'||table_name||'" validate structure cascade;'
FROM dba_tables
WHERE owner='SYS'
AND partitioned='NO'
AND (iot_type='IOT' OR iot_type is NULL)
UNION
SELECT 'Analyze table "'||table_name||'" validate structure cascade into invalid_rows;'
FROM dba_tables
WHERE owner='SYS'
AND partitioned='YES';

spool off


现在运行该脚本(需要先手动删掉头尾的无用字符串):
$ sqlplus "/ as sysdba"
SQL> @$ORACLE_HOME/rdbms/admin/utlvalid.sql
SQL> @/tmp/analyze_test3.sql


3.2.4 确保当前没有文件需要介质

恢复:
SELECT * FROM v$recover_file;
上面语句没有返回结果才是正确的。

3.2.5 确保当前没有文件运行在备份模式下:

SELECT * FROM v$backup WHERE status != 'NOT ACTIVE';
上面语句没有返回结果才是正确的。


3.2.6 确保用户SYS和SYSTEM的默认表空间都是SYSTEM:

SQL> SELECT username, default_tablespace
FROM dba_users
WHERE username in ('SYS','SYSTEM');
如果不是,则要用以下语句修改为SYSTEM:
SQL> ALTER user SYS default tablespace SYSTEM;
SQL> ALTER user SYSTEM default tablespace SYSTEM;

3.2.7 确保AUD$表建在SYS用户下和SYSTEM表空间下:

SQL> SELECT owner,tablespace_name
FROM dba_tables
WHERE table_name='AUD$';
如果不是,则要做相应的修改。

3.2.8 在旧ORACLE_HOME下,干净关闭数据库:

$ sqlplus "/as sysdba"
SQL> shutdown immediate;


3.2.9 升级前的检查步骤基本上已经完成了,在跑升级脚本之前,先临时把把相关参数改为指向11g ORACLE_HOME:

export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
export SQLPATH=$ORACLE_HOME/sqlplus/admin/:$ORACLE_HOME/rdbms/admin/  
export EDITOR=vi


3.2.10 将数据库起到upgrade状态: (这里是使用11g的ORACLE_HOME)

(这里也侧面说明了,只要db_name吻合,controlfile及dump 路径正确,一个database是可以被任意instance  open的)
$ cd $ORACLE_HOME/rdbms/admin
$ sqlplus "/ as sysdba"
SQL> startup UPGRADE

接着开始跑升级脚本:
set echo on
SPOOL /tmp/upgrade_test3.log
! date
@catupgrd.sql
! date
spool off

tail -1000f /tmp/upgrade_test3.log | grep ORA-
注意有无报错,途中所有ora-均是注释内容
这个脚本大概持续1.5个小时,脚本的最后会自动关闭数据库,并会自动退出sqlplus。

3.2.11 检查数据库状态:

$ sqlplus "/as sysdba"
SQL> STARTUP
SQL> @utlu112s.sql
如果该报告中包含错误,请查阅相关文档解决,直到没有错误之后,再跑下面的脚本.

SQL> @catuppst.sql

接着重新编译一下无效对象:
SQL> @utlrp.sql


3.3 最后再次确认组件均有效

--针对对象如果有invalid的对象,运行utlrp.sql重新编译对象。
col object_name for a30
select substr(object_name,1,40) object_name,substr(owner,1,20) owner,object_type from dba_objects where status='INVALID' order by owner,object_type;

--针对组件
set linesize 200
set wrap off
col comp_name for a30
select substr(comp_name,1,40) comp_name, status, substr(version,1,10) version from dba_registry order by comp_name;

COMP_NAME               STATUS                        VERSION
------------------------------ -------------------------------------------- ----------------------------------------
JServer JAVA Virtual Machine   VALID                        11.2.0.3.0
OLAP Analytic Workspace        VALID                        11.2.0.3.0
OLAP Catalog                   VALID                        11.2.0.3.0
Oracle Data Mining             VALID                        11.2.0.3.0
Oracle Database Catalog Views  VALID                        11.2.0.3.0
Oracle Database Java Packages  VALID                        11.2.0.3.0
Oracle Database Packages and T VALID                        11.2.0.3.0
Oracle Expression Filter       VALID                        11.2.0.3.0
Oracle Multimedia              VALID                        11.2.0.3.0
Oracle OLAP API                VALID                        11.2.0.3.0
Oracle Rule Manager            VALID                        11.2.0.3.0
Oracle Text                    VALID                        11.2.0.3.0
Oracle Workspace Manager       VALID                        11.2.0.3.0
Oracle XDK                     VALID                        11.2.0.3.0
Oracle XML Database            VALID                        11.2.0.3.0
Spatial                        VALID                        11.2.0.3.0

16 rows selected.



4.升级时区文件


4.1 核实时区状态

检查Timezone版本,主要参考:
Actions For DST Updates When Upgrading To Or Applying The 11.2.0.2 Patchset [ID 1201253.1]
注意:11g的软件里已经自带了版本1-14的Timezone。
先检查一下当前timezone版本:
SQL> conn / as sysdba
Connected.
SQL>SELECT version FROM v$timezone_file;
根据当前timezone的版本,又分三种情况:
1)等于14:这已经是11g需要的版本了,所以升级前后都不需要做任何事,这种情况很罕见。
2)高于14:升级前,必须得给11g软件打上该timezone版本的DST补丁,这种情况也很罕见。
3)低于14:大多数都是这种情况,在升级前不需要在11g软件层面打补丁,在升级后需要再数据库层面将Timezone升级至14,具体看后面的步骤


4.2 Timezone数据库层面的升级

只有当Timezone的版本小于14时,才需要执行该步骤。

主要参考:
Updating the RDBMS DST version in 11gR2 (11.2.0.1 and up) using DBMS_DST [ID 977512.1]
1)Timezone升级前的准备工作:
先检查一下当前的timezone版本:
conn / as sysdba
SELECT PROPERTY_NAME, SUBSTR(property_value, 1, 30) value FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME LIKE 'DST_%' ORDER BY PROPERTY_NAME;

一个典型的输出是:
PROPERTY_NAME VALUE
------------------------------ ------------------------------
DST_PRIMARY_TT_VERSION 4
DST_SECONDARY_TT_VERSION 0
DST_UPGRADE_STATE NONE

然后开始准备工作:

alter session set "_with_subquery"=materialize;
exec DBMS_DST.BEGIN_PREPARE(14);

接着检查准备状态:

SELECT PROPERTY_NAME, SUBSTR(property_value, 1, 30) value
FROM DATABASE_PROPERTIES
WHERE PROPERTY_NAME LIKE 'DST_%'
ORDER BY PROPERTY_NAME;

一个典型的输出是:
PROPERTY_NAME VALUE
------------------------------ ------------------------------
DST_PRIMARY_TT_VERSION 4
DST_SECONDARY_TT_VERSION 14
DST_UPGRADE_STATE PREPARE

-- truncate logging tables if they exist.

TRUNCATE TABLE SYS.DST$TRIGGER_TABLE;
TRUNCATE TABLE sys.dst$affected_tables;
TRUNCATE TABLE sys.dst$error_table;

-- log affected data

set serveroutput on
BEGIN
DBMS_DST.FIND_AFFECTED_TABLES
(affected_tables => 'sys.dst$affected_tables',
log_errors => TRUE,
log_errors_table => 'sys.dst$error_table');
END;
/


下面的语句都不能有返回结果:
SELECT * FROM sys.dst$affected_tables;
SELECT * FROM sys.dst$error_table;
SELECT * FROM sys.dst$error_table where ERROR_NUMBER= '1883';
SELECT * FROM sys.dst$error_table where ERROR_NUMBER= '1878';
SELECT * FROM sys.dst$error_table where ERROR_NUMBER not in ('1878','1883');

-- end prepare window, the rows above will stay in those tables.
EXEC DBMS_DST.END_PREPARE;
-- check if this is ended
SELECT PROPERTY_NAME, SUBSTR(property_value, 1, 30) value
FROM DATABASE_PROPERTIES
WHERE PROPERTY_NAME LIKE 'DST_%'
ORDER BY PROPERTY_NAME;

一个典型的输出是:
PROPERTY_NAME VALUE
------------------------------ ------------------------------
DST_PRIMARY_TT_VERSION 4
DST_SECONDARY_TT_VERSION 0
DST_UPGRADE_STATE NONE

4.2 升级时区

真正开始升级Timezone

conn / as sysdba
shutdown immediate;
startup upgrade;
set serveroutput on
purge dba_recyclebin;
TRUNCATE TABLE SYS.DST$TRIGGER_TABLE;
TRUNCATE TABLE sys.dst$affected_tables;
TRUNCATE TABLE sys.dst$error_table;
alter session set "_with_subquery"=materialize;
EXEC DBMS_DST.BEGIN_UPGRADE(14);

SELECT PROPERTY_NAME, SUBSTR(property_value, 1, 30) value
FROM DATABASE_PROPERTIES
WHERE PROPERTY_NAME LIKE 'DST_%'
ORDER BY PROPERTY_NAME;

一个典型的输出是:

PROPERTY_NAME VALUE
------------------------------ ------------------------------
DST_PRIMARY_TT_VERSION 14
DST_SECONDARY_TT_VERSION 4
DST_UPGRADE_STATE UPGRADE

下面这条语句应该没有返回结果:
SELECT OWNER, TABLE_NAME, UPGRADE_IN_PROGRESS FROM ALL_TSTZ_TABLES where UPGRADE_IN_PROGRESS='YES';

重启数据库:
shutdown immediate
startup

升级相关的table:
alter session set "_with_subquery"=materialize;
set serveroutput on
VAR numfail number
BEGIN
DBMS_DST.UPGRADE_DATABASE(:numfail,
parallel => TRUE,
log_errors => TRUE,
log_errors_table => 'SYS.DST$ERROR_TABLE',
log_triggers_table => 'SYS.DST$TRIGGER_TABLE',
error_on_overlap_time => FALSE,
error_on_nonexisting_time => FALSE);
DBMS_OUTPUT.PUT_LINE('Failures:'|| :numfail);
END;
/

如果没有错误,则结束升级:

VAR fail number
BEGIN
DBMS_DST.END_UPGRADE(:fail);
DBMS_OUTPUT.PUT_LINE('Failures:'|| :fail);
END;
/

最后一次检查:

SELECT PROPERTY_NAME, SUBSTR(property_value, 1, 30) value
FROM DATABASE_PROPERTIES
WHERE PROPERTY_NAME LIKE 'DST_%'
ORDER BY PROPERTY_NAME;

典型输出是:

PROPERTY_NAME VALUE
------------------------------ ------------------------------
DST_PRIMARY_TT_VERSION 14
DST_SECONDARY_TT_VERSION 0
DST_UPGRADE_STATE NONE


SELECT * FROM v$timezone_file;
FILENAME VERSION
-------------------- ----------
timezlrg_14.dat 14


5.切换监听

停止旧ORACLE_HOME下的监听,然后启动新ORACLE_HOME下的监听。


6.正式修改oracle用户环境变量

#for oracle 11.2.0.3
stty erase ^?         
EDITOR=vim
ORACLE_BASE=/u01/app/oracle   
ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1  
PATH=$ORACLE_HOME/bin:$PATH
SQLPATH=$ORACLE_HOME/sqlplus/admin/:$ORACLE_HOME/rdbms/admin/   
export EDITOR  ORACLE_BASE ORACLE_HOME PATH SQLPATH

7. 修改oratab中的内容,使其指向新的11g Home目录:


Sample /etc/oratab
#orcl:/opt/oracle/product/10.2/db_1:N
orcl:/opt/oracle/product/11.2.0/dbhome_1:N


8. 如果升级失败,进行回退

8.1 关闭新ORACLE_HOME下所有实例与监听

略。

8.2 借助担保型还原点闪回或者rman备份恢复

8.2.1 在新ORACLE_HOME下干净关闭实例,并启动到mount,执行闪回操作,并关闭实例

注:不能在旧ORACLE_HOME下做闪回操作,否则会遇到 ORA-38792: encountered unknown flashback record from release 11.0.0.0.0

[oracle@redhat ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.3.0 Production on Tue Jan 21 13:24:33 2014
Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> startup mount
ORACLE instance started.

Total System Global Area  835104768 bytes
Fixed Size            2232960 bytes
Variable Size          230690176 bytes
Database Buffers      595591168 bytes
Redo Buffers            6590464 bytes
Database mounted.
SQL> set linesize 200
SQL> select * from v$restore_point;

       SCN DATABASE_INCARNATION# GUA STORAGE_SIZE TIME                                          NAME
---------- --------------------- --- ------------ --------------------------------------------------------------------------- --------------------------------------------------------------------------
    523168               2 YES    810450944 21-JAN-14 11.24.40.000000000 AM                          BEFORE_UPGRADE

SQL> flashback database to restore point before_upgrade;

Flashback complete.

新ORACLE_HOME中警告日志中闪回的记录,闪回完毕后自动应用归档日志前推至指定时间点:
ALTER DATABASE   MOUNT
Successful mount of redo thread 1, with mount id 960220067
Allocated 3981120 bytes in shared pool for flashback generation buffer
Starting background process RVWR
Tue Jan 21 13:32:23 2014
RVWR started with pid=20, OS id=8060
Database mounted in Exclusive Mode
Lost write protection disabled
Completed: ALTER DATABASE   MOUNT
Tue Jan 21 13:34:59 2014
flashback database to restore point before_upgrade
Flashback Restore Start
Tue Jan 21 13:35:32 2014
Flashback Restore Complete
Flashback Media Recovery Start
 started logmerger process
Parallel Media Recovery started with 2 slaves
Flashback Media Recovery Log /u01/archivelog/test3/1_14_792770784.dbf
Tue Jan 21 13:35:32 2014
Incomplete Recovery applied until change 523169 time 01/21/2014 11:24:40
Flashback Media Recovery Complete
Completed: flashback database to restore point before_upgrade

注:如果闪回后,启动实例出现问题,必须在新home中startup upgrade后,shutdown immediate.才能再次flashback database. 


8.2.2 在旧ORACLE_HOME中mount数据库,并open resetlogs

[oracle@redhat ~]$ su - oracle
Password:
[oracle@redhat ~]$ export ORACLE_SID=test3
[oracle@redhat ~]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.5.0 - Production on Tue Jan 21 13:57:57 2014
Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.

Connected to an idle instance.

SQL> startup mount
ORACLE instance started.

Total System Global Area  599785472 bytes
Fixed Size            2098112 bytes
Variable Size          163580992 bytes
Database Buffers      427819008 bytes
Redo Buffers            6287360 bytes
Database mounted.
SQL> alter database open resetlogs;

Database altered.

SQL> set linesize 200
set wrap off
col comp_name for a30
select substr(comp_name,1,40) comp_name, status, substr(version,1,10) version from dba_registry order by comp_name;
SQL> SQL> SQL>
COMP_NAME               STATUS                        VERSION
------------------------------ -------------------------------------------- ----------------------------------------
JServer JAVA Virtual Machine   VALID                        10.2.0.5.0
OLAP Analytic Workspace        VALID                        10.2.0.5.0
OLAP Catalog                   VALID                        10.2.0.5.0
Oracle Data Mining               VALID                        10.2.0.5.0
Oracle Database Catalog Views  VALID                        10.2.0.5.0
Oracle Database Java Packages  VALID                        10.2.0.5.0
Oracle Database Packages and T VALID                        10.2.0.5.0
Oracle Enterprise Manager      VALID                        10.2.0.5.0
Oracle Expression Filter       VALID                        10.2.0.5.0
Oracle OLAP API                VALID                        10.2.0.5.0
Oracle Rules Manager           VALID                        10.2.0.5.0
Oracle Text                       VALID                        10.2.0.5.0
Oracle Workspace Manager       VALID                        10.2.0.5.0
Oracle XDK                       VALID                        10.2.0.5.0
Oracle XML Database               VALID                        10.2.0.5.0
Oracle interMedia               VALID                        10.2.0.5.0
Spatial                        VALID                        10.2.0.5.0

17 rows selected.


8.3 还原oracle用户环境变量设置

8.4 还原操作系统参数配置

8.5 在旧ORACLE_HOME启动监听,最后进行连接测试,升级回退完毕!













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值