Oracle从10g升级到11g详细步骤数据库旧版本:10.2.0.4数据库新版本:11.2.0.2OS版本:Solaris10参考文档:CompleteChecklistforManualUpgradesto11gR2[ID837570.1]第一部分-安装11gR2软件这里对软件的安装就不详细说明了,可以参考相应的文档。这里需要注意的是:如果你想在11gr2上打上最新的PSU或CPU,可以先在软件级别上打上PSU或CPU,这样就不用跑两次catbundle.sql,减少停机时间。第二部分-初步检查1.在升级之前,确保所有的组件和对象都是valid:selectsubstr(comp_name,1,40)comp_name,status,substr(version,1,10)versionfromdba_registryorderbycomp_name;--针对组件selectsubstr(object_name,1,40)object_name,substr(owner,1,15)owner,object_typefromdba_objectswherestatus='INVALID'orderbyowner,object_type;--针对对象如果有invalid的对象,运行utlrp.sql重新编译对象。2.确保sys和system下没有重复的对象:selectobject_name,object_typefromdba_objectswhereobject_name||object_typein(selectobject_name||object_typefromdba_objectswherewner='SYS')andwner='SYSTEM';上面这条语句只能返回以下4条记录:OBJECT_NAMEOBJECT_TYPE-------------------------------------------------------DBMS_REPCAT_AUTHPACKAGEBODYDBMS_REPCAT_AUTHPACKAGEAQ$_SCHEDULES_PRIMARYINDEXAQ$_SCHEDULESTABLE如果有其它记录返回,则必须根据下面这篇文档把重复记录删除:HowtoCleanUpDuplicateObjectsOwnedbySYSandSYSTEMSchema[ID1030426.6]第三部分-升级前工作Step1.从11gR2的OracleHome下拷贝以下文件至一个临时文件夹:$ORACLE_HOME/rdbms/admin/utlu112i.sqlStep2.登陆数据库,运行:$sqlplus'/assysdba'SQLspoolupgrade_info.logSQL@utlu112i.sqlSQLspooloffSQL生成的upgrade_info.log里的内容很重要,后续步骤要根据该文件的内容做相应的修改,因此一定要保留下来。Step3.从下面这篇文档里可以下载到脚本dbupgdiag.sql:Script.toCollectDBUpgrade/MigrateDiagnosticInformation(dbupgdiag.sql)[ID556610.1]运行这个脚本:cdlocationofthescript$sqlplus/assysdbasqlaltersessionsetnls_language='American';sql@dbupgdiag.sqlsqlexit如果该脚本报告有invalid对象,运行以下命令重编译无效对象:$cd$ORACLE_HOME/rdbms/admin$sqlplus/assysdbaSQL@utlrp.sqlStep4.从10.2开始,CONNECT角色的权限变少了,所以如果你是从10.2之前升级到11g的话,升级之后,需要重新授予缺少的权限,但是如果是从10.2及之后升级到11g的话,就不需要重新赋权限了,本例是从10.2.0.4升级到11g的,因此不需要该步骤。Step5.生成重建dblink的脚本,以防万一数据库需要降级。和Step4一样,本例是从10.2.0.4升级到11g的,因此不需要该步骤。Step6.检查Timezone版本,主要参考:ActionsForDSTUpdatesWhenUpgradingToOrApplyingThe11.2.0.2Patchset[ID1201253.1]注意:11g的软件里已经自带了版本1-14的Timezone。先检查一下当前timezone版本:SQLconn/assysdbaConnected.SQLSELECTversionFROMv$timezone_file;根据当前timezone的版本,又分三种情况:1)等于14:这已经是11g需要的版本了,所以升级前后都不需要做任何事,这种情况很罕见。2)高于14:升级前,必须得给11g软件打上该timezone版本的DST补丁,这种情况也很罕见。3)低于14:大多数都是这种情况,在升级前不需要在11g软件层面打补丁,在升级后需要再数据库层面将Timezone升级至14,具体看后面的步骤Step7.检查国家字符集是否是UTF8或AL16UTF16:selectvaluefromNLS_DATABASE_PARAMETERSwhereparameter='NLS_NCHAR_CHARACTERSET';如果是,则什么都不用做;如果不是,那你就惨了,跟着下面长长的这篇文档一步一步做吧:TheNationalCharacterSet(NLS_NCHAR_CHARACTERSET)inOracle9i,10gand11g[ID276914.1]Step8.收集统计信息,以减少停机时间:$sqlplus/assysdbaSQLEXECDBMS_STATS.GATHER_DICTIONARY_STATS;Step9.如果你有开启Vault,那么你需要先在11gR2软件下禁用Vault,等升级结束后,再启用Vault,否则会在升级过程中报错。Step10.备份EnterpriseManagerDatabaseControlData,因为本例并没有使用EM,所以不需要该步骤。Step11.配置网络ACL's,在本例中不需要配置。Step12.使用以下语句生产分析数据字典的脚本(assysdba):SetverifyoffSetspace0Setline120SetheadingoffSetfeedbackoffSetpages1000Spoolanalyze.sqlSELECT'Analyzecluster'||cluster_name||'validatestructurecascade;'FROMdba_clustersWHEREwner='SYS'UNIONSELECT'Analyzetable'||table_name||'validatestructurecascade;'FROMdba_tablesWHEREwner='SYS'ANDpartitioned='NO'AND(iot_type='IOT'ORiot_typeisNULL)UNIONSELECT'Analyzetable'||table_name||'validatestructurecascadeintoinvalid_rows;'FROMdba_tablesWHEREwner='SYS'ANDpartitioned='YES';spooloff生成的脚本名称是:analyze.sql现在运行该脚本:$sqlplus/assysdbaSQL@$ORACLE_HOME/rdbms/admin/utlvalid.sqlSQL@analyze.sqlStep13.确保所有的snapshot都已被成功刷新,且replication已被关闭:SELECTDISTINCT(TRUNC(last_refresh))FROMdba_snapshot_refresh_times;Step14.确保当前没有文件需要介质恢复:SELECT*FROMv$recover_file;上面语句没有返回结果才是正确的。Step15.确保当前没有文件运行在备份模式下:SELECT*FROMv$backupWHEREstatus!='NOTACTIVE';上面语句没有返回结果才是正确的。Step16.解决分布式事务。先查询是否还有分布式事务:SQLselect*fromdba_2pc_pending;如果有返回结果,则:SQLSELECTlocal_tran_idFROMdba_2pc_pending;SQLEXECUTEdbms_transaction.purge_lost_db_entry('');SQLCOMMIT;Step17.检查是否有Standby数据库存在:SELECTSUBSTR(value,INSTR(value,'=',INSTR(UPPER(value),'SERVICE'))+1)FROMv$parameterWHEREnameLIKE'log_archive_dest%'ANDUPPER(value)LIKE'SERVICE%';如果有返回结果,则在升级之前,要保证Standby和Primary是处于同步的状态。Step18.禁用所有的batch和cronjobsStep19.确保用户SYS和SYSTEM的默认表空间都是SYSTEM:SQLSELECTusername,default_tablespaceFROMdba_usersWHEREusernamein('SYS','SYSTEM');如果不是,则要用以下语句修改为SYSTEM:SQLALTERuserSYSdefaulttablespaceSYSTEM;SQLALTERuserSYSTEMdefaulttablespaceSYSTEM;Step20.确保AUD$表建在SYS用户下和SYSTEM表空间下:SQLSELECTowner,tablespace_nameFROMdba_tablesWHEREtable_name='AUD$';如果不是,则要做相应的修改。Step21.检查是否有外部认证的SSL用户:SQLSELECTnameFROMsys.user$WHEREext_usernameISNOTNULLANDpassword='GLOBAL';如果有,则在升级之后记得要做Step34。Step22.记下数据文件、联机日志文件和控制文件的位置:SQLSELECTnameFROMv$controlfile;SQLSELECTfile_nameFROMdba_data_files;SQLSELECTgroup#,memberFROMv$logfile;且备份listener.ora,tnsnames.ora,sqlnet.ora等文件。Step23.停止listener:$lsnrctlstop停止其它可执行程序,如dbconsole,isqlplus等$emctlstopdbconsole$isqlplusctlstopStep24.关闭数据库:$sqlplus/assysdbaSQLshutdownimmediate;接着对全库做个冷备。Step25.以10g的pfile为模板,并根据Step2生成的upgrade_info.log里的建议,为11g创建一个新的pfile。Step26.如果数据库原本是运行在archive模式下,最好先改为noarchive,这样可以减少升级停机时间,升级成功后再重新改回archive模式。Step27.该步骤是针对Windows系统的,本例略过。第四部分-升级Step28.升级前的检查步骤基本上已经完成了,在跑升级脚本之前,需要把相关参数改为指向新的11g软件:$exportORACLE_HOME=locationofOracl