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$_SCHEDULESTABLE
如果有其它记录返回,则必须根据下面这篇文档把重复记录删除:
How to Clean Up Duplicate Objects Owned by SYS and SYSTEM Schema [ID 1030426.6]
第三部分 - 升级前工作
Step 1.
从11gR2的OracleHome下拷贝以下文件至一个临时文件夹:
$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 wner='SYS'
UNION
SELECT 'Analyze table "'||table_name||'" validate structure cascade;'
FROM dba_tables
WHERE wner='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 wner='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;

oracle 10G 升级到11G相关推荐

  1. oracle 10g升级到11g

    Linux 上Oracle RAC 10g 升级到 Oracle RAC 11g 了解如何在 Oracle Enterprise Linux 5 上逐步将 Oracle RAC 10g 第 2 版升级 ...

  2. Oracle 10g升级之--PSU 升级(续)

    Oracle 10g升级之--PSU升级(续) 5.再从10.2.0.4.4 升级到10.2.0.4.11 -----------升级到10.2.0.4.11 [oracle@RH4 12879929 ...

  3. oracle 10g clusterware,OracleClusterware10g/11g进程详解

    crsd :执行高可用性的恢复和管理操作:维护ocr,管理应用资源,该进程以root用户身份运行.该进程在由于故障意外断后会自动重启. The Oracle 10g Clusterware proce ...

  4. oracle 10g客户端连接11g,生产环境oracle10g升级至11g准备工作

    主要有以下的步骤 : 1.new ORACLE_HOME(11g), old ORACLE_HOME (10g) --这些需要提前提供给客户,作为基本的约定 2.install oracle soft ...

  5. oracle 10g 导入到11g

    方法一. 第一步,先从10g的主机中用cmd用exp语句导出dmp文件 第二步,在11g的主机中用cmd用imp语句导入dmp文件.

  6. oracle10g 6.0更改5.2,Oracle 10G 10.2.0.1升级到10.2.0.5

    oracle 10g升级 10.2.0.5 检查是否开了回收站,如果开了需要清空回收站. show recyclebin;查看回收站 purge table t1;清空回收站中指定的表 purge r ...

  7. oracle 9i 11g区别,oracle 9i 和oracle 10g 和oracle 11g有什么区别

    9i比8i多了哪些新特性? 简要说: 9i更易于管理. 详细说: 并发集群,8i OPS升级为9i RAC,8i结点间用硬盘交换信息,9i结点间采用高速网线的缓存熔合(Cache Fusion)技术交 ...

  8. 【Oracle健康检查脚本加量不加价】对Oracle 10g、11g和12c版本分别提供了只读版,并且加上了MySQL的健康检查...

    目前一共包含6个脚本,若脚本的扩展名为".sql"则表示该脚本为sql脚本,若脚本的扩展名为".pl"则表示该脚本为perl脚本. 对于SQL脚本而言,其中DB ...

  9. oracle 云服务器cpu升级,Oracle 10g RAC 升级(CPU Update)之--升级CRS

    Oracle 10g RAC 升级(CPU Update)之--升级CRS 发布时间:2020-07-16 09:13:19 来源:51CTO 阅读:593 作者:客居天涯 Oracle 10g RA ...

最新文章

  1. OnTimer定时器使用踩坑实例和使用方法
  2. Mongodb 与 Redis 调教
  3. SpringSecurity权限控制之异常处理方式三
  4. 增量式pid调节方式有何优点_增量式pid和位置式pid相比各有什么优缺点
  5. sqldataadapter.fill 索引超出了数组界限_小学生学习C++||第十五节 数组
  6. Android_自定义水波纹菜单弹出效果
  7. 三星Galaxy S22系列国行版获3C认证:依旧祖传25W快充
  8. HDMI和DVI的HDCP握手问题分析及其解决方案精粹
  9. 如何将PDF转换为DOCX?
  10. flutter 动画json_flutter常用内置动画组件
  11. python 点分十进制IP地址转16进制字符串
  12. 程序设计基础II学习笔记
  13. 时序动作检测《BMN: Boundary-Matching Network for Temporal Action Proposal Generation》
  14. gets和fgets函数及其区别,C语言gets和fgets函数详解
  15. linux远程判断目录是否存在,用shell判断远程主机上是否存在某个文件
  16. 用Enterprise Architect画类图和顺序图(一)
  17. ISCC 2022 部分
  18. Flink源码解析 | 从Example出发:理解Flink启动流程
  19. C语言 单片机 快速计算COS SIN
  20. 微信小程序爱江山更爱美人忘记服务器,爱江山更爱美人微信小程序

热门文章

  1. WebSocket是什么?如何去使用WebSocket?
  2. 爱尚黑莓提供Android应用转制BlackBerry 10应用在线工具
  3. 366API如何做到微信扫二维码无跳转调用外部浏览器页面
  4. Bean依赖注入的3种数据类型
  5. Linux系统编程笔记
  6. 如何解决安装好的google浏览器打不开网页的问题?
  7. 学生花卉网网页设计作品 学生鲜花网页模板 简单在线花店主页成品 鲜花网页制作 HTML学生花店商城网站作业设计
  8. 【产品】小白进阶之产品经理所应具备的素质模型
  9. 90后步入中年危机,互联网行业过了30岁就被嫌弃?
  10. 学位论文中章标题与图表题注自动编号的新技巧