Oracle从10g升级到11g详细操作步骤.docx
《Oracle从10g升级到11g详细操作步骤.docx》由会员分享,可在线阅读,更多相关《Oracle从10g升级到11g详细操作步骤.docx(15页珍藏版)》请在冰豆网上搜索。
Oracle从10g升级到11g详细操作步骤
Oracle从10g升级到11g详细步骤
数据库旧版本:
10.2.0.4
数据库新版本:
11.2.0.2
OS版本:
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_AUTHPACKAGEBODY
DBMS_REPCAT_AUTHPACKAGE
AQ$_SCHEDULES_PRIMARYINDEX
AQ$_SCHEDULESTABLE
如果有其它记录返回,则必须根据下面这篇文档把重复记录删除:
HowtoCleanUpDuplicateObjectsOwnedbySYSandSYSTEMSchema[ID1030426.6]
第三部分-升级前工作
Step1.
从11gR2的OracleHome下拷贝以下文件至一个临时文件夹:
$ORACLE_HOME/rdbms/admin/utlu112i.sql
Step2.
登陆数据库,运行:
$sqlplus'/assysdba'
SQL>spoolupgrade_info.log
SQL>@utlu112i.sql
SQL>spooloff
SQL>
生成的upgrade_info.log里的内容很重要,后续步骤要根据该文件的内容做相应的修改,因此一定要保留下来。
Step3.
从下面这篇文档里可以下载到脚本
dbupgdiag.sql:
Script.toCollectDBUpgrade/MigrateDiagnosticInformation(dbupgdiag.sql)[ID556610.1]
运行这个脚本:
cd
$sqlplus/assysdba
sql>altersessionsetnls_language='American';
sql>@dbupgdiag.sql
sql>exit
如果该脚本报告有invalid对象,运行以下命令重编译无效对象:
$cd$ORACLE_HOME/rdbms/admin
$sqlplus"/assysdba"
SQL>@utlrp.sql
Step4.
从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版本:
SQL>conn/assysdba
Connected.
SQL>SELECTversionFROMv$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"/assysdba"
SQL>EXECDBMS_STATS.GATHER_DICTIONARY_STATS;
Step9.
如果你有开启Vault,那么你需要先在11gR2软件下禁用Vault,等升级结束后,再启用Vault,否则会在升级过程中报错。
Step10.
备份EnterpriseManagerDatabaseControl
Data
,因为本例并没有使用EM,所以不需要该步骤。
Step11.
配置网络ACL's,在本例中不需要配置。
Step12.
使用以下语句生产分析数据字典的脚本(assysdba):
Setverifyoff
Setspace0
Setline120
Setheadingoff
Setfeedbackoff
Setpages1000
Spoolanalyze.sql
SELECT'Analyzecluster"'||cluster_name||'"validatestructurecascade;'
FROMdba_clusters
WHEREwner='SYS'
UNION
SELECT'Analyzetable"'||table_name||'"validatestructurecascade;'
FROMdba_tables
WHEREwner='SYS'
ANDpartitioned='NO'
AND(iot_type='IOT'ORiot_typeisNULL)
UNION
SELECT'Analyzetable"'||table_name||'"validatestructurecascadeintoinvalid_rows;'
FROMdba_tables
WHEREwner='SYS'
ANDpartitioned='YES';
spooloff
生成的脚本名称是:
analyze.sql
现在运行该脚本:
$sqlplus"/assysdba"
SQL>@$ORACLE_HOME/rdbms/admin/utlvalid.sql
SQL>@analyze.sql
Step13.
确保所有的snapshot都已被成功刷新,且replication已被关闭:
SELECTDISTINCT(TRUNC(last_refresh))
FROMdba_snapshot_refresh_times;
Step14.
确保当前没有文件需要介质
恢复:
SELECT*FROMv$recover_file;
上面语句没有返回结果才是正确的。
Step15.
确保当前没有文件运行在
备份
模式下:
SELECT*FROMv$backupWHEREstatus!
='NOTACTIVE';
上面语句没有返回结果才是正确的。
Step16.
解决分布式事务。
先查询是否还有分布式事务:
SQL>select*fromdba_2pc_pending;
如果有返回结果,则:
SQL>SELECTlocal_tran_id
FROMdba_2pc_pending;
SQL>EXECUTEdbms_transaction.purge_lost_db_entry('');
SQL>COMMIT;
Step17.
检查是否有Standby数据库存在:
SELECTSUBSTR(value,INSTR(value,'=',INSTR(UPPER(value),'SERVICE'))+1)
FROMv$parameter
WHEREnameLIKE'log_archive_dest%'ANDUPPER(value)LIKE'SERVICE%';
如果有返回结果,则在升级之前,要保证Standby和Primary是处于同步的状态。
Step18.
禁用所有的batch和cronjobs
Step19.
确保用户SYS和SYSTEM的默认表空间都是SYSTEM:
SQL>SELECTusername,default_tablespace
FROMdba_users
WHEREusernamein('SYS','SYSTEM');
如果不是,则要用以下语句修改为SYSTEM:
SQL>ALTERuserSYSdefaulttablespaceSYSTEM;
SQL>ALTERuserSYSTEMdefaulttablespaceSYSTEM;
Step20.
确保AUD$表建在SYS用户下和SYSTEM表空间下:
SQL>SELECTowner,tablespace_name
FROMdba_tables
WHEREtable_name='AUD$';
如果不是,则要做相应的修改。
Step21.
检查是否有外部认证的SSL用户:
SQL>SELECTnameFROMsys.user$
WHEREext_usernameISNOTNULL
ANDpassword='GLOBAL';
如果有,则在升级之后记得要做Step34。
Step22.
记下数据文件、联机日志文件和控制文件的位置:
SQL>SELECTnameFROMv$controlfile;
SQL>SELECTfile_nameFROMdba_data_files;
SQL>SELECTgroup#,memberFROMv$logfile;
且备份listener.ora,tnsnames.ora,sqlnet.ora等文件。
Step23.
停止listener:
$lsnrctlstop
停止其它可执行程序,如dbconsole,isqlplus等
$emctlstopdbconsole
$isqlplusctlstop
Step24.
关闭数据库:
$sqlplus"/assysdba"
SQL>shutdownimmediate;
接着对全库做个冷备。
Step25.
以10g的pfile为模板,并根据Step2生成的upgrade_info.log里的建议,为11g创建一个新的pfile。
Step26.
如果数据库原本是运行在archive模式下,最好先改为noarchive,这样可以减少升级停机时间,升级成功后再重新改回archive模式。
Step27.
该步骤是针对Windows系统的,本例略过。
第四部分-升级
Step28.
升级前的检查步骤基本上已经完成了,在跑升级脚本之前,需要把相关参数改为指向新的11g软件:
$exportORACLE_HOME=
$exportPATH=$ORACLE_HOME/bin:
$PATH
$exportORACLE_BASE=
接着修改oratab中的内容,使其指向新的11gHome目录:
Sample/etc/oratab
#orcl:
/opt/oracle/product/10.2/db_1:
N
orcl:
/opt/oracle/product/11.2/db_1:
N
Step29.
前面所有的一切准备,都是为了这一步能成功执行,先把数据库起到upgrade状态:
$cd$ORACLE_HOME/rdbms/admin
$sqlplus"/assysdba"
SQL>startupUPGRADE
接着开始跑升级脚本:
SQL>setechoon
SQL>SPOOLupgrade.log
SQL>@catupgrd.sql
SQL>spooloff
这个脚本大概持续1.5个小时,脚本的最后会自动关闭数据库。
升级脚本跑完之后,再跑下面这个脚本,检查数据库状态:
$sqlplus"/assysdba"
SQL>STARTUP
SQL>@utlu112s.sql
如果该报告中包含错误,请查阅相关文档解决,直到没有错误之后,再跑下面的脚本:
SQL>@catuppst.sql
前面的升级脚本是运行在upgrade模式下,该脚本主要是在open模式下做些升级动作,不需要花很多时间。
接着重新编译一下无效对象:
SQL>@utlrp.sql
最后,再跑一下Step3中的
dbupgdiag.sql,确保数据库是好的。
第五部分-升级后工作
Step30.
修改listener.ora,使listener执行新的11gHome,然后重新启动listener:
lsnrctlstart
Step31.
再次检查Step28中设置的环境变量确实是指向了新的11gHome。
Step32.
Timezone数据库层面的升级。
注意:
该步骤是否执行是和Step6中的检查结果相关的,只有当Timezone的版本小于14时,才需要执行该步骤。
主要参考:
UpdatingtheRDBMSDSTversionin11gR2(11.2.0.1andup)usingDBMS_DST[ID977512.1]
1)Timezone升级前的准备工作:
先检查一下当前的timezone版本:
conn/assysdba
SELECTversionFROMv$timezone_file;
SELECTPROPERTY_NAME,SUBSTR(property_value,1,30)valueFROMDATABASE_PROPERTIESWHEREPROPERTY_NAMELIKE'DST_%'ORDERBYPROPERTY_NAME;
一个典型的输出是:
PROPERTY_NAMEVALUE
------------------------------------------------------------
DST_PRIMARY_TT_VERSION4
DST_SECONDARY_TT_VERSION0
DST_UPGRADE_STATENONE
然后开始准备工作:
altersessionset"_with_subquery"=materialize;
execDBMS_DST.BEGIN_PREPARE(14)
;
接着检查准备状态:
SELECTPROPERTY_NAME,SUBSTR(property_value,1,30)value
FROMDATABASE_PROPERTIES
WHEREPROPERTY_NAMELIKE'DST_%'
ORDERBYPROPERTY_NAME;
一个典型的输出是:
PROPERTY_NAMEVALUE
------------------------------------------------------------
DST_PRIMARY_TT_VERSION4
DST_SECONDARY_TT_VERSION14
DST_UPGRADE_STATEPREPARE
--truncateloggingtablesiftheyexist.
TRUNCATETABLESYS.DST$TRIGGER_TABLE;
TRUNCATETABLEsys.dst$affected_tables;
TRUNCATETABLEsys.dst$error_table;
--logaffecteddata
setserveroutputon
BEGIN
DBMS_DST.FIND_AFFECTED_TABLES
(affected_tables=>'sys.dst$affected_tables',
log_errors=>TRUE,
log_errors_table=>'sys.dst$error_table');
END;
/
下面的语句都不能有返回结果:
SELECT*FROMsys.dst$affected_tables;
SELECT*FROMsys.dst$error_table;
SELECT*FROMsys.dst$error_tablewhereERROR_NUMBER='1883';
SELECT*FROMsys.dst$error_tablewhereERROR_NUMBER='1878';
SELECT*FROMsys.dst$error_tablewhereERROR_NUMBERnotin('1878','1883');
--endpreparewindow,therowsabovewillstayinthosetables.
EXECDBMS_DST.END_PREPARE;
--checkifthisisended
SELECTPROPERTY_NAME,SUBSTR(property_value,1,30)value
FROMDATABASE_PROPERTIES
WHEREPROPERTY_NAMELIKE'DST_%'
ORDERBYPROPERTY_NAME;
一个典型的输出是:
PROPERTY_NAMEVALUE
------------------------------------------------------------
DST_PRIMARY_TT_VERSION4
DST_SECONDARY_TT_VERSION0
DST_UPGRADE_STATENONE
2)真正开始升级Timezone
conn/assysdba
shutdownimmediate;
startupupgrade;
setserveroutputon
purgedba_recyclebin;
TRUNCATETABLESYS.DST$TRIGGER_TABLE;
TRUNCATETABLEsys.dst$affected_tables;
TRUNCATETABLEsys.dst$error_table;
altersessionset"_with_subquery"=materialize;
EXECDBMS_DST.BEGIN_UPGRADE(14);
SELECTPROPERTY_NAME,SUBSTR(property_value,1,30)value
FROMDATABASE_PROPERTIES
WHEREPROPERTY_NAMELIKE'DST_%'
ORDERBYPROPERTY_NAME;
一个典型的输出是:
PROPERTY_NAMEVALUE
------------------------------------------------------------
DST_PRIMARY_TT_VERSION14
DST_SECONDARY_TT_VERSION4
DST_UPGRADE_STATEUPGRADE
下面这条语句应该没有返回结果:
SELECTOWNER,TABLE_NAME,UPGRADE_IN_PROGRESSFROMALL_TSTZ_TABLESwhereUPGRADE_IN_PROGRESS='YES';
重启数据库:
shutdownimmediate
startup
升级相关的table:
altersessionset"_with_subquery"=materialize;
setserveroutputon
VARnumfailnumber
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