windows XP下 oracle10.2.0.4 升级到oracle11.2.0.1

时间:2022-01-22 07:42:25
此文章是承接上一篇 《windows XP oracle10.2.0.1 升级到oracle11.2.0.4》而做的升级。 在完全升级好之后的10.2.0.4 版本后
一、安装oracle11.2.0.1
    不用多说。记得安装不同的目录下面。仅仅安装软件不安装数据库。
二、检查环境
1. 在升级之前,确保所有的组件和对象都是valid:
     
     
  1. select substr(comp_name,1,40) comp_name, status, substr(version,1,10) version 
  2. from dba_registry order by comp_name; 
  3. 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; --针对对象

三、准备环境

拷贝以下文件。到你准备执行这个脚本
   
   
  1. %ORACLE_HOME%/rdbms/admin/utlu112i.sql
    
    
  1. sqlplus / as sysdba'
  2. SQL> spool upgrade_info.log
  3. SQL> @utlu112i.sql
  4. SQL> spool off
  5. SQL>
生成的upgrade_info.log里的内容很重要,后续步骤要根据该文件的内容做相应的修改,因此一定要保留下来。
    
四、     1.从下面这篇文档里可以下载到脚本dbupgdiag.sql: Script. to Collect DB Upgrade/Migrate Diagnostic Information (dbupgdiag.sql) [ID 556610.1]

    2.运行这个脚本:
    
    
  1. cd <location of the script>
  2. sqlplus / as sysdba
  3. sql> alter session set nls_language='American';
  4. sql> @dbupgdiag.sql

    3.如果该脚本报告有invalid对象,运行以下命令重编译无效对象:
    
    
  1. cd %ORACLE_HOME%/rdbms/admin
  2. sqlplus / as sysdba
  3. SQL> @utlrp.sql
    4.注意事项connect角色。        从10.2开始,CONNECT角色的权限变少了,所以如果你是从10.2之前升级到11g的话,升级之后,需要重新授予缺少的权限,但是如果是从10.2及之后升级到11g的话,就不需要重新赋权限了,本例是从10.2.0.4升级到11g的,因此不需要该步骤。
    5.检查国家字符集是否是UTF8或AL16UTF16:
     
     
  1. 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]

    6.收集统计信息,以减少停机时间:
     
     
  1. sqlplus /as sysdba
  2. SQL> EXEC DBMS_STATS.GATHER_DICTIONARY_STATS;
    7.VAULT    如果你有开启Vault,那么你需要先在11gR2软件下禁用Vault,等升级结束后,再启用Vault,否则会在升级过程中报错。

    8.使用以下语句生产分析数据字典的脚本 (as sysdba):
     
     
  1. Set verify off
  2. Set space 0
  3. Set line 120
  4. Set heading off
  5. Set feedback off
  6. Set pages 1000
  7. Spool analyze.sql
  8. SELECT 'Analyze cluster "'||cluster_name||'" validate structure cascade;'
  9. FROM dba_clusters
  10. WHERE owner='SYS'
  11. UNION
  12. SELECT 'Analyze table "'||table_name||'" validate structure cascade;'
  13. FROM dba_tables
  14. WHERE owner='SYS'
  15. AND partitioned='NO'
  16. AND (iot_type='IOT' OR iot_type is NULL)
  17. UNION
  18. SELECT 'Analyze table "'||table_name||'" validate structure cascade into invalid_rows;'
  19. FROM dba_tables
  20. WHERE owner='SYS'
  21. AND partitioned='YES';
  22. spool off
生成的脚本名称是:analyze.sql
现在运行该脚本:
       
       
  1. sqlplus / as sysdba
  2. SQL> @%ORACLE_HOME%/rdbms/admin/utlvalid.sql
  3. SQL> @analyze.sql
    9.确保当前没有文件需要介质恢复
       
       
  1. SELECT * FROM v$recover_file;

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

    11.解决分布式事务。
    先查询是否还有分布式事务:
     
     
  1. SQL> select * from dba_2pc_pending; 

    如果有返回结果,则:
     
     
  1. SQL> SELECT local_tran_id
  2.      FROM dba_2pc_pending;
  3. SQL> EXECUTE dbms_transaction.purge_lost_db_entry('');
  4. SQL> COMMIT;
    12.检查是否有Standby数据库存在:
      
      
  1. SELECT SUBSTR(value,INSTR(value,'=',INSTR(UPPER(value),'SERVICE'))+1)
  2. FROM v$parameter
  3. WHERE name LIKE 'log_archive_dest%' AND UPPER(value) LIKE 'SERVICE%';

    如果有返回结果,则在升级之前,要保证Standby和Primary是处于同步的状态。
    13.禁用所有的batch和cron jobs
    14.确保用户SYS和SYSTEM的默认表空间都是SYSTEM:
     
     
  1. SQL> SELECT username, default_tablespace
  2.      FROM dba_users
  3.      WHERE username in ('SYS','SYSTEM'); 

    如果不是,则要用以下语句修改为SYSTEM:
     
     
  1. SQL> ALTER user SYS default tablespace SYSTEM;
  2. SQL> ALTER user SYSTEM default tablespace SYSTEM;

    15.确保AUD$表建在SYS用户下和SYSTEM表空间下:
     
     
  1. SQL> SELECT owner,tablespace_name
  2.      FROM dba_tables
  3.      WHERE table_name='AUD$';

    如果不是,则要做相应的修改。    16.检查是否有外部认证的SSL用户:
    
    
  1. SQL> SELECT name FROM sys.user$
  2.      WHERE ext_username IS NOT NULL
  3.      AND password = 'GLOBAL';

    如果有,则在升级之后记得要做。
    17.记下数据文件、联机日志文件和控制文件的位置:
   
   
  1. SQL> SELECT name FROM v$controlfile;
  2. SQL> SELECT file_name FROM dba_data_files;
  3. SQL> SELECT group#, member FROM v$logfile;

     且备份listener.ora, tnsnames.ora, sqlnet.ora等文件     18.停止listener:
    
    
  1. lsnrctl stop

停止其它可执行程序,如dbconsole, isqlplus等
    
    
  1. emctl stop dbconsole
  2. isqlplusctl stop

    19.关闭数据库:
      
      
  1. sqlplus "/as sysdba"
  2. SQL> shutdown immediate;
接着对全库做个冷备。

    20.如果数据库原本是运行在archive模式下,最好先改为noarchive,这样可以减少升级停机时间,升级成功后再重新改回archive模式。
    21.升级前的检查步骤基本上已经完成了,在跑升级脚本之前,需要把相关参数改为指向新的11g软件:
     
     
  1. set ORACLE_HOME=<location of Oracle 11.2>
  2. set PATH=%ORACLE_HOME%/bin:%PATH%
  3. set ORACLE_BASE=<Oracle_Base set during installation>

    22.前面所有的一切准备,都是为了这一步能成功执行,先把数据库起到upgrade状态:
     
     
  1. cd %ORACLE_HOME%/rdbms/admin
  2. sqlplus / as sysdba
  3. SQL> startup UPGRADE

接着开始跑升级脚本:
     
     
  1. SQL> set echo on
  2. SQL> SPOOL upgrade.log
  3. SQL> @catupgrd.sql
  4. SQL> spool off

这个脚本大概持续1.5个小时,脚本的最后会自动关闭数据库。升级脚本跑完之后,再跑下面这个脚本,检查数据库状态:
     
     
  1. sqlplus /as sysdba
  2. SQL> STARTUP
  3. SQL> @utlu112s.sql

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

前面的升级脚本是运行在upgrade模式下,该脚本主要是在open模式下做些升级动作,不需要花很多时间。
接着重新编译一下无效对象:
     
     
  1. SQL> @utlrp.sql

最后,再跑一下Step 3中的dbupgdiag.sql,确保数据库是好的。
升级之后的操作:
    23.修改listener.ora,使listener执行新的11g Home,然后重新启动listener:
      
      
  1.     lsnrctl start
    24.Timezone数据库层面的升级。
检查Timezone版本,主要参考:
Actions For DST Updates When Upgrading To Or Applying The 11.2.0.2 Patchset [ID 1201253.1]
注意:11g的软件里已经自带了版本1-14的Timezone。
先检查一下当前timezone版本:
      
      
  1. SQL> conn / as sysdba
  2. Connected.
  3. SQL>SELECT version FROM v$timezone_file;

根据当前timezone的版本,又分三种情况:
1)等于14:这已经是11g需要的版本了,所以升级前后都不需要做任何事,这种情况很罕见。
2)高于14:升级前,必须得给11g软件打上该timezone版本的DST补丁,这种情况也很罕见。
3)低于14:大多数都是这种情况,在升级前不需要在11g软件层面打补丁,在升级后需要再数据库层面将Timezone升级至14,具体看后面的步骤

主要参考:
Updating the RDBMS DST version in 11gR2 (11.2.0.1 and up) using DBMS_DST [ID 977512.1]
1)Timezone升级前的准备工作:
先检查一下当前的timezone版本:
      
      
  1. conn / as sysdba
  2. SELECT version FROM v$timezone_file;
  3. SELECT PROPERTY_NAME, SUBSTR(property_value, 1, 30) value FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME LIKE 'DST_%' ORDER BY PROPERTY_NAME;

一个典型的输出是:
      
      
  1. PROPERTY_NAME                  VALUE
  2. ------------------------------ ------------------------------
  3. DST_PRIMARY_TT_VERSION         4
  4. DST_SECONDARY_TT_VERSION       0
  5. DST_UPGRADE_STATE              NONE

然后开始准备工作:
      
      
  1. alter session set "_with_subquery"=materialize;
  2. exec DBMS_DST.BEGIN_PREPARE(14);

接着检查准备状态:
      
      
  1. SELECT PROPERTY_NAME, SUBSTR(property_value, 1, 30) value
  2. FROM DATABASE_PROPERTIES
  3. WHERE PROPERTY_NAME LIKE 'DST_%'
  4. ORDER BY PROPERTY_NAME;

一个典型的输出是:
      
      
  1. PROPERTY_NAME                  VALUE
  2. ------------------------------ ------------------------------
  3. DST_PRIMARY_TT_VERSION         4
  4. DST_SECONDARY_TT_VERSION       14
  5. DST_UPGRADE_STATE              PREPARE
  6. -- truncate logging tables if they exist.
  7. TRUNCATE TABLE SYS.DST$TRIGGER_TABLE;
  8. TRUNCATE TABLE sys.dst$affected_tables;
  9. TRUNCATE TABLE sys.dst$error_table;
  10. -- log affected data
  11. set serveroutput on
  12. BEGIN
  13. DBMS_DST.FIND_AFFECTED_TABLES
  14. (affected_tables => 'sys.dst$affected_tables',
  15. log_errors => TRUE,
  16. log_errors_table => 'sys.dst$error_table');
  17. END;
  18. /

下面的语句都不能有返回结果:
      
      
  1. SELECT * FROM sys.dst$affected_tables;
  2. SELECT * FROM sys.dst$error_table;
  3. SELECT * FROM sys.dst$error_table where ERROR_NUMBER= '1883';
  4. SELECT * FROM sys.dst$error_table where ERROR_NUMBER= '1878';
  5. SELECT * FROM sys.dst$error_table where ERROR_NUMBER not in ('1878','1883');
  6. -- end prepare window, the rows above will stay in those tables.
  7. EXEC DBMS_DST.END_PREPARE;
  8. -- check if this is ended
  9. SELECT PROPERTY_NAME, SUBSTR(property_value, 1, 30) value
  10. FROM DATABASE_PROPERTIES
  11. WHERE PROPERTY_NAME LIKE 'DST_%'
  12. ORDER BY PROPERTY_NAME;
  13. 一个典型的输出是:
  14. PROPERTY_NAME                  VALUE
  15. ------------------------------ ------------------------------
  16. DST_PRIMARY_TT_VERSION         4
  17. DST_SECONDARY_TT_VERSION       0
  18. DST_UPGRADE_STATE              NONE


2)真正开始升级Timezone
      
      
  1. conn / as sysdba
  2. shutdown immediate;
  3. startup upgrade;
  4. set serveroutput on
  5. purge dba_recyclebin;
  6. TRUNCATE TABLE SYS.DST$TRIGGER_TABLE;
  7. TRUNCATE TABLE sys.dst$affected_tables;
  8. TRUNCATE TABLE sys.dst$error_table;
  9. alter session set "_with_subquery"=materialize;
  10. EXEC DBMS_DST.BEGIN_UPGRADE(14);
  11. SELECT PROPERTY_NAME, SUBSTR(property_value, 1, 30) value
  12. FROM DATABASE_PROPERTIES
  13. WHERE PROPERTY_NAME LIKE 'DST_%'
  14. ORDER BY PROPERTY_NAME;

一个典型的输出是:
      
      
  1. PROPERTY_NAME                  VALUE
  2. ------------------------------ ------------------------------
  3. DST_PRIMARY_TT_VERSION         14
  4. DST_SECONDARY_TT_VERSION       4
  5. DST_UPGRADE_STATE              UPGRADE
  6. 下面这条语句应该没有返回结果:
  7. SELECT OWNER, TABLE_NAME, UPGRADE_IN_PROGRESS FROM ALL_TSTZ_TABLES where UPGRADE_IN_PROGRESS='YES';

重启数据库:
      
      
  1. shutdown immediate
  2. startup

升级相关的table:
a
      
      
  1. lter session set "_with_subquery"=materialize;
  2. set serveroutput on
  3. VAR numfail number
  4. BEGIN
  5. DBMS_DST.UPGRADE_DATABASE(:numfail,
  6. parallel => TRUE,
  7. log_errors => TRUE,
  8. log_errors_table => 'SYS.DST$ERROR_TABLE',
  9. log_triggers_table => 'SYS.DST$TRIGGER_TABLE',
  10. error_on_overlap_time => FALSE,
  11. error_on_nonexisting_time => FALSE);
  12. DBMS_OUTPUT.PUT_LINE('Failures:'|| :numfail);
  13. END;
  14. /

如果没有错误,则结束升级:
      
      
  1. VAR fail number
  2. BEGIN
  3. DBMS_DST.END_UPGRADE(:fail);
  4. DBMS_OUTPUT.PUT_LINE('Failures:'|| :fail);
  5. END;
  6. /
  7. 最后一次检查:
  8. SELECT PROPERTY_NAME, SUBSTR(property_value, 1, 30) value
  9. FROM DATABASE_PROPERTIES
  10. WHERE PROPERTY_NAME LIKE 'DST_%'
  11. ORDER BY PROPERTY_NAME;

典型输出是:
      
      
  1. PROPERTY_NAME                  VALUE
  2. ------------------------------ ------------------------------
  3. DST_PRIMARY_TT_VERSION         14
  4. DST_SECONDARY_TT_VERSION       0
  5. DST_UPGRADE_STATE              NONE
  6. SELECT * FROM v$timezone_file;
  7. FILENAME                VERSION
  8. -------------------- ----------
  9. timezlrg_14.dat              14