1. 程式人生 > >Oracle 10g R2升級到Oracle 11g R2

Oracle 10g R2升級到Oracle 11g R2

Oracle 10g R2升級到Oracle 11g R2

系統環境:

作業系統:RedHat EL55

Oracle 軟體: Oracle 10g R2、Oracle 11g R2

wKioL1N0bRizp1CvAAKqqZWQIy0593.jpg

Oracle 升級線路

本案例是從Oracle 10.2.0.4.0升級到Oracle 11.2.0.1.0

參考文件

Oracle patch CPU Update:

Oracle 10g 升級(10.2.0.1.0升級到10.2.0.4.0)之--CPU Update

Oracle patch PSU Update:

Oracle 10g升級之--PSU升級

一、升級前的準備工作

1、當前資料庫版本

[[email protected] ~]$ sqlplus '/as sysdba'

SQL*Plus: Release 10.2.0.4.0 - Production on Thu May 15 14:12:07 2014

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

並且資料庫做了PSU的升級,升級到10.2.0.4.4;按照Oracle 官方的升級線路圖,10.2.0.4.0可以直接升級到Oracle 11g R2.

2、安裝11gR2軟體

配置Oracle 環境變數:

[[email protected] ~]$ cat .bash_profile

# .bash_profile

# Get the aliases and functions

if [ -f ~/.bashrc ]; then

       . ~/.bashrc

fi

# User specific environment and startup programs

export TMP=/tmp

export TMPDIR=$TMP

export ORACLE_BASE=/u01/app/oracle

#export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1;

export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1;

export ORACLE_SID=prod

export ORACLE_TERM=xterm

export PATH=/usr/sbin:$PATH

export PATH=$ORACLE_HOME/bin:$PATH; export PATH

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib

export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib;

#alias sqlplus='rlwrap sqlplus'

#alias rman='rlwrap rman'

注意:將Oracle 11g R2安裝到不同的目錄下!

這裡需要注意的是:如果你想在11gr2上打上最新的PSUCPU,可以先在軟體級別上打上PSUCPU,這樣就不用跑兩次catbundle.sql,減少停機時間。

3、檢查安裝環境

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). 確保syssystem下沒有重複的物件:

select object_name, object_type from dba_objects where object_name||object_type in(select object_name||object_typefrom dba_objects where wner = 'SYS') and wner = 'SYSTEM';

上面這條語句只能返回以下4條記錄:

OBJECT_NAMEOBJECT_TYPE

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

DBMS_REPCAT_AUTHPACKAGE BODY

DBMS_REPCAT_AUTHPACKAGE

AQ$_SCHEDULES_PRIMARYINDEX

AQ$_SCHEDULESTABLE

如果有其它記錄返回,則必須根據下面這篇文件把重複記錄刪除:

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

4、升級前工作

Step1.

11gR2OracleHome下拷貝以下檔案至一個臨時資料夾:

$ORACLE_HOME/rdbms/admin/utlu112i.sql

Step2.

登陸資料庫(10個),執行:

$ sqlplus '/ as sysdba'

SQL> spool upgrade_info.log

SQL> @utlu112i.sql

SQL> spool off

生成的upgrade_info.log裡的內容很重要,後續步驟要根據該檔案的內容做相應的修改,因此一定要保留下來。

Step 3.

從下面這篇文件裡可以下載到指令碼dbupgdiag.sql:

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

執行這個指令碼:

cd <locationof the script>

$ sqlplus / assysdba

sql> altersession set nls_language='American';

sql>@dbupgdiag.sql

如果該指令碼報告有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的指令碼,以防萬一資料庫需要降級。和Step4一樣,本例是從10.2.0.4升級到11g的,因此不需要該步驟。

Step 6.

檢查Timezone版本,主要參考:

Actions For DSTUpdates When Upgrading To Or Applying The 11.2.0.2 Patchset [ID 1201253.1]

注意:11g的軟體裡已經自帶了版本1-14Timezone

先檢查一下當前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.

檢查國家字符集是否是UTF8AL16UTF16

selectvalue from NLS_DATABASE_PARAMETERS where parameter = 'NLS_NCHAR_CHARACTERSET';

如果是,則什麼都不用做;如果不是,那你就慘了,跟著下面長長的這篇文件一步一步做吧:

The NationalCharacter Set ( NLS_NCHAR_CHARACTERSET ) in Oracle 9i, 10g and 11g [ID276914.1]

Step 8.

收集統計資訊,以減少停機時間:

$ sqlplus "/as sysdba"

SQL> EXEC DBMS_STATS.GATHER_DICTIONARY_STATS;

Step 9.

如果你有開啟Vault,那麼你需要先在11gR2軟體下禁用Vault,等升級結束後,再啟用Vault,否則會在升級過程中報錯。

Step 10.

備份EnterpriseManager 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%';

如果有返回結果,則在升級之前,要保證StandbyPrimary是處於同步的狀態。

Step 18.

禁用所有的batchcronjobs

Step 19.

確保使用者SYSSYSTEM的預設表空間都是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> SELECTowner,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';

如果有,則在升級之後記得要做Step34

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.

10gpfile為模板,並根據Step2生成的upgrade_info.log裡的建議,為11g建立一個新的pfile

Step 26.

如果資料庫原本是執行在archive模式下,最好先改為noarchive,這樣可以減少升級停機時間,升級成功後再重新改回archive模式

二、開始升級

升級方式可以採用dbua圖形方式或sqlplus 命令列方式,本案例採用DBUA。

以Oracle 11g的安裝環境,Oracle使用者執行dbua:

wKioL1N0ceTSvTqFAAMPw7wFaKQ764.jpg

升級提示

wKiom1N0civRNpiIAAKFlf_aRUQ311.jpg

選擇要升級的庫

wKioL1N0cjGTPhbJAARrWWOvWAc392.jpg

按照提示完成前期準備工作

[[email protected] ~]$ !sql

sqlplus '/as sysdba'

SQL*Plus: Release 10.2.0.4.0 - Production on Thu May 15 14:25:00 2014

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> select status from v$instance;

STATUS

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

OPEN MIGRATE

SQL> purge dba_recyclebin;

DBA Recyclebin purged.

SQL>

wKioL1N0csHTb6dcAAM2CVpRv8A032.jpg

關閉歸檔模式,加快升級速度

wKiom1N0cxXRsoQXAANxpYU6kyg134.jpg

升級過程是否遷移資料檔案位置

wKioL1N0cxCgwYbAAAPt_GvLQ0o686.jpg

11g後,建立的diagnostic 目錄,集中存放trace和alert log

wKiom1N0c2WCYjTlAASGs-WtPME715.jpg

upgrade summary

wKioL1N0c1OC71oaAAT4TfeO30E835.jpg

提示:在升級過程要啟動listener

wKiom1N0c5rjdEtyAAOp9V40HPA658.jpg

升級安裝

三、升級後的工作

1、修改listener.ora,使listener執行新的