您在这里:首页 > 学员专区 > 技术文章
Oracle视频
Oracle
CUUG课程

Oracle从10g升级到11g详细步骤

 

Oracle从10g升级到11g详细步骤数据库旧版本:10.2.0.4

数据库新版本:11.2.0.2

OS 版本: Solaris 10

参考文档:Complete Checklist for Manual Upgrades to 11gR2 [ID 837570.1]

 

第一部分 - 安装11gR2软件

这里对软件的安装就不详细说明了,可以参考相应的文档。

这里需要注意的是:如果你想在11gr2上打上最新的PSU或CPU,可以先在软件级别上打上PSU或CPU,这样就不用跑两次catbundle.sql,减少停机时

间。

 

第二部分 - 初步检查

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

select substr(comp_name,1,40) comp_name, status, substr(version,1,10) version from dba_registry order by comp_name;  --针对

组件

select substr(object_name,1,40) object_name,substr(owner,1,15) owner,object_type from dba_objects where status='INVALID'

order by owner,object_type; --针对对象

如果有invalid的对象,运行utlrp.sql重新编译对象。


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 wner = 'SYS') and wner = 'SYSTEM';

上面这条语句只能返回以下4条记录:

OBJECT_NAME                              OBJECT_TYPE

---------------------------------------- ---------------

DBMS_REPCAT_AUTH                         PACKAGE BODY

DBMS_REPCAT_AUTH                         PACKAGE

AQ$_SCHEDULES_PRIMARY                    INDEX

AQ$_SCHEDULES                            TABLE

如果有其它记录返回,则必须根据下面这篇文档把重复记录删除:

How to Clean Up Duplicate Objects Owned by SYS and SYSTEM Schema [ID 1030426.6]

 

第三部分 - 升级前工作

(1)从11gR2的Oracle Home下拷贝以下文件至一个临时文件夹:

$ORACLE_HOME/rdbms/admin/utlu112i.sql


(2)登陆数据库,运行:

$ sqlplus '/ as sysdba'

SQL> spool upgrade_info.log

SQL> @utlu112i.sql

SQL> spool off

SQL>

生成的upgrade_info.log里的内容很重要,后续步骤要根据该文件的内容做相应的修改,因此一定要保留下来。


(3)从下面这篇文档里可以下载到脚本dbupgdiag.sql:

Script. to Collect DB Upgrade/Migrate Diagnostic Information (dbupgdiag.sql) [ID 556610.1]

运行这个脚本:

cd <location of the script>

$ sqlplus / as sysdba

sql> alter session set nls_language='American';

sql> @dbupgdiag.sql

sql> exit

如果该脚本报告有invalid对象,运行以下命令重编译无效对象:

$ cd $ORACLE_HOME/rdbms/admin

$ sqlplus "/ as sysdba"

SQL> @utlrp.sql


(4)从10.2开始,CONNECT角色的权限变少了,所以如果你是从10.2之前升级到11g的话,升级之后,需要重新授予缺少的权限,但是如果是从

10.2及之后升级到11g的话,就不需要重新赋权限了,本例是从10.2.0.4升级到11g的,因此不需要该步骤。


(5)生成重建dblink的脚本,以防万一数据库需要降级。和Step 4一样,本例是从10.2.0.4升级到11g的,因此不需要该步骤。


(6)检查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,具体看后面的步骤

 

(7)检查国家字符集是否是UTF8或AL16UTF16:

select value from NLS_DATABASE_PARAMETERS where parameter = 'NLS_NCHAR_CHARACTERSET';

如果是,则什么都不用做;如果不是,那你就惨了,跟着下面长长的这篇文档一步一步做吧:

The National Character Set ( NLS_NCHAR_CHARACTERSET ) in Oracle 9i, 10g and 11g [ID 276914.1]

 

(8)收集统计信息,以减少停机时间:

$ sqlplus "/as sysdba"

SQL> EXEC DBMS_STATS.GATHER_DICTIONARY_STATS;

 

(9)如果你有开启Vault,那么你需要先在11gR2软件下禁用Vault,等升级结束后,再启用Vault,否则会在升级过程中报错。

 

(10)备份Enterprise Manager Database Control Data,因为本例并没有使用EM,所以不需要该步骤。

 

(11)配置网络ACL's,在本例中不需要配置。

 

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

Set verify off

Set space 0

Set line 120

Set heading off

Set feedback off

Set pages 1000

Spool analyze.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

生成的脚本名称是:analyze.sql

现在运行该脚本:

$ sqlplus "/ as sysdba"

SQL> @$ORACLE_HOME/rdbms/admin/utlvalid.sql

SQL> @analyze.sql

 

(13)确保所有的snapshot都已被成功刷新,且replication已被关闭:

SELECT DISTINCT(TRUNC(last_refresh))

FROM dba_snapshot_refresh_times;

 

(14)确保当前没有文件需要介质恢复:

SELECT * FROM v$recover_file;

上面语句没有返回结果才是正确的。

 

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

SELECT * FROM v$backup WHERE status != 'NOT ACTIVE';

上面语句没有返回结果才是正确的。

 

(16)解决分布式事务。

先查询是否还有分布式事务:

SQL> select * from dba_2pc_pending;

如果有返回结果,则:

SQL> SELECT local_tran_id

FROM dba_2pc_pending;

SQL> EXECUTE dbms_transaction.purge_lost_db_entry('');

SQL> COMMIT;

 

(17)检查是否有Standby数据库存在:

SELECT SUBSTR(value,INSTR(value,'=',INSTR(UPPER(value),'SERVICE'))+1)

FROM v$parameter

WHERE name LIKE 'log_archive_dest%' AND UPPER(value) LIKE 'SERVICE%';

如果有返回结果,则在升级之前,要保证Standby和Primary是处于同步的状态。

 

(18)禁用所有的batch和cron jobs

 

(19)确保用户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;

 

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

SQL> SELECT owner,tablespace_name

FROM dba_tables

WHERE table_name='AUD$';

如果不是,则要做相应的修改。

 

(21)检查是否有外部认证的SSL用户:

SQL> SELECT name FROM sys.user$

WHERE ext_username IS NOT NULL

AND password = 'GLOBAL';

如果有,则在升级之后记得要做Step 34。

 

(22)记下数据文件、联机日志文件和控制文件的位置:

SQL> SELECT name FROM v$controlfile;

SQL> SELECT file_name FROM dba_data_files;

SQL> SELECT group#, member FROM v$logfile;

且备份listener.ora, tnsnames.ora, sqlnet.ora等文件。

 

(23)停止listener:

$ lsnrctl stop

停止其它可执行程序,如dbconsole, isqlplus等

$ emctl stop dbconsole

$ isqlplusctl stop

 

(24)关闭数据库:

$ sqlplus "/as sysdba"

SQL> shutdown immediate;

接着对全库做个冷备。

 

(25)以10g的pfile为模板,并根据Step 2生成的upgrade_info.log里的建议,为11g创建一个新的pfile。

 

(26)如果数据库原本是运行在archive模式下,最好先改为noarchive,这样可以减少升级停机时间,升级成功后再重新改回archive模式。

 

(27)该步骤是针对Windows系统的,本例略过。

 


第四部分 - 升级

 

(1)升级前的检查步骤基本上已经完成了,在跑升级脚本之前,需要把相关参数改为指向新的11g软件:

$ export ORACLE_HOME=<location of Oracle 11.2>

$ export PATH=$ORACLE_HOME/bin:$PATH

$ export ORACLE_BASE=<Oracle_Base set during installation>

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

Sample /etc/oratab

#orcl:/opt/oracle/product/10.2/db_1:N

orcl:/opt/oracle/product/11.2/db_1:N

 

(2)前面所有的一切准备,都是为了这一步能成功执行,先把数据库起到upgrade状态:

$ cd $ORACLE_HOME/rdbms/admin

$ sqlplus "/ as sysdba"

SQL> startup UPGRADE

接着开始跑升级脚本:

SQL> set echo on

SQL> SPOOL upgrade.log

SQL> @catupgrd.sql

SQL> spool off

这个脚本大概持续1.5个小时,脚本的最后会自动关闭数据库。升级脚本跑完之后,再跑下面这个脚本,检查数据库状态:

$ sqlplus "/as sysdba"

SQL> STARTUP

SQL> @utlu112s.sql

如果该报告中包含错误,请查阅相关文档解决,直到没有错误之后,再跑下面的脚本:

SQL> @catuppst.sql

前面的升级脚本是运行在upgrade模式下,该脚本主要是在open模式下做些升级动作,不需要花很多时间。

接着重新编译一下无效对象:

SQL> @utlrp.sql

最后,再跑一下Step 3中的dbupgdiag.sql,确保数据库是好的。

 


第五部分 - 升级后工作

 

(1)修改listener.ora,使listener执行新的11g Home,然后重新启动listener:

lsnrctl start

 

(2)再次检查Step 28中设置的环境变量确实是指向了新的11g Home。


(3)Timezone数据库层面的升级。

注意:该步骤是否执行是和Step 6中的检查结果相关的,只有当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 version FROM v$timezone_file;

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

 

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


(3)该步骤可省略。

 

(4)升级外部认证SSL用户。

由于本例是从10.2升级到11g,所以可忽略该步骤。

 

(5)如果在Step 9中,你关闭了Vault,则必须在此步骤重新启用。

Note 453903.1- Enabling and Disabling Oracle Database Vault in UNIX

 

 

(6)创建spfile:

SQL> create spfile from pfile;

 

(7)锁住系统用户,可忽略。

 

(8)升级Oracle Text,可忽略。

 

(9)升级Oracle Clusterware,可忽略。

 

(10)配置EM,可忽略。

(11)记得修改compatible参数:

SQL> ALTER SYSTEM SET COMPATIBLE = ’11.2.0’ SCOPE=SPFILE;


(文章来自网络,如有侵权请来信告知,本站将在第一时间删除。)

相关文章 [上一篇] Oracle 11G新特性(共36个)
010-88589926(88587026)
CUUG热门培训课程
Oracle DBA就业培训
CUUG名师
网络课程
技术沙龙
最新动态

总机:(010)-88589926,88589826,88587026 QQ讨论群:243729577 182441349 邮箱:cuug_bj@cuug.com
通信地址:北京市海淀区紫竹院路98号北京化工大学科技园609室(CUUG)邮政编码:100089 
中国UNIX用户协会 Copyright 2010  ALL Rights Reserved 北京神脑资讯技术有限公司
京ICP备11008061号  京公网安备110108006275号