`

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]
第三部分 - 升级前工作
Step 1.
从11gR2的Oracle Home下拷贝以下文件至一个临时文件夹:
$ORACLE_HOME/rdbms/admin/utlu112i.sql

Step 2.
登陆数据库,运行:

$ sqlplus '/ as sysdba' 
SQL> spool upgrade_info.log
SQL> @utlu112i.sql
SQL> spool off
SQL>

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

Step 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

Step 4.
从10.2开始,CONNECT角色的权限变少了,所以如果你是从10.2之前升级到11g的话,升级之后,需要重新授予缺少的权限,但是如果是从10.2及之后升级到11g的话,就不需要重新赋权限了,本例是从10.2.0.4升级到11g的,因此不需要该步骤。

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

Step 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,具体看后面的步骤

Step 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]

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

$ sqlplus "/as sysdba"

SQL> EXEC DBMS_STATS.GATHER_DICTIONARY_STATS;



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

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

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

Step 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


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

SELECT DISTINCT(TRUNC(last_refresh))
FROM dba_snapshot_refresh_times;


Step 14.
确保当前没有文件需要介质恢复
SELECT * FROM v$recover_file;
上面语句没有返回结果才是正确的。

Step 15.
确保当前没有文件运行在备份模式下:
SELECT * FROM v$backup WHERE status != 'NOT ACTIVE';
上面语句没有返回结果才是正确的。

Step 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;


Step 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是处于同步的状态。

Step 18.
禁用所有的batch和cron jobs

Step 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;


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

SQL> SELECT owner,tablespace_name
     FROM dba_tables
     WHERE table_name='AUD$';

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

Step 21.
检查是否有外部认证的SSL用户:
SQL> SELECT name FROM sys.user$
     WHERE ext_username IS NOT NULL
     AND password = 'GLOBAL';
如果有,则在升级之后记得要做Step 34。

Step 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等文件。

Step 23.
停止listener:

$ lsnrctl stop

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

$ emctl stop dbconsole
$ isqlplusctl stop


Step 24.
关闭数据库:

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

接着对全库做个冷备。

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

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

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

第四部分 - 升级

Step 28.
升级前的检查步骤基本上已经完成了,在跑升级脚本之前,需要把相关参数改为指向新的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


Step 29.
前面所有的一切准备,都是为了这一步能成功执行,先把数据库起到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,确保数据库是好的。

第五部分 - 升级后工作

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

lsnrctl start


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

Step 32.
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

Step 33.
该步骤可省略。

Step 34.
升级外部认证SSL用户。
由于本例是从10.2升级到11g,所以可忽略该步骤。

Step 35.
如果在Step 9中,你关闭了Vault,则必须在此步骤重新启用。
Note 453903.1- Enabling and Disabling Oracle Database Vault in UNIX

Step 36.
忽略

Step 37.
创建spfile:

SQL> create spfile from pfile;


Step 38.
锁住系统用户,可忽略。

Step 39.
升级Oracle Text,可忽略。

Step 40.
升级Oracle Clusterware,可忽略。

Step 41.
配置EM,可忽略。

最后,记得修改compatible参数:

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

 

参考至:http://www.cnblogs.com/snake-hand/archive/2012/04/16/2452219.html

如有错误,欢迎指正

邮箱:czmcj@163.com

分享到:
评论

相关推荐

    oracle10g升级到11g

    在Oracle数据库系统中,从Oracle 10g升级到Oracle 11g是一个常见的需求,以获取新版本的功能和性能提升。以下是根据提供的描述和部分内容,整理出的升级步骤: 1. **准备工作** - 确保已有Oracle 10g的10.2.0.1...

    Oracle 11g 通过DBUA升级19C 详细过程

    ### Oracle 11g 通过 DBUA 升级至 19C 详细步骤 #### 一、前言 随着技术的发展与迭代,Oracle 为了确保用户能够享受到最新的功能及安全增强特性,会定期推出新的数据库版本,并逐渐淘汰旧版本。Oracle 11g 已经...

    oracle8升级到Oracle10g数据库升级脚本

    Oracle数据库是世界上最广泛使用的数据库系统之一,从Oracle 8到Oracle 10g的升级是一个重要的里程碑,因为Oracle 10g引入了许多新特性和性能优化。以下将详细阐述这个升级过程中涉及的关键知识点: 1. **版本兼容...

    Oracle 11g升级12c方案

    ### Oracle 11g 升级至 12c 方案详解 ...综上所述,从 Oracle 11g 升级到 12c 需要经过一系列的准备和实施步骤。遵循本文档提供的指南,能够有效地完成这一过程,并确保升级后的数据库运行稳定可靠。

    Oracle+10g-11g+XTTS迁移方案.pdf

    Oracle 10g 到 11g 的迁移是一个复杂的过程,涉及到多个步骤和技术,其中XTTS(Extreme Transaction Transport Services)是一种高级的数据迁移工具。XTTS是Oracle提供的一种用于在线数据迁移的技术,它允许在不中断...

    oracle10g 升级11g

    在进行Oracle数据库的版本升级过程中,特别是从Oracle 10g升级到Oracle 11g,需要遵循一定的步骤以确保数据的完整性和系统的稳定性。升级过程中,系统管理员和数据库管理员必须遵循官方文档的指导,同时需要有一定的...

    实验oracle9i升级到10g.pdf

    本文档详细阐述了从Oracle 9i升级到Oracle 10g的过程,特别聚焦于在HPUX操作系统下的升级流程。此次升级的目的在于迁移现有的Oracle 9.2.0.1数据库到更先进的Oracle 10.2.0.1版本,以利用后者带来的性能提升、新功能...

    Oracle数据库迁移升级详细步骤.docx

    Oracle数据库迁移升级是指将现有的Oracle数据库从低版本升级到高版本,或者将数据库从一台服务器迁移到另一台服务器,以提高数据库性能、安全性和可扩展性。以下是Oracle数据库迁移升级的详细步骤: 操作系统安装及...

    oracle10G 10.2.0.5 升级的操作手册

    Oracle 10g升级到10.2.0.5的操作流程是数据库管理员(DBA)必须掌握的关键技能之一,尤其是在需要与更高版本的Oracle数据库(如11g)进行兼容时。以下是对整个升级过程的详细说明: **一、环境描述** 在开始升级...

    Oracle 9i 11g历史库升级迁移数据至19c CDB.docx

    本文档详细介绍了从Oracle 9i/11g升级迁移至19c CDB的过程,包括不同环境下的升级策略和步骤,特别是在AIX到Linux的跨平台迁移过程中,提供了多种可行方案,以满足不同的需求。此外,还特别强调了字符集保留的重要性...

    Oracle10g_Linux安装步骤

    以下是对Oracle10g在Linux系统(如Fedora11)上安装的详细步骤的解析: 1. **配置安装环境** 在安装Oracle数据库之前,确保系统满足最低硬件和软件需求。Fedora11需要更新到最新补丁,以确保与Oracle10g兼容。检查...

    Linux_环境下_将oracle10g_升级至10[1].2.0.4

    在Linux环境下将Oracle 10g升级至10.2.0.4是一项较为复杂的技术工作,涉及到多个步骤和注意事项。以下是根据提供的部分文档内容整理出来的详细升级指南。 #### 1. 停止所有Oracle相关进程 升级前必须确保所有...

    oracle11g 导到 10g

    标题“Oracle 11g 导到 10g”...总之,从Oracle 11g迁移到10g是一项复杂的工作,涉及多个环节和细节,需要对数据库有深入的理解,以及谨慎的操作。在实际操作前,建议充分规划和测试,以确保迁移的成功和数据的完整性。

    oracle 10g 升级操作文档

    ### Oracle 10g 升级操作文档 #### 一、概述 本文档详细记录了Oracle 10.2.0.1版本升级至10.2.0.4的操作步骤与注意事项。Oracle数据库作为企业级应用的重要组成部分,其稳定性和性能对业务连续性至关重要。随着...

    10g升级11g文档.doc

    在从Oracle 10g升级到11g的过程中,首先要确保10g数据库的稳定运行,并且所有相关服务已停止,包括数据库实例、监听器、企业管理器(EM)和ISQL*Plus。升级步骤通常包括安装新版本的软件,然后使用DBUA(Database ...

    Oracle单实例版本升级(11g To 12c).docx

    在本篇文章中,我们将详细介绍 Oracle 单实例版本升级从 11g 到 12c 的过程。这个过程包括数据库升级准备工作、升级步骤和测试计划等几个方面。 数据库升级准备工作 在开始升级之前,需要进行数据库升级准备工作。...

    Oracle 10g 补丁

    Oracle 10g数据库是Oracle公司推出的一款关系型数据库管理系统,具有高性能、高可用性和安全性等特点。在系统升级过程中,可能会遇到各种问题,其中之一就是"oracleDBConsole"服务无法启动。这个问题通常与数据库的...

Global site tag (gtag.js) - Google Analytics